diff --git a/README.md b/README.md index a4eb3e6..2372892 100644 --- a/README.md +++ b/README.md @@ -474,7 +474,7 @@ chsrc set rust | cargo | crate chsrc set rustup chsrc set go -chsrc set java | maven | mvn | gradle +chsrc set java | maven | mvn | maven-daemon | mvnd | gradle chsrc set clojure | clojars chsrc set dart | pub chsrc set flutter @@ -595,4 +595,4 @@ chsrc set conda | anaconda [@Efterklang]: https://github.com/Efterklang [@wickdynex]: https://github.com/wickdynex [@YU-7]: https://github.com/YU-7 -[@sanchuanhehe]: https://github.com/sanchuanhehe +[@sanchuanhehe]: https://github.com/sanchuanhehe \ No newline at end of file diff --git a/lib/xy.h b/lib/xy.h index 391ab1b..7bfcb61 100644 --- a/lib/xy.h +++ b/lib/xy.h @@ -770,7 +770,7 @@ _xy_log_brkt (int level, const char *prompt1, const char *prompt2, const char *c * 由于目标行会被返回出来,所以 `func` 并不执行目标行,只会执行遍历过的行 */ static char * -xy_run_iter_lines (const char *cmd, unsigned long n, void (*func) (const char *)) +xy_run_iter_lines (const char *cmd, unsigned long n, bool (*func) (const char *)) { const int size = 512; char *buf = (char *) malloc (size); @@ -796,7 +796,10 @@ xy_run_iter_lines (const char *cmd, unsigned long n, void (*func) (const char break; if (func) { - func (buf); + if (func (buf)) { + pclose (stream); + return ret; + } } } @@ -1497,7 +1500,6 @@ xy_map_get (XyMap_t *map, const char *key) return NULL; } - /** * @flavor Ruby: Hash#each */ @@ -1521,5 +1523,4 @@ xy_map_each ( } } - -#endif +#endif \ No newline at end of file diff --git a/src/framework/core.c b/src/framework/core.c index 867fcb5..34ae184 100644 --- a/src/framework/core.c +++ b/src/framework/core.c @@ -127,12 +127,14 @@ struct /* 此时 chsrc_run() 不再是recipe中指定要运行的一个外部命令,而是作为一个功能实现的支撑 */ bool chsrc_run_faas; + char *user_agent; } ProgStatus = { .leader_selected_index = -1, .chgtype = ChgType_Auto, - .chsrc_run_faas = false + .chsrc_run_faas = false, + .user_agent = "chsrc/" Chsrc_Version, }; @@ -642,15 +644,13 @@ measure_speed_for_url (void *url) /** * @note 我们用 —L,因为部分链接会跳转到其他地方,比如: RubyChina, npmmirror */ - char *curl_cmd = xy_strcat (8, "curl -qsL ", ipv6, - " -o ", os_devnull, - " -w \"%{http_code} %{speed_download}\" -m", time_sec, - " -A chsrc/" Chsrc_Version " ", url); - - // chsrc_info (xy_2strcat ("测速命令 ", curl_cmd)); + char *curl_cmd = xy_strcat (10, "curl -qsL ", ipv6, + " -o ", os_devnull, + " -w \"%{http_code} %{speed_download}\" -m", time_sec, + " -A ", ProgStatus.user_agent, " ", url); + // chsrc_note2 (xy_2strcat ("测速命令 ", curl_cmd)); char *curl_buf = xy_run (curl_cmd, 0); - return curl_buf; } @@ -1111,7 +1111,11 @@ chsrc_determine_chgtype (ChgType_t type) ProgStatus.chgtype = chsrc_in_reset_mode() ? ChgType_Reset : type; } - +void +chsrc_custom_user_agent (char *user_agent) +{ + ProgStatus.user_agent = user_agent; +} #define MSG_EN_PUBLIC_URL "If the URL you specify is a public service, you are invited to contribute: chsrc issue" #define MSG_CN_PUBLIC_URL "若您指定的URL为公有服务,邀您参与贡献: chsrc issue" @@ -1845,4 +1849,4 @@ chsrc_get_cpucore () #endif return cores; -} +} \ No newline at end of file diff --git a/src/framework/mirror.c b/src/framework/mirror.c index a2db405..5d33f24 100644 --- a/src/framework/mirror.c +++ b/src/framework/mirror.c @@ -260,6 +260,13 @@ Huawei = {NotSkip, NA, NA, "https://mirrors.huaweicloud.com/ubuntu-releases" Big_File_ubuntu, ROUGH} }, +HuaweiCdn = +{ + IS_GeneralMirrorSite, + "huaweiCdn", "Huawei Cloud", "华为开源镜像站", "https://repo.huaweicloud.com/", + {NotSkip, NA, NA, "https://repo.huaweicloud.com/ubuntu-releases" Big_File_ubuntu, ROUGH} +}, + Volcengine = { IS_GeneralMirrorSite, @@ -294,4 +301,4 @@ Sohu = IS_GeneralMirrorSite, "sohu", "SOHU", "搜狐开源镜像站", "https://mirrors.sohu.com/", {NotSkip, NA, NA, "https://mirrors.sohu.com/deepin-cd" Big_File_deepin, ROUGH} -}; +}; \ No newline at end of file diff --git a/src/recipe/lang/Java.c b/src/recipe/lang/Java.c index 47435be..05216b0 100644 --- a/src/recipe/lang/Java.c +++ b/src/recipe/lang/Java.c @@ -2,7 +2,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later * ------------------------------------------------------------*/ -def_target(pl_java, "java/maven/mvn/gradle"); +def_target(pl_java, "java/maven/mvn/maven-daemon/mvnd/gradle"); void pl_java_prelude () @@ -20,65 +20,118 @@ pl_java_prelude () chef_allow_local_mode (this, CanNot, NULL, NULL); chef_forbid_english(this); chef_allow_user_define(this); + chsrc_custom_user_agent("Maven/3.9.11"); def_sources_begin() - {&UpstreamProvider, "https://repo1.maven.org/maven2/", DelegateToUpstream}, - {&Ali, "https://maven.aliyun.com/repository/public/", DelegateToMirror}, - {&Huawei, "https://mirrors.huaweicloud.com/repository/maven/", DelegateToMirror}, - + {&UpstreamProvider, "https://repo1.maven.org/maven2/", DelegateToUpstream}, + {&Ali, "https://maven.aliyun.com/repository/public/", "https://maven.aliyun.com/repository/public/com/tencentcloudapi/tencentcloud-sdk-java/3.1.1033/tencentcloud-sdk-java-3.1.1033-javadoc.jar"}, + {&Huawei, "https://mirrors.huaweicloud.com/repository/maven/", "https://mirrors.huaweicloud.com/repository/maven/com/tencentcloudapi/tencentcloud-sdk-java/3.1.1033/tencentcloud-sdk-java-3.1.1033-javadoc.jar"}, + {&HuaweiCdn, "https://repo.huaweicloud.com/repository/maven/", "https://repo.huaweicloud.com/repository/maven/com/tencentcloudapi/tencentcloud-sdk-java/3.1.1033/tencentcloud-sdk-java-3.1.1033-javadoc.jar"}, + {&Tencent, "https://mirrors.cloud.tencent.com/nexus/repository/maven-public/", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public/com/tencentcloudapi/tencentcloud-sdk-java/3.1.1033/tencentcloud-sdk-java-3.1.1033-javadoc.jar"}, // 网易的24小时更新一次 - {&Netease, "http://mirrors.163.com/maven/repository/maven-public/", DelegateToMirror} + {&Netease, "http://mirrors.163.com/maven/repository/maven-public/", "https://mirrors.163.com/maven/repository/maven-public/com/tencentcloudapi/tencentcloud-sdk-java/3.1.1033/tencentcloud-sdk-java-3.1.1033-javadoc.jar"} def_sources_end() } void -pl_java_check_cmd (bool *maven_exist, bool *gradle_exist) +pl_java_check_cmd (bool *maven_exist, bool *gradle_exist, bool *maven_daemon_exist) { *maven_exist = chsrc_check_program ("mvn"); *gradle_exist = chsrc_check_program ("gradle"); + *maven_daemon_exist = chsrc_check_program ("mvnd"); - if (! *maven_exist && ! *gradle_exist) + if (! *maven_exist && ! *gradle_exist && ! *maven_daemon_exist) { - chsrc_error ("maven 与 gradle 命令均未找到,请检查是否存在其一"); + chsrc_error ("maven(maven-daemon) 与 gradle 命令均未找到,请检查是否存在其一"); exit (Exit_UserCause); } } +bool +pl_java_is_home (const char *str) +{ + return (xy_str_start_with (str, "Maven home:")); +} + +bool +pl_java_find_maven_home (const char *line) +{ + if(pl_java_is_home(line)) + { + return true; + } + return false; +} char * pl_java_find_maven_config () { - char *buf = xy_run ("mvn -v", 2); - char *maven_home = xy_str_delete_prefix (buf, "Maven home: "); - maven_home = xy_str_strip (maven_home); + char *output; + int status = xy_run_capture ("mvn -v", &output); + if (0==status) + { + char *maven_home_line = xy_run_iter_lines ("mvn -v", 0, pl_java_find_maven_home); + char *maven_home = xy_str_delete_prefix (maven_home_line, "Maven home: "); + char *maven_config = xy_normalize_path (xy_2strcat (maven_home, "/conf/settings.xml")); + return maven_config; + } + else + { + printf("no find maven home\n"); + } + return "~/.m2/settings.xml"; +} - char *maven_config = xy_normalize_path (xy_2strcat (maven_home, "/conf/settings.xml")); - return maven_config; +char * +pl_java_find_maven_daemon_config () +{ + char *output; + int status = xy_run_capture ("mvnd -v", &output); + if (0==status) + { + char *maven_home_line = xy_run_iter_lines ("mvnd -v", 0, pl_java_find_maven_home); + char *maven_home = xy_str_delete_prefix (maven_home_line, "Maven home: "); + char *maven_config = xy_normalize_path (xy_2strcat (maven_home, "/conf/settings.xml")); + return maven_config; + } + else + { + printf ("no find maven home\n"); + } + return "~/.m2/settings.xml"; } void pl_java_getsrc (char *option) { - bool maven_exist, gradle_exist; - pl_java_check_cmd (&maven_exist, &gradle_exist); - char *maven_config = pl_java_find_maven_config (); - chsrc_note2 (xy_2strcat ("请查看 ", maven_config)); + bool maven_exist, gradle_exist, maven_daemon_exist; + pl_java_check_cmd (&maven_exist, &gradle_exist, &maven_daemon_exist); + if (maven_exist) + { + char *maven_config = pl_java_find_maven_config (); + chsrc_note2 (xy_2strcat ("请查看 ", maven_config)); + } + if(maven_daemon_exist) + { + char *maven_config = pl_java_find_maven_daemon_config (); + chsrc_note2 (xy_2strcat ("请查看 ", maven_config)); + } } + /** * @consult https://developer.aliyun.com/mirror/maven */ void pl_java_setsrc (char *option) { - bool maven_exist, gradle_exist; - pl_java_check_cmd (&maven_exist, &gradle_exist); - - chsrc_use_this_source (pl_java); + bool maven_exist, gradle_exist, maven_daemon_exist; + pl_java_check_cmd (&maven_exist, &gradle_exist, &maven_daemon_exist); + chsrc_use_this_source(pl_java); if (maven_exist) { char *file = xy_str_gsub (RAWSTR_pl_java_maven_config, "@1@", source.mirror->code); @@ -89,6 +142,16 @@ pl_java_setsrc (char *option) println (file); } + if (maven_daemon_exist) + { + char *file = xy_str_gsub (RAWSTR_pl_java_maven_config, "@1@", source.mirror->code); + file = xy_str_gsub (file, "@name@", source.mirror->name); + file = xy_str_gsub (file, "@url@", source.url); + char *maven_config = pl_java_find_maven_daemon_config (); + chsrc_note2 (xy_strcat (3, "请在 maven 配置文件 ", maven_config, " 中添加:")); + println (file); + } + if (gradle_exist) { if (maven_exist) br(); @@ -105,4 +168,4 @@ void pl_java_resetsrc (char *option) { pl_java_setsrc (option); -} +} \ No newline at end of file diff --git a/src/recipe/lang/Ruby/Ruby.c b/src/recipe/lang/Ruby/Ruby.c index 9fe7a11..5f23bff 100644 --- a/src/recipe/lang/Ruby/Ruby.c +++ b/src/recipe/lang/Ruby/Ruby.c @@ -50,7 +50,7 @@ pl_ruby_getsrc (char *option) chsrc_run ("bundle config get mirror.https://rubygems.org", RunOpt_Default); } -void +bool pl_ruby_remove_gem_source (const char *source) { char *cmd = NULL; @@ -59,6 +59,7 @@ pl_ruby_remove_gem_source (const char *source) cmd = xy_2strcat ("gem sources -r ", source); chsrc_run (cmd, RunOpt_Default); } + return false; } /** @@ -103,4 +104,4 @@ void pl_ruby_resetsrc (char *option) { pl_ruby_setsrc (option); -} +} \ No newline at end of file diff --git a/src/recipe/menu.c b/src/recipe/menu.c index e16433b..403adac 100644 --- a/src/recipe/menu.c +++ b/src/recipe/menu.c @@ -222,4 +222,4 @@ chsrc_available_mirrors[] = { /* ------------------------ chsrc 内部实现 ------------------------ */ /* 不要列出 &UpstreamProvider 和 &UserDefinedProvider */ -}; +}; \ No newline at end of file