11from __future__ import annotations
22
3+ import glob
34from pathlib import Path
45
56import tomlkit
@@ -22,8 +23,10 @@ def lock_file(self) -> Path:
2223 return Path () / self .lock_filename
2324
2425 def get (self , document : tomlkit .TOMLDocument ) -> str :
26+ # If there is a root package, change its version (but not the workspace version)
2527 try :
2628 return document ["package" ]["version" ] # type: ignore[index,return-value]
29+ # Else, bump the workspace version
2730 except tomlkit .exceptions .NonExistentKey :
2831 ...
2932 return document ["workspace" ]["package" ]["version" ] # type: ignore[index,return-value]
@@ -43,15 +46,39 @@ def set_version(self, version: str) -> None:
4346
4447 def set_lock_version (self , version : str ) -> None :
4548 cargo_toml_content = tomlkit .parse (self .file .read_text ())
49+ cargo_lock_content = tomlkit .parse (self .lock_file .read_text ())
50+ packages : tomlkit .items .AoT = cargo_lock_content ["package" ] # type: ignore[assignment]
4651 try :
4752 package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
53+ for i , package in enumerate (packages ):
54+ if package ["name" ] == package_name :
55+ cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
56+ break
4857 except tomlkit .exceptions .NonExistentKey :
49- package_name = cargo_toml_content ["workspace" ]["package" ]["name" ] # type: ignore[index]
58+ workspace_members = (
59+ cargo_toml_content .get ("workspace" , {})
60+ .get ("package" , {})
61+ .get ("members" , [])
62+ )
63+ members_inheriting = []
64+
65+ for member in workspace_members :
66+ matched_paths = glob .glob (member , recursive = True )
67+ for path in matched_paths :
68+ cargo_file = Path (path ) / "Cargo.toml"
69+ cargo_toml_content = tomlkit .parse (cargo_file .read_text ())
70+ try :
71+ version_workspace = cargo_toml_content ["package" ]["version" ][ # type: ignore[index]
72+ "workspace"
73+ ]
74+ if version_workspace is True :
75+ package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
76+ members_inheriting .append (package_name )
77+ except tomlkit .exceptions .NonExistentKey :
78+ continue
79+
80+ for i , package in enumerate (packages ):
81+ if package ["name" ] in members_inheriting :
82+ cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
5083
51- cargo_lock_content = tomlkit .parse (self .lock_file .read_text ())
52- packages : tomlkit .items .AoT = cargo_lock_content ["package" ] # type: ignore[assignment]
53- for i , package in enumerate (packages ):
54- if package ["name" ] == package_name :
55- cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
56- break
5784 self .lock_file .write_text (tomlkit .dumps (cargo_lock_content ))
0 commit comments