22import sys
33from pathlib import Path
44
5- def extract_versions ():
6- """从 libs.versions.toml 文件中提取 Kotlin 版本号和项目版本号"""
5+
6+ def extract_version_config ():
7+ """从 libs.versions.toml 文件中提取 README 同步所需的配置"""
78 try :
8- # 1. 读取 libs.versions.toml
99 versions_toml_path = Path ("gradle/libs.versions.toml" )
1010 if not versions_toml_path .exists ():
1111 raise FileNotFoundError (f"版本文件不存在: { versions_toml_path } " )
1212
1313 versions_toml = versions_toml_path .read_text (encoding = "utf-8" )
1414
15- # 提取 Kotlin 版本号
16- kotlin_version_match = re .search (r'kotlin\s*=\s*"([\d\.]+)"' , versions_toml )
17- kotlin_version = kotlin_version_match .group (1 ) if kotlin_version_match else None
18-
19- if not kotlin_version :
20- raise ValueError ("无法从 libs.versions.toml 中提取 Kotlin 版本号" )
21-
22- # 提取项目版本号
23- project_version_match = re .search (r'project\s*=\s*"([\d\.]+)"' , versions_toml )
24- project_version = project_version_match .group (1 ) if project_version_match else None
25-
26- if not project_version :
27- raise ValueError ("无法从 libs.versions.toml 中提取项目版本号" )
28-
29- return kotlin_version , project_version
15+ def extract_string (key : str ) -> str :
16+ match = re .search (
17+ rf'(?m)^\s*{ re .escape (key )} \s*=\s*"([^"\r\n]+)"\s*$' ,
18+ versions_toml ,
19+ )
20+ if not match :
21+ raise ValueError (f"无法从 libs.versions.toml 中提取 { key } 配置" )
22+ return match .group (1 )
23+
24+ return {
25+ "kotlin_version" : extract_string ("kotlin" ),
26+ "project_version" : extract_string ("project" ),
27+ "project_group" : extract_string ("group" ),
28+ }
3029
3130 except Exception as e :
32- print (f"错误: 提取版本号失败 - { e } " , file = sys .stderr )
31+ print (f"错误: 提取版本配置失败 - { e } " , file = sys .stderr )
3332 sys .exit (1 )
3433
35- def update_readme_version (readme_path_str : str , kotlin_version : str , project_version : str ):
34+
35+ def update_readme_version (
36+ readme_path_str : str ,
37+ kotlin_version : str ,
38+ project_version : str ,
39+ project_group : str ,
40+ ):
3641 """更新 README 文件中的版本号"""
3742 try :
3843 readme_path = Path (readme_path_str )
@@ -43,30 +48,51 @@ def update_readme_version(readme_path_str: str, kotlin_version: str, project_ver
4348 original_content = readme_path .read_text (encoding = "utf-8" )
4449 updated_content = original_content
4550
46- # 替换 Kotlin 版本徽章
47- kotlin_pattern = r'(Kotlin-)[\d\.]+(-[A-F0-9]+?\?logo=kotlin)'
51+ kotlin_pattern = r'(Kotlin-)([^?\r\n]+)(-[A-Za-z0-9]+(?:\?logo=kotlin\b[^)]*))'
4852 kotlin_replacement = rf'\g<1>{ kotlin_version } \g<2>'
49- updated_content = re .sub (kotlin_pattern , kotlin_replacement , updated_content )
50-
51- # 替换 implementation 代码块里的版本号(支持多个data-saver库)
52- # 替换 data-saver-core 版本号
53- core_pattern = r'(implementation\s+"io\.github\.FunnySaltyFish:data-saver-core:).+?(")'
54- core_replacement = rf'\g<1>{ project_version } \g<2>'
55- updated_content = re .sub (core_pattern , core_replacement , updated_content )
56-
57- # 替换其他data-saver库的版本号
58- other_pattern = r'(implementation\s+"io\.github\.FunnySaltyFish:data-saver-[^:]+:).+?(")'
59- other_replacement = rf'\g<1>{ project_version } \g<2>'
60- updated_content = re .sub (other_pattern , other_replacement , updated_content )
61-
62- # 检查是否有变化
53+ updated_content , kotlin_badge_count = re .subn (
54+ kotlin_pattern ,
55+ kotlin_replacement ,
56+ updated_content ,
57+ )
58+
59+ dependency_pattern = re .compile (
60+ r'((?:implementation|api)\s*\(?\s*["\'])'
61+ r'((?:io\.github\.funnysaltyfish)|(?:com\.github\.funnysaltyfish))'
62+ r':'
63+ r'(data-saver(?:-[^:"\'\s\)]+)?)'
64+ r':'
65+ r'([^"\')\s]+)'
66+ r'(["\']\s*\)?)' ,
67+ flags = re .IGNORECASE ,
68+ )
69+
70+ def replace_dependency (match : re .Match [str ]) -> str :
71+ return (
72+ f"{ match .group (1 )} "
73+ f"{ project_group } :{ match .group (3 )} :{ project_version } "
74+ f"{ match .group (5 )} "
75+ )
76+
77+ updated_content , dependency_count = dependency_pattern .subn (
78+ replace_dependency ,
79+ updated_content ,
80+ )
81+
6382 if original_content == updated_content :
83+ if dependency_count == 0 :
84+ print (f"⚠️ { readme_path_str } 未识别到可更新的 data-saver 依赖" )
85+ elif kotlin_badge_count == 0 :
86+ print (f"ℹ️ { readme_path_str } 未找到 Kotlin 版本徽章,已跳过" )
6487 print (f"ℹ️ { readme_path_str } 无需更新" )
6588 return False
66- else :
67- readme_path .write_text (updated_content , encoding = "utf-8" )
68- print (f"✅ { readme_path_str } 更新完成" )
69- return True
89+
90+ readme_path .write_text (updated_content , encoding = "utf-8" )
91+ print (
92+ f"✅ { readme_path_str } 更新完成"
93+ f" (依赖 { dependency_count } 处, Kotlin 徽章 { kotlin_badge_count } 处)"
94+ )
95+ return True
7096
7197 except Exception as e :
7298 print (f"错误: 更新 { readme_path_str } 失败 - { e } " , file = sys .stderr )
@@ -76,15 +102,14 @@ def main():
76102 """主函数"""
77103 print ("🚀 开始更新 README 版本号..." )
78104
79- # 提取版本号
80- kotlin_version , project_version = extract_versions ( )
81- print (f"📝 Kotlin 版本号 : { kotlin_version } " )
82- print (f"📝 项目版本号 : { project_version } " )
105+ version_config = extract_version_config ()
106+ print ( f"📝 Kotlin 版本号: { version_config [ 'kotlin_version' ] } " )
107+ print (f"📝 项目版本号 : { version_config [ 'project_version' ] } " )
108+ print (f"📝 项目 Group Id : { version_config [ 'project_group' ] } " )
83109
84- # 更新 README 文件
85110 updated_files = []
86111 for readme_path in ("README.md" , "README_en.md" ):
87- if update_readme_version (readme_path , kotlin_version , project_version ):
112+ if update_readme_version (readme_path , ** version_config ):
88113 updated_files .append (readme_path )
89114
90115 if updated_files :
0 commit comments