diff --git a/src/chsrc-main.c b/src/chsrc-main.c index 50280d5..d9a266c 100644 --- a/src/chsrc-main.c +++ b/src/chsrc-main.c @@ -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")); diff --git a/src/framework/core.c b/src/framework/core.c index 43f53be..40166f5 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -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 () diff --git a/src/framework/struct.h b/src/framework/struct.h index b99332b..650dbce 100644 --- a/src/framework/struct.h +++ b/src/framework/struct.h @@ -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; /* 默认作用域 */