Skip to content

Commit 0ab1928

Browse files
committed
fix: cargo workspaces
1 parent 75a97e5 commit 0ab1928

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

commitizen/providers/cargo_provider.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import glob
34
from pathlib import Path
45

56
import 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))

tests/providers/test_cargo_provider.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import os
34
from pathlib import Path
45
from textwrap import dedent
56

@@ -23,13 +24,19 @@
2324

2425
CARGO_WORKSPACE_TOML = """\
2526
[workspace.package]
26-
name = "whatever"
27+
members = ["whatever"]
2728
version = "0.1.0"
2829
"""
2930

31+
CARGO_WORKSPACE_MEMBER_TOML = """\
32+
[package]
33+
name = "whatever"
34+
version.workspace = true
35+
"""
36+
3037
CARGO_WORKSPACE_TOML_EXPECTED = """\
3138
[workspace.package]
32-
name = "whatever"
39+
members = ["whatever"]
3340
version = "42.1"
3441
"""
3542

@@ -115,6 +122,11 @@ def test_cargo_provider_with_lock(
115122
file = chdir / filename
116123
file.write_text(dedent(toml_content))
117124

125+
member_folder = chdir / "whatever"
126+
os.mkdir(member_folder)
127+
member_file = member_folder / "Cargo.toml"
128+
member_file.write_text(dedent(CARGO_WORKSPACE_MEMBER_TOML))
129+
118130
lock_filename = CargoProvider.lock_filename
119131
lock_file = chdir / lock_filename
120132
lock_file.write_text(dedent(lock_content))

0 commit comments

Comments
 (0)