引入 ImplementationDefinedScope

This commit is contained in:
Aoran Zeng
2026-02-24 16:12:58 +08:00
parent cac80d1e37
commit 2be4dce1ea
5 changed files with 42 additions and 18 deletions

View File

@@ -317,31 +317,37 @@ cli_print_target_features (Target_t *target, const char *input_target_name)
else if (i == 1)
{
scope_name = CHINESE ? " 用户级换源" : " user scope";
scope_msg = xy_strcat (3, scope_name, " | chsrc set -scope=user ", input_target_name);
scope_msg = xy_strcat (3, scope_name, " | chsrc set -scope=user ", input_target_name);
}
else if (i == 2)
{
scope_name = CHINESE ? " 系统级换源" : " system scope";
scope_msg = xy_strcat (3, scope_name, " | chsrc set -scope=system ", input_target_name);
scope_msg = xy_strcat (3, scope_name, " | chsrc set -scope=system ", input_target_name);
}
else
{
xy_unreached();
}
char *msg = NULL;
switch (cap)
{
case ScopeCap_Unknown:
printf (" %s%s (%s)\n", bdred(NoMark), purple(scope_msg), "是否支持该作用域尚不了解,欢迎贡献");
msg = xy_strcat (6, " ", bdred(NoMark), scope_msg, " (", "是否支持该作用域尚不了解,欢迎贡献", ")");
puts (msg);
break;
case ScopeCap_Unable:
printf (" %s%s (%s)\n", bdred(NoMark), purple(scope_msg), "不支持");
msg = xy_strcat (6, " ", bdred(NoMark), scope_msg, " (", "不支持", ")");
puts (msg);
break;
case ScopeCap_Able_But_Not_Implemented:
printf (" %s%s (%s)\n", bdyellow(HalfYesMark), purple(scope_msg), "支持但未实现");
msg = xy_strcat (6, " ", bdyellow(HalfYesMark), scope_msg, " (", "支持但未实现", ")");
puts (msg);
break;
case ScopeCap_Able_And_Implemented:
printf (" %s%s (%s)\n", bdgreen(YesMark), purple(scope_msg), "支持且已实现");
msg = xy_strcat (3, " ", bdgreen(YesMark),
purple (xy_strcat (4, scope_msg, " (", "支持且已实现", ")")));
puts (msg);
break;
default:
xy_unreached();
@@ -360,11 +366,15 @@ cli_print_target_features (Target_t *target, const char *input_target_name)
case SystemScope:
default_scope_name = CHINESE ? "系统级" : "System Scope";
break;
case ImplementationDefinedScope:
default_scope_name = CHINESE ? "由实现定义" : "Implementation Defined Scope";
break;
default:
xy_unreached();
}
print (bdblue (" = "));
printf ("默认作用域 | chsrc set -scope=default %s (= %s)\n", input_target_name, default_scope_name);
char *msg = xy_strcat (3, bdblue (" = "),
purple (xy_strcat (5, "默认作用域 | chsrc set -scope=default ", input_target_name, " (= ", default_scope_name ,")")));
puts (msg);
br();
}
@@ -823,7 +833,7 @@ main (int argc, char const *argv[])
}
else if (xy_streql_ic (scope, "default"))
{
ProgMode.Scope = DefaultScope;
ProgMode.Scope = ImplementationDefinedScope;
}
else
{

View File

@@ -332,6 +332,15 @@ chef_set_default_scope (Target_t *target, Scope_t scope)
cap = target->scope_caps[ScopeCap_Slot_User];
else if (scope == SystemScope)
cap = target->scope_caps[ScopeCap_Slot_System];
else if (scope == ImplementationDefinedScope)
{
/* ImplementationDefinedScope 即由 chsrc 根据实际情况来决定,因此我们不对它检查 */
return;
}
else
{
chsrc_panic ("无效的 scope 参数");
}
/* 防止 chef 们写错 */
if (cap != ScopeCap_Able_And_Implemented)

View File

@@ -11,7 +11,7 @@
* | @Mikachu2333
* |
* Created On : <2023-08-29>
* Last Modified : <2026-02-22>
* Last Modified : <2026-02-24>
*
* chsrc framework
* ------------------------------------------------------------*/
@@ -57,7 +57,7 @@ ProgMode =
.ResetMode = false,
.TargetGroupMode = false,
.Ipv6Mode = false,
.Scope = DefaultScope,
.Scope = ImplementationDefinedScope,
.EnglishMode = false,
.DryRunMode = false,
.NoColorMode = false
@@ -70,7 +70,8 @@ bool chsrc_in_standalone_mode() {return !ProgMode.TargetGroupMode;}
void chsrc_set_target_group_mode(){ProgMode.TargetGroupMode = true;}
bool chsrc_in_reset_mode(){return ProgMode.ResetMode;}
bool chsrc_in_default_scope_mode(){return ProgMode.Scope == DefaultScope;}
/* 默认换源作用域就是 ImplementationDefinedScope */
bool chsrc_in_default_scope_mode(){return ProgMode.Scope == ImplementationDefinedScope;}
bool chsrc_in_user_scope_mode(){return ProgMode.Scope == UserScope;}
bool chsrc_in_project_scope_mode(){return ProgMode.Scope == ProjectScope;}
bool chsrc_in_system_scope_mode(){return ProgMode.Scope == SystemScope;}

View File

@@ -113,19 +113,23 @@ Source_t;
* 但是后来,我们认为非 -local 时的行为即默认时比较模糊所以我们现在清晰地把作用域指明出来总共有3种类型的作用
* 分别是 ProjectScope、UserScope 和 SystemScope分别对应项目级、用户级和系统级的换源配置
*
* 还有一个叫 DefaultScope 的作用域,它不是一种新类型,而表示默认作用域,即根据实际情况最佳的作用域。
* chsrc 将根据该 target 的实际情况来选择最合适的作用域来进行换源配置。最好的情况下,DefaultScope 是三者之一,
* 还有一个叫 ImplementationDefinedScope 的作用域,它不是一种新类型,而表示根据实际情况决定的作用域。
* chsrc 将根据该 target 的实际情况来选择最合适的作用域来进行换源配置。最好的情况下,ImplementationDefinedScope 是三者之一,
* 这也是这里设计的初衷。然而现在有些 recipe 的换源行为,会在某种 Scope 不能够成功时退而求其次地使用另一个 Scope
* 来进行换源配置,这时 DefaultScope 就无法用一种作用域单独描述
* 来进行换源配置,这时就只能用 ImplementationDefinedScope 来表示
*/
#define NumberOfScopeType 3
typedef enum Scope_t
{
DefaultScope, /* 默认作用域,即根据实际情况最佳的作用域,它不是一种类型,只类似一个占位符 */
ProjectScope,
UserScope,
SystemScope,
/**
* 这是 target 默认的作用域,一种特殊的作用域,即根据 target 的实际情况来决定的。
* 它不是一种真正的类型,因为最终换源后,用户看到的作用域依然是 ProjectScope、UserScope 或 SystemScope 中的一个
*/
ImplementationDefinedScope,
}
Scope_t;

View File

@@ -24,7 +24,7 @@ pl_java_prelude ()
* TODO: 当前实现将首先尝试 SystemScope, 若失败则尝试 UserScope
* 所以并不是真正意义上的某种 Scope而是两者的叠加后续考虑强制执行用户所选择的 Scope 以达到用户期待
*/
chef_set_default_scope (this, SystemScope);
chef_set_default_scope (this, ImplementationDefinedScope);
chef_deny_english(this);
chef_allow_user_define(this);