Skip to content

Commit 32c0b61

Browse files
authored
Add Commit Message Feature to Dependency Updater (#488)
* Updated dependencies for: optimism => op-node/v1.13.4 node-reth => v0.1.3 * Update versions Updated dependencies for: node-reth => v0.1.3 optimism => op-node/v1.13.4 * Update versions Updated dependencies for: optimism => op-node/v1.13.4 (github.com/ethereum-optimism/optimism/compare/op-node/v1.13.2...op-node/v1.13.4) node-reth => v0.1.3 (github.com/base/node-reth/compare/v0.1.2...v0.1.3) * Update versions Updated dependencies for: * Update versions Updated dependencies for: node-reth => v0.1.3 (github.com/base/node-reth/compare/v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (github.com/ethereum-optimism/optimism/compare/op-node/v1.13.2...op-node/v1.13.4) * paradigmxyz/reth@v1.4.3...v1.5.0 * Update versions Updated dependencies for: node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) * chore: updated node-reth optimism Updated dependencies for: node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) * chore: updated node-reth,optimism, Updated dependencies for: node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) * chore: updated Updated dependencies for: * chore: updated optimism, node-reth, Updated dependencies for: optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) * chore: updated node-reth, optimism Updated dependencies for: node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) * change variable name * chore: updated optimism, reth, node-reth, nethermind, op-geth Updated dependencies for: optimism => op-node/v1.13.4 () reth => v1.5.0 () node-reth => v0.1.3 () nethermind => 1.32.2 () op-geth => v1.101511.0 () * chore: updated node-reth, nethermind, op-geth, optimism, reth Updated dependencies for: node-reth => v0.1.3 () nethermind => 1.32.2 () op-geth => v1.101511.0 () optimism => op-node/v1.13.4 () reth => v1.5.0 () * chore: updated node-reth, nethermind, op-geth, optimism, reth Updated dependencies for: node-reth => v0.1.3 () nethermind => 1.32.2 () op-geth => v1.101511.0 () optimism => op-node/v1.13.4 () reth => v1.5.0 () * cleanup * prevent running updater if no versions to update * chore: updated optimism, node-reth Updated dependencies for: optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) * chore: updated optimism, node-reth Updated dependencies for: optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) * remove print * revert back to Do0 * go fmt * chore: updated node-reth, optimism Updated dependencies for: node-reth => v0.1.3 (base/base@v0.1.2...v0.1.3) optimism => op-node/v1.13.4 (ethereum-optimism/optimism@op-node/v1.13.2...op-node/v1.13.4) * test if build fails
1 parent a3dfafa commit 32c0b61

1 file changed

Lines changed: 96 additions & 35 deletions

File tree

dependency_updater/dependency_updater.go

Lines changed: 96 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,32 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"slices"
8+
"time"
9+
710
"github.com/ethereum-optimism/optimism/op-service/retry"
811
"github.com/google/go-github/v72/github"
912
"github.com/urfave/cli/v3"
10-
"slices"
11-
"time"
1213

1314
"log"
1415
"os"
16+
"os/exec"
1517
"strings"
1618
)
1719

1820
type Info struct {
19-
Tag string `json:"tag"`
20-
Commit string `json:"commit"`
21-
TagPrefix string `json:"tagPrefix,omitempty"`
22-
Owner string `json:"owner`
23-
Repo string `json:"repo`
21+
Tag string `json:"tag"`
22+
Commit string `json:"commit"`
23+
TagPrefix string `json:"tagPrefix,omitempty"`
24+
Owner string `json:"owner`
25+
Repo string `json:"repo`
2426
}
2527

26-
type VersionTag []struct {
27-
Tag string `json:"tag_name"`
28-
}
29-
30-
type Commit struct {
31-
Commit string `json:"sha"`
28+
type VersionUpdateInfo struct {
29+
Repo string
30+
From string
31+
To string
32+
DiffUrl string
3233
}
3334

3435
type Dependencies = map[string]*Info
@@ -49,9 +50,14 @@ func main() {
4950
Usage: "Specifies repo location to run the version updater on",
5051
Required: true,
5152
},
53+
&cli.BoolFlag{
54+
Name: "commit",
55+
Usage: "Stages updater changes and creates commit message",
56+
Required: false,
57+
},
5258
},
5359
Action: func(ctx context.Context, cmd *cli.Command) error {
54-
err := updater(string(cmd.String("token")), string(cmd.String("repo")))
60+
err := updater(string(cmd.String("token")), string(cmd.String("repo")), cmd.Bool("commit"))
5561
if err != nil {
5662
return fmt.Errorf("error running updater: %s", err)
5763
}
@@ -64,8 +70,10 @@ func main() {
6470
}
6571
}
6672

