From e953aceb548f04e3e7ec4d7d98c120a1852b7842 Mon Sep 17 00:00:00 2001 From: Aoran Zeng Date: Fri, 11 Jul 2025 10:12:27 +0800 Subject: [PATCH] Refactor target group mode --- src/framework/core.c | 83 ++++++++++++++++++++----------- src/recipe/lang/Node.js/Node.js.c | 2 +- src/recipe/lang/Node.js/Yarn.c | 4 +- src/recipe/lang/Node.js/npm.c | 4 +- src/recipe/lang/Node.js/pnpm.c | 4 +- src/recipe/lang/Python/PDM.c | 4 +- src/recipe/lang/Python/Poetry.c | 4 +- src/recipe/lang/Python/Python.c | 2 +- src/recipe/lang/Python/pip.c | 4 +- 9 files changed, 69 insertions(+), 42 deletions(-) diff --git a/src/framework/core.c b/src/framework/core.c index e35b753..5da9a55 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -9,7 +9,7 @@ * | Yangmoooo * | * Created On : <2023-08-29> - * Last Modified : <2025-06-20> + * Last Modified : <2025-07-11> * * chsrc framework * ------------------------------------------------------------*/ @@ -30,11 +30,42 @@ static int chsrc_get_cpucore (); + +/** + * Target Group 模式 + * + * 1. 一个 target group 包含了多个 target,这些都被叫做 follower target + * 2. 触发该运行模式的 target 被称为 leader target,其往往只是一个virtual target,类似 APT 中的 virtual package + * + * 目前使用该模式的有两个: Python 和 Node.js,因为二者的包管理器存在多个 + */ +struct +{ + boolean in; + int leader_selected_index; /* leader target 选中的索引 */ +} +TargetGroupMode = +{ + .in = false, + .leader_selected_index = -1 +}; + +bool +chsrc_in_target_group_mode () +{ + return TargetGroupMode.in; +} + +void +chsrc_set_target_group_mode () +{ + TargetGroupMode.in = true; +} + + bool ProgMode_CMD_Measure = false; bool ProgMode_CMD_Reset = false; -bool ProgMode_Target_Group = false; -int ProgMode_Leader_Selected_Index = -1; /* 此时 chsrc_run() 不再是recipe中指定要运行的一个外部命令,而是作为一个功能实现的支撑 */ bool ProgMode_Run_as_a_Service = false; @@ -139,10 +170,8 @@ chsrc_log_backup (const char *filename) #define NoMark "x" #define HalfYesMark "⍻" -/** - * @translation Done - */ -void + +static void log_check_result (const char *check_what, const char *check_type, bool exist) { char *chk_msg = NULL; @@ -176,10 +205,7 @@ log_check_result (const char *check_what, const char *check_type, bool exist) } -/** - * @translation Done - */ -void +static void log_cmd_result (bool result, int exit_status) { char *run_msg = NULL; @@ -234,7 +260,6 @@ is_url (const char *str) * * @param prog_name 要检测的二进制程序名 * - * @translation Done */ bool query_program_exist (char *check_cmd, char *prog_name, int mode) @@ -798,26 +823,30 @@ is_reset_mode () /** - * 用户*只可能*通过下面5种方式来换源,无论哪一种都会返回一个 Source_t 出来 - * option: - * 1. 用户指定某个 Mirror Code - * 2. NULL: 用户什么都没指定 (将测速选择最快镜像) - * 3. 用户给了一个 URL - * 4. ChgType_Reset - * 选用了Leader target - * 5. ProgMode_Leader_Selected_Index 将给出所选索引 + * @brief 确定所换源的信息,存储在局部变量 @var:source 中 * - * @dependency 变量 option + * 用户*只可能*通过下面5种方式来换源,无论哪一种都会返回一个 Source_t 出来 + * + * 1. 用户指定了一个 Mirror Code,即 chsrc set + * 2. 用户指定了一个 URL, 即 chsrc set https://ur + * 3. 用户什么都没指定, 即 chsrc set + * 4. 用户正在重置源, 即 chsrc reset + * + * 如果处于 Target Group 模式下,leader target 可能会指定一个源,因此还有一种情况: + * + * 5. leader target 指定了某个源 + * + * @dependency 已存在的局部变量 @var:option */ #define chsrc_yield_for_the_source(for_what) \ - if (ProgMode_Target_Group==true && ProgMode_Leader_Selected_Index==-1) \ + if (chsrc_in_target_group_mode() && TargetGroupMode.leader_selected_index==-1) \ { \ - ProgMode_Leader_Selected_Index = use_specific_mirror_or_auto_select (option, for_what); \ - source = for_what##_sources[ProgMode_Leader_Selected_Index]; \ + TargetGroupMode.leader_selected_index = use_specific_mirror_or_auto_select (option, for_what); \ + source = for_what##_sources[TargetGroupMode.leader_selected_index]; \ } \ - else if (ProgMode_Target_Group==true && ProgMode_Leader_Selected_Index!=-1) \ + else if (chsrc_in_target_group_mode() && TargetGroupMode.leader_selected_index!=-1) \ { \ - source = for_what##_sources[ProgMode_Leader_Selected_Index]; \ + source = for_what##_sources[TargetGroupMode.leader_selected_index]; \ } \ else if (is_url (option)) \ { \ @@ -844,8 +873,6 @@ is_reset_mode () * * 1. 告知用户选择了什么源和镜像 * 2. 对选择的源和镜像站进行一定的校验 - * - * @translation Done */ #define chsrc_confirm_source confirm_source(&source) void diff --git a/src/recipe/lang/Node.js/Node.js.c b/src/recipe/lang/Node.js/Node.js.c index d9338d8..1474f26 100644 --- a/src/recipe/lang/Node.js/Node.js.c +++ b/src/recipe/lang/Node.js/Node.js.c @@ -74,7 +74,7 @@ pl_nodejs_setsrc (char *option) bool npm_exist, yarn_exist, pnpm_exist; pl_nodejs_check_cmd (&npm_exist, &yarn_exist, &pnpm_exist); - ProgMode_Target_Group = true; + chsrc_set_target_group_mode (); chsrc_yield_source_and_confirm (pl_nodejs); if (npm_exist) diff --git a/src/recipe/lang/Node.js/Yarn.c b/src/recipe/lang/Node.js/Yarn.c index 061d4bc..a162987 100644 --- a/src/recipe/lang/Node.js/Yarn.c +++ b/src/recipe/lang/Node.js/Yarn.c @@ -42,7 +42,7 @@ pl_nodejs_yarn_setsrc (char *option) { Source_t source; chsrc_yield_for_the_source (pl_nodejs); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *cmd = NULL; @@ -71,7 +71,7 @@ pl_nodejs_yarn_setsrc (char *option) chsrc_run (cmd, RunOpt_No_Last_New_Line); } - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source); diff --git a/src/recipe/lang/Node.js/npm.c b/src/recipe/lang/Node.js/npm.c index 92554f0..eba4314 100644 --- a/src/recipe/lang/Node.js/npm.c +++ b/src/recipe/lang/Node.js/npm.c @@ -28,7 +28,7 @@ pl_nodejs_npm_setsrc (char *option) { Source_t source; chsrc_yield_for_the_source (pl_nodejs); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *cmd = NULL; @@ -40,7 +40,7 @@ pl_nodejs_npm_setsrc (char *option) chsrc_run (cmd, RunOpt_No_Last_New_Line); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source); diff --git a/src/recipe/lang/Node.js/pnpm.c b/src/recipe/lang/Node.js/pnpm.c index 6f8e420..a241f04 100644 --- a/src/recipe/lang/Node.js/pnpm.c +++ b/src/recipe/lang/Node.js/pnpm.c @@ -29,7 +29,7 @@ pl_nodejs_pnpm_setsrc (char *option) { Source_t source; chsrc_yield_for_the_source (pl_nodejs); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *cmd = NULL; @@ -41,7 +41,7 @@ pl_nodejs_pnpm_setsrc (char *option) chsrc_run (cmd, RunOpt_No_Last_New_Line); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source); diff --git a/src/recipe/lang/Python/PDM.c b/src/recipe/lang/Python/PDM.c index 03def58..32deb2e 100644 --- a/src/recipe/lang/Python/PDM.c +++ b/src/recipe/lang/Python/PDM.c @@ -30,7 +30,7 @@ pl_python_pdm_setsrc (char *option) { Source_t source; chsrc_yield_for_the_source (pl_python); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *cmd = NULL; @@ -42,7 +42,7 @@ pl_python_pdm_setsrc (char *option) chsrc_run (cmd, RunOpt_No_Last_New_Line); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source); diff --git a/src/recipe/lang/Python/Poetry.c b/src/recipe/lang/Python/Poetry.c index e5fe417..c68d837 100644 --- a/src/recipe/lang/Python/Poetry.c +++ b/src/recipe/lang/Python/Poetry.c @@ -29,7 +29,7 @@ pl_python_poetry_setsrc (char *option) { Source_t source; chsrc_yield_for_the_source (pl_python); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *cmd = NULL; @@ -40,7 +40,7 @@ pl_python_poetry_setsrc (char *option) cmd = xy_2strjoin ("poetry source add my_mirror ", source.url); chsrc_run (cmd, RunOpt_No_Last_New_Line); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source); diff --git a/src/recipe/lang/Python/Python.c b/src/recipe/lang/Python/Python.c index afec8e8..b17608c 100644 --- a/src/recipe/lang/Python/Python.c +++ b/src/recipe/lang/Python/Python.c @@ -57,7 +57,7 @@ pl_python_setsrc (char *option) pl_python_check_unofficial_pkger (&poetry_exist, &pdm_exist, &uv_exist); - ProgMode_Target_Group = true; + chsrc_set_target_group_mode (); chsrc_yield_source_and_confirm (pl_python); diff --git a/src/recipe/lang/Python/pip.c b/src/recipe/lang/Python/pip.c index c197dae..089b424 100644 --- a/src/recipe/lang/Python/pip.c +++ b/src/recipe/lang/Python/pip.c @@ -40,7 +40,7 @@ pl_python_pip_setsrc (char *option) Source_t source; chsrc_yield_for_the_source (pl_python); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) chsrc_confirm_source; char *py_prog_name = NULL; @@ -52,7 +52,7 @@ pl_python_pip_setsrc (char *option) char *cmd = xy_2strjoin (py_prog_name, xy_2strjoin (" -m pip config --user set global.index-url ", source.url)); chsrc_run (cmd, RunOpt_No_Last_New_Line); - if (ProgMode_Target_Group!=true) + if (!chsrc_in_target_group_mode()) { chsrc_determine_chgtype (ChgType_Auto); chsrc_conclude (&source);