检查用户所要求的作用域是否能执行

This commit is contained in:
Aoran Zeng
2026-02-24 11:58:26 +08:00
parent 3e05bbb664
commit ecc3a1ad04
3 changed files with 63 additions and 4 deletions

View File

@@ -335,7 +335,7 @@ cli_print_target_features (Target_t *target, const char *input_target_name)
printf (" %s%s (%s)\n", bdred(NoMark), purple(scope_msg), "是否支持该作用域尚不了解,欢迎贡献");
break;
case ScopeCap_Unable:
printf (" %s%s (%s)\n", bdred(NoMark), purple(scope_msg), "不支持的作用域");
printf (" %s%s (%s)\n", bdred(NoMark), purple(scope_msg), "不支持");
break;
case ScopeCap_Able_But_Not_Implemented:
printf (" %s%s (%s)\n", bdyellow(HalfYesMark), purple(scope_msg), "支持但未实现");
@@ -666,6 +666,8 @@ get_target (const char *input, TargetOp code, char *option)
{
if (target->setfn)
{
/* Hook时机: 开始运行前可以在这里进行一些拦截操作 */
chsrc_check_scope_capability (target); /* 用户要求设置的作用域,真的能够执行吗? */
target->setfn(option);
}
else chsrc_error (xy_strcat (3, "暂未对 ", input, " 实现 set 功能,邀您帮助: chsrc issue"));

View File

@@ -1277,6 +1277,62 @@ chsrc_conclude (Source_t *source)
}
/**
* @brief 检测该 target 是否实现了用户所指定的 scope 能力
*
* @note 此函数目前只支持中文
*/
void
chsrc_check_scope_capability (Target_t *target)
{
ScopeCapability_t cap = ScopeCap_Unknown;
char *msg1 = "不支持";
char *msg2 = "换源,请使用 chsrc ls ";
char *msg3 = " 查看支持的作用域以及默认作用域";
char *aliases = target->aliases;
char *scope_name = NULL;
if (chsrc_in_project_scope_mode())
{
cap = target->scope_caps[ScopeCap_Slot_Project];
if (cap != ScopeCap_Able_And_Implemented)
{
scope_name = "项目级";
char* msg = xy_strcat (5, msg1, scope_name, msg2, aliases, msg3);
chsrc_error (msg);
exit (Exit_UserCause);
}
}
if (chsrc_in_user_scope_mode())
{
cap = target->scope_caps[ScopeCap_Slot_User];
if (cap != ScopeCap_Able_And_Implemented)
{
scope_name = "用户级";
char* msg = xy_strcat (5, msg1, scope_name, msg2, aliases, msg3);
chsrc_error (msg);
exit (Exit_UserCause);
}
}
if (chsrc_in_system_scope_mode())
{
cap = target->scope_caps[ScopeCap_Slot_System];
if (cap != ScopeCap_Able_And_Implemented)
{
scope_name = "系统级";
char* msg = xy_strcat (5, msg1, scope_name, msg2, aliases, msg3);
chsrc_error (msg);
exit (Exit_UserCause);
}
}
}
void
chsrc_ensure_root ()

View File

@@ -108,6 +108,9 @@ typedef enum Scope_t
Scope_t;
#define NumberOfScopeType 3
#define ScopeCap_Slot_Project 0
#define ScopeCap_Slot_User 1
#define ScopeCap_Slot_System 2
typedef enum ScopeCapability_t
{
@@ -166,9 +169,7 @@ typedef struct Target_t
/**
* 各作用域的支持情况
* 0: project scope
* 1: user scope
* 2: system scope
* 参考 ScopeCap_Slot_Xxx 的值
*/
ScopeCapability_t scope_caps[NumberOfScopeType];
Scope_t default_scope; /* 默认作用域 */