67-
func updater(token string, repoPath string) error {
73+
func updater(token string, repoPath string, commit bool) error {
6874
var err error
75+
var dependencies Dependencies
76+
var updatedDependencies []VersionUpdateInfo
6977

7078
f, err := os.ReadFile(repoPath + "/versions.json")
7179
if err != nil {
@@ -75,27 +83,37 @@ func updater(token string, repoPath string) error {
7583
client := github.NewClient(nil).WithAuthToken(token)
7684
ctx := context.Background()
7785

78-
var dependencies Dependencies
79-
8086
err = json.Unmarshal(f, &dependencies)
8187
if err != nil {
8288
return fmt.Errorf("error unmarshaling versions JSON to dependencies: %s", err)
8389
}
8490

8591
for dependency := range dependencies {
92+
var updatedDependency VersionUpdateInfo
8693
err := retry.Do0(context.Background(), 3, retry.Fixed(1*time.Second), func() error {
87-
return getAndUpdateDependency(
94+
updatedDependency, err = getAndUpdateDependency(
8895
ctx,
8996
client,
9097
dependency,
9198
repoPath,
9299
dependencies,
93100
)
101+
return err
94102
})
95-
96103
if err != nil {
97104
return fmt.Errorf("error getting and updating version/commit for "+dependency+": %s", err)
98105
}
106+
107+
if updatedDependency != (VersionUpdateInfo{}) {
108+
updatedDependencies = append(updatedDependencies, updatedDependency)
109+
}
110+
}
111+
112+
if commit && updatedDependencies != nil {
113+
err := createCommitMessage(updatedDependencies)
114+
if err != nil {
115+
return fmt.Errorf("error creating commit message: %s", err)
116+
}
99117
}
100118

101119
e := createVersionsEnv(repoPath, dependencies)
@@ -106,23 +124,46 @@ func updater(token string, repoPath string) error {
106124
return nil
107125
}
108126

109-
func getAndUpdateDependency(ctx context.Context, client *github.Client, dependencyType string, repoPath string, dependencies Dependencies) error {
110-
version, commit, err := getVersionAndCommit(ctx, client, dependencies, dependencyType)
111-
if err != nil {
112-
return err
113-
}
127+
func createCommitMessage(updatedDependencies []VersionUpdateInfo) error {
128+
var repos []string
129+
commitTitle := "chore: updated "
130+
commitDescription := "Updated dependencies for: \n"
114131

115-
e := updateVersionTagAndCommit(commit, version, dependencyType, repoPath, dependencies)
116-
if e != nil {
117-
return fmt.Errorf("error updating version tag and commit: %s", e)
132+
for _, dependency := range updatedDependencies {
133+
repo, tag := dependency.Repo, dependency.To
134+
commitDescription += repo + " => " + tag + " (" + dependency.DiffUrl + ")" + "\n"
135+
repos = append(repos, repo)
118136
}
119137

138+
commitTitle += strings.Join(repos, ", ")
139+
cmd := exec.Command("git", "commit", "-am", commitTitle, "-m", commitDescription)
140+
141+
if err := cmd.Run(); err != nil {
142+
return fmt.Errorf("error running git commit -m: %s", err)
143+
}
120144
return nil
121145
}
122146

123-
func getVersionAndCommit(ctx context.Context, client *github.Client, dependencies Dependencies, dependencyType string) (string, string, error) {
147+
func getAndUpdateDependency(ctx context.Context, client *github.Client, dependencyType string, repoPath string, dependencies Dependencies) (VersionUpdateInfo, error) {
148+
version, commit, updatedDependency, err := getVersionAndCommit(ctx, client, dependencies, dependencyType)
149+
if err != nil {
150+
return VersionUpdateInfo{}, err
151+
}
152+
if updatedDependency != (VersionUpdateInfo{}) {
153+
e := updateVersionTagAndCommit(commit, version, dependencyType, repoPath, dependencies)
154+
if e != nil {
155+
return VersionUpdateInfo{}, fmt.Errorf("error updating version tag and commit: %s", e)
156+
}
157+
}
158+
159+
return updatedDependency, nil
160+
}
161+
162+
func getVersionAndCommit(ctx context.Context, client *github.Client, dependencies Dependencies, dependencyType string) (string, string, VersionUpdateInfo, error) {
124163
var version *github.RepositoryRelease
125164
var err error
165+
var diffUrl string
166+
var updatedDependency VersionUpdateInfo
126167
foundPrefixVersion := false
127168
options := &github.ListOptions{Page: 1}
128169

@@ -134,17 +175,25 @@ func getVersionAndCommit(ctx context.Context, client *github.Client, dependencie
134175
options)
135176

136177
if err != nil {
137-
return "", "", fmt.Errorf("error getting releases: %s", err)
178+
return "", "", VersionUpdateInfo{}, fmt.Errorf("error getting releases: %s", err)
138179
}
139180

140181
if dependencies[dependencyType].TagPrefix == "" {
141182
version = releases[0]
183+
if *version.TagName != dependencies[dependencyType].Tag {
184+
diffUrl = generateGithubRepoUrl(dependencies, dependencyType) + "/compare/" +
185+
dependencies[dependencyType].Tag + "..." + *version.TagName
186+
}
142187
break
143-
} else if dependencies[dependencyType].TagPrefix != ""{
188+
} else if dependencies[dependencyType].TagPrefix != "" {
144189
for release := range releases {
145190
if strings.HasPrefix(*releases[release].TagName, dependencies[dependencyType].TagPrefix) {
146191
version = releases[release]
147192
foundPrefixVersion = true
193+
if *version.TagName != dependencies[dependencyType].Tag {
194+
diffUrl = generateGithubRepoUrl(dependencies, dependencyType) + "/compare/" +
195+
dependencies[dependencyType].Tag + "..." + *version.TagName
196+
}
148197
break
149198
}
150199
}
@@ -157,17 +206,26 @@ func getVersionAndCommit(ctx context.Context, client *github.Client, dependencie
157206
}
158207
}
159208

209+
if diffUrl != "" {
210+
updatedDependency = VersionUpdateInfo{
211+
dependencies[dependencyType].Repo,
212+
dependencies[dependencyType].Tag,
213+
*version.TagName,
214+
diffUrl,
215+
}
216+
}
217+
160218
commit, _, err := client.Repositories.GetCommit(
161219
ctx,
162220
dependencies[dependencyType].Owner,
163221
dependencies[dependencyType].Repo,
164222
"refs/tags/"+*version.TagName,
165223
&github.ListOptions{})
166224
if err != nil {
167-
return "", "", fmt.Errorf("error getting commit for "+dependencyType+": %s", err)
225+
return "", "", VersionUpdateInfo{}, fmt.Errorf("error getting commit for "+dependencyType+": %s", err)
168226
}
169227

170-
return *version.TagName, *commit.SHA, nil
228+
return *version.TagName, *commit.SHA, updatedDependency, nil
171229
}
172230

173231
func updateVersionTagAndCommit(
@@ -182,6 +240,7 @@ func updateVersionTagAndCommit(
182240
if err != nil {
183241
return fmt.Errorf("error writing to versions "+dependencyType+": %s", err)
184242
}
243+
185244
return nil
186245
}
187246

@@ -204,9 +263,7 @@ func createVersionsEnv(repoPath string, dependencies Dependencies) error {
204263
envLines := []string{}
205264

206265
for dependency := range dependencies {
207-
repoUrl := "https://github.com/" +
208-
dependencies[dependency].Owner + "/" +
209-
dependencies[dependency].Repo + ".git"
266+
repoUrl := generateGithubRepoUrl(dependencies, dependency) + ".git"
210267

211268
dependencyPrefix := strings.ToUpper(dependency)
212269

@@ -235,3 +292,7 @@ func createVersionsEnv(repoPath string, dependencies Dependencies) error {
235292

236293
return nil
237294
}
295+
296+
func generateGithubRepoUrl(dependencies Dependencies, dependencyType string) string {
297+
return "https://github.com/" + dependencies[dependencyType].Owner + "/" + dependencies[dependencyType].Repo
298+
}

0 commit comments

Comments
 (0)