Skip to content

Commit 2d44b61

Browse files
authored
impl(sidekick): check version bumps (#2167)
1 parent 0d0c5ec commit 2d44b61

File tree

6 files changed

+162
-9
lines changed

6 files changed

+162
-9
lines changed

internal/sidekick/internal/rust_release/bump_versions.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@
1414

1515
package rustrelease
1616

17-
import "github.com/googleapis/librarian/internal/sidekick/internal/config"
17+
import (
18+
"log/slog"
19+
"slices"
20+
21+
"github.com/googleapis/librarian/internal/sidekick/internal/config"
22+
"github.com/googleapis/librarian/internal/sidekick/internal/external"
23+
)
1824

1925
// BumpVersions finds all the crates that need a version bump and performs the
2026
// bump, changing both the Cargo.toml and sidekick.toml files.
@@ -30,14 +36,30 @@ func BumpVersions(config *config.Release) error {
3036
if err != nil {
3137
return err
3238
}
33-
var packages []string
39+
var crates []string
3440
for _, manifest := range findCargoManifests(files) {
3541
names, err := updateManifest(config, lastTag, manifest)
3642
if err != nil {
3743
return err
3844
}
39-
packages = append(packages, names...)
45+
crates = append(crates, names...)
46+
}
47+
if tools, ok := config.Tools["cargo"]; ok {
48+
if !slices.ContainsFunc(tools, containsSemverChecks) {
49+
return nil
50+
}
51+
} else {
52+
return nil
53+
}
54+
for _, name := range crates {
55+
slog.Info("runnning cargo semver-checks", "crate", name)
56+
if err := external.Run(cargoExe(config), "semver-checks", "--all-features", "-p", name); err != nil {
57+
return err
58+
}
4059
}
41-
_ = packages
4260
return nil
4361
}
62+
63+
func containsSemverChecks(a config.Tool) bool {
64+
return a.Name == "cargo-semver-checks"
65+
}

internal/sidekick/internal/rust_release/bump_versions_test.go

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,76 @@ version = "1.0.0"
3737

3838
func TestBumpVersionsSuccess(t *testing.T) {
3939
requireCommand(t, "git")
40+
requireCommand(t, "/bin/echo")
4041
config := &config.Release{
4142
Remote: "origin",
4243
Branch: "main",
4344
Preinstalled: map[string]string{
4445
"git": "git",
45-
"cargo": "git",
46+
"cargo": "/bin/echo",
47+
},
48+
Tools: map[string][]config.Tool{
49+
"cargo": {
50+
{Name: "cargo-semver-checks", Version: "1.2.3"},
51+
},
52+
},
53+
}
54+
setupForVersionBump(t, "release-2001-02-03")
55+
name := path.Join("src", "storage", "src", "lib.rs")
56+
if err := os.WriteFile(name, []byte(newLibRsContents), 0644); err != nil {
57+
t.Fatal(err)
58+
}
59+
if err := external.Run("git", "commit", "-m", "feat: changed storage", "."); err != nil {
60+
t.Fatal(err)
61+
}
62+
if err := BumpVersions(config); err != nil {
63+
t.Fatal(err)
64+
}
65+
}
66+
67+
func TestBumpVersionsNoCargoTools(t *testing.T) {
68+
requireCommand(t, "git")
69+
requireCommand(t, "/bin/echo")
70+
config := &config.Release{
71+
Remote: "origin",
72+
Branch: "main",
73+
Preinstalled: map[string]string{
74+
"git": "git",
75+
"cargo": "/bin/echo",
76+
},
77+
Tools: map[string][]config.Tool{
78+
"not-cargo": {
79+
{Name: "semver-checks", Version: "1.2.3"},
80+
},
81+
},
82+
}
83+
setupForVersionBump(t, "release-2001-02-03")
84+
name := path.Join("src", "storage", "src", "lib.rs")
85+
if err := os.WriteFile(name, []byte(newLibRsContents), 0644); err != nil {
86+
t.Fatal(err)
87+
}
88+
if err := external.Run("git", "commit", "-m", "feat: changed storage", "."); err != nil {
89+
t.Fatal(err)
90+
}
91+
if err := BumpVersions(config); err != nil {
92+
t.Fatal(err)
93+
}
94+
}
95+
96+
func TestBumpVersionsNoSemverChecks(t *testing.T) {
97+
requireCommand(t, "git")
98+
requireCommand(t, "/bin/echo")
99+
config := &config.Release{
100+
Remote: "origin",
101+
Branch: "main",
102+
Preinstalled: map[string]string{
103+
"git": "git",
104+
"cargo": "/bin/echo",
105+
},
106+
Tools: map[string][]config.Tool{
107+
"cargo": {
108+
{Name: "some-other-tool", Version: "1.2.3"},
109+
},
46110
},
47111
}
48112
setupForVersionBump(t, "release-2001-02-03")

internal/sidekick/internal/rust_release/preflight.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package rustrelease
1616

1717
import (
18+
"fmt"
19+
1820
"github.com/googleapis/librarian/internal/sidekick/internal/config"
1921
"github.com/googleapis/librarian/internal/sidekick/internal/external"
2022
)
@@ -30,6 +32,16 @@ func PreFlight(config *config.Release) error {
3032
if err := external.Run(gitExe(config), "remote", "get-url", config.Remote); err != nil {
3133
return err
3234
}
35+
tools, ok := config.Tools["cargo"]
36+
if !ok {
37+
return nil
38+
}
39+
for _, tool := range tools {
40+
spec := fmt.Sprintf("%s@%s", tool.Name, tool.Version)
41+
if err := external.Run(cargoExe(config), "install", "--locked", spec); err != nil {
42+
return err
43+
}
44+
}
3345
return nil
3446
}
3547

internal/sidekick/internal/rust_release/preflight_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,54 @@ func TestPreflightMissingUpstream(t *testing.T) {
5858
}
5959
}
6060

61+
func TestPreflightWithTools(t *testing.T) {
62+
requireCommand(t, "git")
63+
requireCommand(t, "/bin/echo")
64+
release := config.Release{
65+
Remote: "origin",
66+
Branch: "main",
67+
Preinstalled: map[string]string{
68+
"cargo": "/bin/echo",
69+
},
70+
Tools: map[string][]config.Tool{
71+
"cargo": {
72+
{
73+
Name: "cargo-semver-checks",
74+
Version: "0.42.0",
75+
},
76+
},
77+
},
78+
}
79+
setupForVersionBump(t, "test-preflight-with-tools")
80+
if err := PreFlight(&release); err != nil {
81+
t.Errorf("expected a successful run, got=%v", err)
82+
}
83+
}
84+
85+
func TestPreflightToolFailure(t *testing.T) {
86+
requireCommand(t, "git")
87+
release := config.Release{
88+
Remote: "origin",
89+
Branch: "main",
90+
Preinstalled: map[string]string{
91+
// Using `git install blah blah` will fail.
92+
"cargo": "git",
93+
},
94+
Tools: map[string][]config.Tool{
95+
"cargo": {
96+
{
97+
Name: "invalid-tool-name---",
98+
Version: "a.b.c",
99+
},
100+
},
101+
},
102+
}
103+
setupForVersionBump(t, "test-preflight-with-tools")
104+
if err := PreFlight(&release); err == nil {
105+
t.Errorf("expected an error installing cargo-semver-checks")
106+
}
107+
}
108+
61109
func TestGitExe(t *testing.T) {
62110
release := config.Release{}
63111
if got := gitExe(&release); got != "git" {

internal/sidekick/internal/rust_release/update_manifest.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ func updateManifest(config *config.Release, lastTag, manifest string) ([]string,
4242
if err != nil {
4343
return nil, err
4444
}
45-
if updated {
46-
return nil, nil
47-
}
4845
contents, err := os.ReadFile(manifest)
4946
if err != nil {
5047
return nil, err
@@ -60,6 +57,9 @@ func updateManifest(config *config.Release, lastTag, manifest string) ([]string,
6057
if !info.Package.Publish {
6158
return nil, nil
6259
}
60+
if updated {
61+
return []string{info.Package.Name}, nil
62+
}
6363
newVersion, err := bumpPackageVersion(info.Package.Version)
6464
if err != nil {
6565
return nil, err

internal/sidekick/internal/rust_release/update_manifest_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,17 @@ func TestUpdateManifestSuccess(t *testing.T) {
6363
if err != nil {
6464
t.Fatal(err)
6565
}
66-
want = nil
6766
if diff := cmp.Diff(want, got); diff != "" {
6867
t.Errorf("mismatch (-want, +got):\n%s", diff)
6968
}
69+
contents, err = os.ReadFile(name)
70+
if err != nil {
71+
t.Fatal(err)
72+
}
73+
idx = bytes.Index(contents, []byte("version = \"1.1.0\"\n"))
74+
if idx == -1 {
75+
t.Errorf("expected version = 1.1.0 in new file, got=%s", contents)
76+
}
7077
}
7178

7279
func TestUpdateManifestBadDelta(t *testing.T) {

0 commit comments

Comments
 (0)