From 5eafe7ef05b946dc31deff01fafed71fd09fce70 Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Wed, 20 May 2026 12:18:11 -0500 Subject: [PATCH] chore: remove dependency updater --- .github/workflows/update-dependencies.yml | 40 --- dependency_updater/dependency_updater.go | 411 ---------------------- dependency_updater/go.mod | 14 - dependency_updater/go.sum | 22 -- dependency_updater/version.go | 136 ------- dependency_updater/version_test.go | 305 ---------------- go.mod | 3 - versions.json | 31 -- 8 files changed, 962 deletions(-) delete mode 100644 .github/workflows/update-dependencies.yml delete mode 100644 dependency_updater/dependency_updater.go delete mode 100644 dependency_updater/go.mod delete mode 100644 dependency_updater/go.sum delete mode 100644 dependency_updater/version.go delete mode 100644 dependency_updater/version_test.go delete mode 100644 go.mod delete mode 100644 versions.json diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml deleted file mode 100644 index 3ce14cff3..000000000 --- a/.github/workflows/update-dependencies.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Update Dockerfile Dependencies -on: - schedule: - - cron: '0 13 * * *' - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - update: - name: update - runs-on: ubuntu-latest - steps: - - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 - with: - egress-policy: audit - - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: build dependency updater - run: cd dependency_updater && go build - - - name: run dependency updater - id: run_dependency_updater - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: cd dependency_updater && ./dependency_updater --repo ../ --github-action true - - - name: create pull request - if: ${{ steps.run_dependency_updater.outputs.TITLE != '' }} - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 - with: - title: ${{ steps.run_dependency_updater.outputs.TITLE }} - commit-message: ${{ steps.run_dependency_updater.outputs.TITLE }} - body: "${{ steps.run_dependency_updater.outputs.DESC }}" - branch: run-dependency-updater - delete-branch: true \ No newline at end of file diff --git a/dependency_updater/dependency_updater.go b/dependency_updater/dependency_updater.go deleted file mode 100644 index 56204d77a..000000000 --- a/dependency_updater/dependency_updater.go +++ /dev/null @@ -1,411 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "fmt" - "slices" - "time" - - "github.com/ethereum-optimism/optimism/op-service/retry" - "github.com/google/go-github/v72/github" - "github.com/urfave/cli/v3" - - "log" - "os" - "os/exec" - "strings" -) - -type Info struct { - Tag string `json:"tag,omitempty"` - Commit string `json:"commit"` - TagPrefix string `json:"tagPrefix,omitempty"` - Owner string `json:"owner"` - Repo string `json:"repo"` - Branch string `json:"branch,omitempty"` - Tracking string `json:"tracking"` -} - -type VersionUpdateInfo struct { - Repo string - From string - To string - DiffUrl string -} - -type Dependencies = map[string]*Info - -func main() { - cmd := &cli.Command{ - Name: "updater", - Usage: "Updates the dependencies in the geth, nethermind and reth Dockerfiles", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "token", - Usage: "Auth token used to make requests to the Github API must be set using export", - Sources: cli.EnvVars("GITHUB_TOKEN"), - Required: true, - }, - &cli.StringFlag{ - Name: "repo", - Usage: "Specifies repo location to run the version updater on", - Required: true, - }, - &cli.BoolFlag{ - Name: "commit", - Usage: "Stages updater changes and creates commit message", - Required: false, - }, - &cli.BoolFlag{ - Name: "github-action", - Usage: "Specifies whether tool is being used through github action workflow", - Required: false, - }, - }, - Action: func(ctx context.Context, cmd *cli.Command) error { - err := updater(cmd.String("token"), cmd.String("repo"), cmd.Bool("commit"), cmd.Bool("github-action")) - if err != nil { - return fmt.Errorf("failed to run updater: %s", err) - } - return nil - }, - } - - if err := cmd.Run(context.Background(), os.Args); err != nil { - log.Fatal(err) - } -} - -func updater(token string, repoPath string, commit bool, githubAction bool) error { - var err error - var dependencies Dependencies - var updatedDependencies []VersionUpdateInfo - - f, err := os.ReadFile(repoPath + "/versions.json") - if err != nil { - return fmt.Errorf("error reading versions JSON: %s", err) - } - - client := github.NewClient(nil).WithAuthToken(token) - ctx := context.Background() - - err = json.Unmarshal(f, &dependencies) - if err != nil { - return fmt.Errorf("error unmarshalling versions JSON to dependencies: %s", err) - } - - for dependency := range dependencies { - var updatedDependency VersionUpdateInfo - err := retry.Do0(context.Background(), 3, retry.Fixed(1*time.Second), func() error { - updatedDependency, err = getAndUpdateDependency( - ctx, - client, - dependency, - repoPath, - dependencies, - ) - return err - }) - if err != nil { - return fmt.Errorf("error getting and updating version/commit for "+dependency+": %s", err) - } - - if updatedDependency != (VersionUpdateInfo{}) { - updatedDependencies = append(updatedDependencies, updatedDependency) - } - } - - e := createVersionsEnv(repoPath, dependencies) - if e != nil { - return fmt.Errorf("error creating versions.env: %s", e) - } - - if (commit && updatedDependencies != nil) || (githubAction && updatedDependencies != nil) { - err := createCommitMessage(updatedDependencies, repoPath, githubAction) - if err != nil { - return fmt.Errorf("error creating commit message: %s", err) - } - } - - return nil -} - -func createCommitMessage(updatedDependencies []VersionUpdateInfo, repoPath string, githubAction bool) error { - var repos []string - descriptionLines := []string{ - "### Dependency Updates", - } - - commitTitle := "chore: updated " - - for _, dependency := range updatedDependencies { - repo, tag := dependency.Repo, dependency.To - descriptionLines = append(descriptionLines, fmt.Sprintf("**%s** - %s: [diff](%s)", repo, tag, dependency.DiffUrl)) - repos = append(repos, repo) - } - commitDescription := strings.Join(descriptionLines, "\n") - commitTitle += strings.Join(repos, ", ") - - if githubAction { - err := writeToGithubOutput(commitTitle, commitDescription, repoPath) - if err != nil { - return fmt.Errorf("error creating git commit message: %s", err) - } - } else { - cmd := exec.Command("git", "commit", "-am", commitTitle, "-m", commitDescription) - if err := cmd.Run(); err != nil { - return fmt.Errorf("failed to run git commit -m: %s", err) - } - } - return nil -} - -func getAndUpdateDependency(ctx context.Context, client *github.Client, dependencyType string, repoPath string, dependencies Dependencies) (VersionUpdateInfo, error) { - version, commit, updatedDependency, err := getVersionAndCommit(ctx, client, dependencies, dependencyType) - if err != nil { - return VersionUpdateInfo{}, err - } - if updatedDependency != (VersionUpdateInfo{}) { - e := updateVersionTagAndCommit(commit, version, dependencyType, repoPath, dependencies) - if e != nil { - return VersionUpdateInfo{}, fmt.Errorf("error updating version tag and commit: %s", e) - } - } - - return updatedDependency, nil -} - -func getVersionAndCommit(ctx context.Context, client *github.Client, dependencies Dependencies, dependencyType string) (string, string, VersionUpdateInfo, error) { - var selectedTag *github.RepositoryTag - var commit string - var diffUrl string - var updatedDependency VersionUpdateInfo - options := &github.ListOptions{Page: 1} - currentTag := dependencies[dependencyType].Tag - tagPrefix := dependencies[dependencyType].TagPrefix - - if dependencies[dependencyType].Tracking == "tag" || dependencies[dependencyType].Tracking == "release" { - // Collect all valid tags across all pages, then find the max version - var validTags []*github.RepositoryTag - trackingMode := dependencies[dependencyType].Tracking - - for { - tags, resp, err := client.Repositories.ListTags( - ctx, - dependencies[dependencyType].Owner, - dependencies[dependencyType].Repo, - options) - - if err != nil { - return "", "", VersionUpdateInfo{}, fmt.Errorf("error getting tags: %s", err) - } - - for _, tag := range tags { - // Skip if tagPrefix is set and doesn't match - if tagPrefix != "" && !strings.HasPrefix(*tag.Name, tagPrefix) { - continue - } - - // Filter based on tracking mode: - // - "release": only stable releases (no prerelease suffix) - // - "tag": releases and RC versions only (exclude -synctest, -alpha, etc.) - if trackingMode == "release" { - if !IsReleaseVersion(*tag.Name, tagPrefix) { - continue - } - } else if trackingMode == "tag" { - if !IsReleaseOrRCVersion(*tag.Name, tagPrefix) { - continue - } - } - - // Check if this is a valid upgrade (not a downgrade) - if err := ValidateVersionUpgrade(currentTag, *tag.Name, tagPrefix); err != nil { - continue - } - - validTags = append(validTags, tag) - } - - if resp.NextPage == 0 { - break - } - options.Page = resp.NextPage - } - - // Find the maximum version among valid tags - for _, tag := range validTags { - // Skip if this tag can't be parsed - if _, err := ParseVersion(*tag.Name, tagPrefix); err != nil { - log.Printf("Skipping unparseable tag %s: %v", *tag.Name, err) - continue - } - - if selectedTag == nil { - selectedTag = tag - continue - } - - cmp, err := CompareVersions(*tag.Name, *selectedTag.Name, tagPrefix) - if err != nil { - log.Printf("Error comparing versions %s and %s: %v", *tag.Name, *selectedTag.Name, err) - continue - } - if cmp > 0 { - selectedTag = tag - } - } - - // If no valid version found, keep current version - if selectedTag == nil { - log.Printf("No valid upgrade found for %s, keeping %s", dependencyType, currentTag) - return currentTag, dependencies[dependencyType].Commit, VersionUpdateInfo{}, nil - } - - if *selectedTag.Name != currentTag { - diffUrl = generateGithubRepoUrl(dependencies, dependencyType) + "/compare/" + - currentTag + "..." + *selectedTag.Name - } - - // Get commit SHA from the tag - commit = *selectedTag.Commit.SHA - } - - if diffUrl != "" { - updatedDependency = VersionUpdateInfo{ - dependencies[dependencyType].Repo, - dependencies[dependencyType].Tag, - *selectedTag.Name, - diffUrl, - } - } - - if dependencies[dependencyType].Tracking == "branch" { - branchCommit, _, err := client.Repositories.ListCommits( - ctx, - dependencies[dependencyType].Owner, - dependencies[dependencyType].Repo, - &github.CommitsListOptions{ - SHA: dependencies[dependencyType].Branch, - }, - ) - if err != nil { - return "", "", VersionUpdateInfo{}, fmt.Errorf("error listing commits for "+dependencyType+": %s", err) - } - commit = *branchCommit[0].SHA - if dependencies[dependencyType].Commit != commit { - from, to := dependencies[dependencyType].Commit, commit - diffUrl = fmt.Sprintf("%s/compare/%s...%s", generateGithubRepoUrl(dependencies, dependencyType), from, to) - updatedDependency = VersionUpdateInfo{ - dependencies[dependencyType].Repo, - dependencies[dependencyType].Tag, - commit, - diffUrl, - } - } - } - - if selectedTag != nil { - return *selectedTag.Name, commit, updatedDependency, nil - } - - return "", commit, updatedDependency, nil -} - -func updateVersionTagAndCommit( - commit string, - tag string, - dependencyType string, - repoPath string, - dependencies Dependencies) error { - dependencies[dependencyType].Tag = tag - dependencies[dependencyType].Commit = commit - err := writeToVersionsJson(repoPath, dependencies) - if err != nil { - return fmt.Errorf("error writing to versions "+dependencyType+": %s", err) - } - - return nil -} - -func writeToVersionsJson(repoPath string, dependencies Dependencies) error { - // formatting json - updatedJson, err := json.MarshalIndent(dependencies, "", " ") - if err != nil { - return fmt.Errorf("error marshaling dependencies json: %s", err) - } - - e := os.WriteFile(repoPath+"/versions.json", updatedJson, 0644) - if e != nil { - return fmt.Errorf("error writing to versions.json: %s", e) - } - - return nil -} - -func createVersionsEnv(repoPath string, dependencies Dependencies) error { - envLines := []string{} - - for dependency := range dependencies { - repoUrl := generateGithubRepoUrl(dependencies, dependency) + ".git" - - dependencyPrefix := strings.ToUpper(dependency) - - if dependencies[dependency].Tracking == "branch" { - dependencies[dependency].Tag = dependencies[dependency].Branch - } - - envLines = append(envLines, fmt.Sprintf("export %s_%s=%s", - dependencyPrefix, "TAG", dependencies[dependency].Tag)) - - envLines = append(envLines, fmt.Sprintf("export %s_%s=%s", - dependencyPrefix, "COMMIT", dependencies[dependency].Commit)) - - envLines = append(envLines, fmt.Sprintf("export %s_%s=%s", - dependencyPrefix, "REPO", repoUrl)) - } - - slices.Sort(envLines) - - file, err := os.Create(repoPath + "/versions.env") - if err != nil { - return fmt.Errorf("error creating versions.env file: %s", err) - } - defer file.Close() - - _, err = file.WriteString(strings.Join(envLines, "\n")) - if err != nil { - return fmt.Errorf("error writing to versions.env file: %s", err) - } - - return nil -} - -func writeToGithubOutput(title string, description string, repoPath string) error { - file := os.Getenv("GITHUB_OUTPUT") - f, err := os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return fmt.Errorf("failed to open GITHUB_OUTPUT file: %s", err) - } - defer f.Close() - - titleToWrite := fmt.Sprintf("%s=%s\n", "TITLE", title) - _, err = f.WriteString(titleToWrite) - if err != nil { - return fmt.Errorf("failed to write to GITHUB_OUTPUT file: %s", err) - } - - delimiter := "EOF" - descToWrite := fmt.Sprintf("%s<<%s\n%s\n%s\n", "DESC", delimiter, description, delimiter) - _, err = f.WriteString(descToWrite) - if err != nil { - return fmt.Errorf("failed to write to GITHUB_OUTPUT file: %s", err) - } - - return nil -} - -func generateGithubRepoUrl(dependencies Dependencies, dependencyType string) string { - return "https://github.com/" + dependencies[dependencyType].Owner + "/" + dependencies[dependencyType].Repo -} diff --git a/dependency_updater/go.mod b/dependency_updater/go.mod deleted file mode 100644 index 85193c9c0..000000000 --- a/dependency_updater/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/base/node/dependency_updater - -go 1.24.3 - -require ( - github.com/ethereum-optimism/optimism v1.13.3 - github.com/google/go-github/v72 v72.0.0 - github.com/urfave/cli/v3 v3.3.8 -) - -require ( - github.com/Masterminds/semver/v3 v3.4.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect -) diff --git a/dependency_updater/go.sum b/dependency_updater/go.sum deleted file mode 100644 index 72b6f03e4..000000000 --- a/dependency_updater/go.sum +++ /dev/null @@ -1,22 +0,0 @@ -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/ethereum-optimism/optimism v1.13.3 h1:rfPx7OembMnoEASU1ozA/Foa7Am7UA+h0SB+OUrxn7s= -github.com/ethereum-optimism/optimism v1.13.3/go.mod h1:WrVFtk3cP45tvHs7MARn9KGQu35XIoXo/IOWU6K/rzk= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-github/v72 v72.0.0 h1:FcIO37BLoVPBO9igQQ6tStsv2asG4IPcYFi655PPvBM= -github.com/google/go-github/v72 v72.0.0/go.mod h1:WWtw8GMRiL62mvIquf1kO3onRHeWWKmK01qdCY8c5fg= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E= -github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/dependency_updater/version.go b/dependency_updater/version.go deleted file mode 100644 index 31a0a56eb..000000000 --- a/dependency_updater/version.go +++ /dev/null @@ -1,136 +0,0 @@ -package main - -import ( - "fmt" - "regexp" - "strings" - - "github.com/Masterminds/semver/v3" -) - -// rcPattern matches various RC formats: -rc1, -rc.1, -rc-1, -RC1, etc. -var rcPattern = regexp.MustCompile(`(?i)-rc[.-]?(\d+)`) - -// rcOnlyPattern is used to check if a version contains ONLY an RC prerelease (not -synctest, -alpha, etc.) -var rcOnlyPattern = regexp.MustCompile(`(?i)^-rc[.-]?\d+$`) - -// ParseVersion extracts and normalizes a semantic version from a tag string. -// It handles tagPrefix stripping, v-prefix normalization, and RC format normalization. -func ParseVersion(tag string, tagPrefix string) (*semver.Version, error) { - versionStr := tag - - // Step 1: Strip tagPrefix if present (e.g., "op-node/v1.16.2" -> "v1.16.2") - if tagPrefix != "" && strings.HasPrefix(tag, tagPrefix) { - versionStr = strings.TrimPrefix(tag, tagPrefix) - versionStr = strings.TrimPrefix(versionStr, "/") - } - - // Step 2: Normalize RC formats to semver-compatible format - // "-rc1" -> "-rc.1", "-rc-1" -> "-rc.1" - versionStr = normalizeRCFormat(versionStr) - - // Step 3: Parse using Masterminds/semver (handles v prefix automatically) - v, err := semver.NewVersion(versionStr) - if err != nil { - return nil, fmt.Errorf("invalid version format %q: %w", tag, err) - } - - return v, nil -} - -// normalizeRCFormat converts various RC formats to semver-compatible format. -// Examples: "-rc1" -> "-rc.1", "-rc-2" -> "-rc.2" -func normalizeRCFormat(version string) string { - return rcPattern.ReplaceAllString(version, "-rc.$1") -} - -// ValidateVersionUpgrade checks if transitioning from currentTag to newTag -// is a valid upgrade (not a downgrade). -// Returns nil if valid, error explaining why if invalid. -func ValidateVersionUpgrade(currentTag, newTag, tagPrefix string) error { - // First-time setup: no current version, any valid version is acceptable - if currentTag == "" { - _, err := ParseVersion(newTag, tagPrefix) - return err - } - - // Parse current version - currentVersion, err := ParseVersion(currentTag, tagPrefix) - if err != nil { - // Current version unparseable - still validate new version is parseable - _, newErr := ParseVersion(newTag, tagPrefix) - return newErr - } - - // Parse new version - newVersion, err := ParseVersion(newTag, tagPrefix) - if err != nil { - return fmt.Errorf("new version %q is not a valid semver: %w", newTag, err) - } - - // Check for downgrade - if newVersion.LessThan(currentVersion) { - return fmt.Errorf( - "version downgrade detected: %s -> %s", - currentTag, newTag, - ) - } - - return nil -} - -// CompareVersions compares two version tags and returns: -// -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2 -// Returns 0 and error if either version cannot be parsed. -func CompareVersions(v1Tag, v2Tag, tagPrefix string) (int, error) { - v1, err := ParseVersion(v1Tag, tagPrefix) - if err != nil { - return 0, err - } - v2, err := ParseVersion(v2Tag, tagPrefix) - if err != nil { - return 0, err - } - return v1.Compare(v2), nil -} - -// IsReleaseVersion returns true if the tag is a stable release (no prerelease suffix). -// Examples: -// - "v1.0.0" -> true -// - "v1.0.0-rc1" -> false -// - "v1.0.0-synctest.0" -> false -func IsReleaseVersion(tag string, tagPrefix string) bool { - v, err := ParseVersion(tag, tagPrefix) - if err != nil { - return false - } - return v.Prerelease() == "" -} - -// IsRCVersion returns true if the tag is a release candidate version. -// This matches versions with -rc, -rc.N, -rc-N, -rcN suffixes. -// Examples: -// - "v1.0.0-rc1" -> true -// - "v1.0.0-rc.2" -> true -// - "v1.0.0" -> false (stable release, not RC) -// - "v1.0.0-synctest.0" -> false (not an RC) -// - "v1.0.0-alpha" -> false (not an RC) -func IsRCVersion(tag string, tagPrefix string) bool { - v, err := ParseVersion(tag, tagPrefix) - if err != nil { - return false - } - prerelease := v.Prerelease() - if prerelease == "" { - return false - } - // Check if the prerelease is ONLY an RC format (e.g., "rc.1", "rc1", "rc-1") - // We need to check the original format before normalization - return rcOnlyPattern.MatchString("-" + prerelease) -} - -// IsReleaseOrRCVersion returns true if the tag is either a stable release or an RC version. -// This excludes other prereleases like -alpha, -beta, -synctest, etc. -func IsReleaseOrRCVersion(tag string, tagPrefix string) bool { - return IsReleaseVersion(tag, tagPrefix) || IsRCVersion(tag, tagPrefix) -} diff --git a/dependency_updater/version_test.go b/dependency_updater/version_test.go deleted file mode 100644 index 3413cb4ae..000000000 --- a/dependency_updater/version_test.go +++ /dev/null @@ -1,305 +0,0 @@ -package main - -import ( - "testing" -) - -func TestNormalizeRCFormat(t *testing.T) { - tests := []struct { - input string - expected string - }{ - {"v0.3.0-rc1", "v0.3.0-rc.1"}, - {"v0.3.0-rc.1", "v0.3.0-rc.1"}, - {"v0.3.0-rc-1", "v0.3.0-rc.1"}, - {"v0.3.0-RC1", "v0.3.0-rc.1"}, - {"v0.3.0-rc12", "v0.3.0-rc.12"}, - {"v0.3.0", "v0.3.0"}, - {"v0.3.0-alpha", "v0.3.0-alpha"}, - {"v0.3.0-beta.1", "v0.3.0-beta.1"}, - } - - for _, tt := range tests { - t.Run(tt.input, func(t *testing.T) { - result := normalizeRCFormat(tt.input) - if result != tt.expected { - t.Errorf("normalizeRCFormat(%q) = %q, want %q", tt.input, result, tt.expected) - } - }) - } -} - -func TestParseVersion(t *testing.T) { - tests := []struct { - tag string - tagPrefix string - wantErr bool - }{ - // Standard versions - {"v0.2.2", "", false}, - {"v0.3.0", "", false}, - {"1.35.3", "", false}, // nethermind style - no v prefix - - // RC versions - {"v0.3.0-rc1", "", false}, - {"v0.3.0-rc.1", "", false}, - {"v0.3.0-rc-1", "", false}, - {"v0.3.0-rc.2", "", false}, - - // With tagPrefix - {"op-node/v1.16.2", "op-node", false}, - {"op-node/v1.16.3-rc1", "op-node", false}, - - // Non-standard but parseable - {"v1.101603.5", "", false}, // op-geth style - - // Invalid - {"not-a-version", "", true}, - {"", "", true}, - } - - for _, tt := range tests { - t.Run(tt.tag, func(t *testing.T) { - _, err := ParseVersion(tt.tag, tt.tagPrefix) - if (err != nil) != tt.wantErr { - t.Errorf("ParseVersion(%q, %q) error = %v, wantErr %v", tt.tag, tt.tagPrefix, err, tt.wantErr) - } - }) - } -} - -func TestValidateVersionUpgrade(t *testing.T) { - tests := []struct { - name string - currentTag string - newTag string - tagPrefix string - wantErr bool - }{ - // Valid upgrades - {"stable to rc", "v0.2.2", "v0.3.0-rc1", "", false}, - {"rc to rc", "v0.3.0-rc1", "v0.3.0-rc2", "", false}, - {"rc to stable", "v0.3.0-rc2", "v0.3.0", "", false}, - {"stable to stable", "v0.2.2", "v0.3.0", "", false}, - {"patch upgrade", "v0.2.2", "v0.2.3", "", false}, - {"minor upgrade", "v0.2.2", "v0.3.0", "", false}, - {"major upgrade", "v0.2.2", "v1.0.0", "", false}, - {"same version", "v0.2.2", "v0.2.2", "", false}, - - // With tagPrefix - {"prefix upgrade", "op-node/v1.16.2", "op-node/v1.16.3", "op-node", false}, - {"prefix rc upgrade", "op-node/v1.16.2", "op-node/v1.17.0-rc1", "op-node", false}, - - // No v prefix (nethermind style) - {"no v prefix upgrade", "1.35.3", "1.35.4", "", false}, - - // Invalid downgrades - {"downgrade major", "v0.3.0", "v0.2.2", "", true}, - {"downgrade minor", "v0.3.0", "v0.2.9", "", true}, - {"downgrade patch", "v0.3.1", "v0.3.0", "", true}, - {"stable to rc same version", "v0.3.0", "v0.3.0-rc2", "", true}, - {"stable to rc older version", "v0.3.0", "v0.2.0-rc1", "", true}, - - // Edge cases - {"empty current - valid new", "", "v0.3.0", "", false}, - {"empty current - invalid new", "", "not-a-version", "", true}, - {"unparseable current allows update", "not-semver", "v0.3.0", "", false}, - - // Unparseable current with unparseable new should fail - {"unparseable current - unparseable new", "rollup-boost/v0.7.11", "websocket-proxy/v0.0.2", "", true}, - {"unparseable current - valid new", "rollup-boost/v0.7.11", "v0.8.0", "", false}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := ValidateVersionUpgrade(tt.currentTag, tt.newTag, tt.tagPrefix) - if (err != nil) != tt.wantErr { - t.Errorf("ValidateVersionUpgrade(%q, %q, %q) error = %v, wantErr %v", - tt.currentTag, tt.newTag, tt.tagPrefix, err, tt.wantErr) - } - }) - } -} - -func TestCompareVersions(t *testing.T) { - tests := []struct { - name string - v1 string - v2 string - tagPrefix string - want int - }{ - {"v1 less than v2", "v0.2.2", "v0.3.0", "", -1}, - {"v1 greater than v2", "v0.3.0", "v0.2.2", "", 1}, - {"equal versions", "v0.3.0", "v0.3.0", "", 0}, - {"rc less than stable", "v0.3.0-rc1", "v0.3.0", "", -1}, - {"rc1 less than rc2", "v0.3.0-rc1", "v0.3.0-rc2", "", -1}, - {"stable greater than rc", "v0.3.0", "v0.3.0-rc2", "", 1}, - {"with prefix", "op-node/v1.16.2", "op-node/v1.16.3", "op-node", -1}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := CompareVersions(tt.v1, tt.v2, tt.tagPrefix) - if err != nil { - t.Errorf("CompareVersions(%q, %q, %q) unexpected error: %v", tt.v1, tt.v2, tt.tagPrefix, err) - return - } - if got != tt.want { - t.Errorf("CompareVersions(%q, %q, %q) = %d, want %d", tt.v1, tt.v2, tt.tagPrefix, got, tt.want) - } - }) - } -} - -func TestIsReleaseVersion(t *testing.T) { - tests := []struct { - tag string - tagPrefix string - want bool - }{ - // Stable releases - {"v1.0.0", "", true}, - {"v0.2.2", "", true}, - {"1.35.3", "", true}, // nethermind style - {"v1.101603.5", "", true}, // op-geth style - - // With prefix - {"op-node/v1.16.2", "op-node", true}, - - // Pre-release versions (should return false) - {"v1.0.0-rc1", "", false}, - {"v1.0.0-rc.1", "", false}, - {"v1.0.0-rc-1", "", false}, - {"v1.0.0-synctest.0", "", false}, - {"v1.0.0-alpha", "", false}, - {"v1.0.0-beta.1", "", false}, - {"op-node/v1.16.6-synctest.0", "op-node", false}, - {"op-node/v1.16.3-rc1", "op-node", false}, - - // Invalid versions (should return false) - {"not-a-version", "", false}, - {"", "", false}, - } - - for _, tt := range tests { - t.Run(tt.tag, func(t *testing.T) { - got := IsReleaseVersion(tt.tag, tt.tagPrefix) - if got != tt.want { - t.Errorf("IsReleaseVersion(%q, %q) = %v, want %v", tt.tag, tt.tagPrefix, got, tt.want) - } - }) - } -} - -func TestIsRCVersion(t *testing.T) { - tests := []struct { - tag string - tagPrefix string - want bool - }{ - // RC versions - {"v1.0.0-rc1", "", true}, - {"v1.0.0-rc.1", "", true}, - {"v1.0.0-rc-1", "", true}, - {"v1.0.0-RC1", "", true}, - {"v1.0.0-rc12", "", true}, - {"op-node/v1.16.3-rc1", "op-node", true}, - {"op-node/v1.16.3-rc.2", "op-node", true}, - - // Stable releases (not RC) - {"v1.0.0", "", false}, - {"v0.2.2", "", false}, - {"op-node/v1.16.2", "op-node", false}, - - // Other pre-release versions (not RC) - {"v1.0.0-synctest.0", "", false}, - {"op-node/v1.16.6-synctest.0", "op-node", false}, - {"v1.0.0-alpha", "", false}, - {"v1.0.0-beta.1", "", false}, - {"v1.0.0-alpha.rc1", "", false}, // rc is part of another prerelease - - // Invalid versions - {"not-a-version", "", false}, - {"", "", false}, - } - - for _, tt := range tests { - t.Run(tt.tag, func(t *testing.T) { - got := IsRCVersion(tt.tag, tt.tagPrefix) - if got != tt.want { - t.Errorf("IsRCVersion(%q, %q) = %v, want %v", tt.tag, tt.tagPrefix, got, tt.want) - } - }) - } -} - -func TestIsReleaseOrRCVersion(t *testing.T) { - tests := []struct { - tag string - tagPrefix string - want bool - }{ - // Stable releases - should pass - {"v1.0.0", "", true}, - {"v0.2.2", "", true}, - {"op-node/v1.16.2", "op-node", true}, - - // RC versions - should pass - {"v1.0.0-rc1", "", true}, - {"v1.0.0-rc.1", "", true}, - {"op-node/v1.16.3-rc1", "op-node", true}, - - // Other pre-release versions - should NOT pass - {"v1.0.0-synctest.0", "", false}, - {"op-node/v1.16.6-synctest.0", "op-node", false}, - {"v1.0.0-alpha", "", false}, - {"v1.0.0-beta.1", "", false}, - - // Invalid versions - {"not-a-version", "", false}, - } - - for _, tt := range tests { - t.Run(tt.tag, func(t *testing.T) { - got := IsReleaseOrRCVersion(tt.tag, tt.tagPrefix) - if got != tt.want { - t.Errorf("IsReleaseOrRCVersion(%q, %q) = %v, want %v", tt.tag, tt.tagPrefix, got, tt.want) - } - }) - } -} - -func TestRCVersionOrdering(t *testing.T) { - // Verify that RC versions are ordered correctly - versions := []string{ - "v0.2.2", - "v0.3.0-rc.1", - "v0.3.0-rc.2", - "v0.3.0", - "v0.3.1", - } - - for i := 0; i < len(versions)-1; i++ { - current := versions[i] - next := versions[i+1] - t.Run(current+" -> "+next, func(t *testing.T) { - err := ValidateVersionUpgrade(current, next, "") - if err != nil { - t.Errorf("Expected %s -> %s to be valid upgrade, got error: %v", current, next, err) - } - }) - } - - // Verify reverse order is invalid - for i := len(versions) - 1; i > 0; i-- { - current := versions[i] - previous := versions[i-1] - t.Run(current+" -> "+previous+" (downgrade)", func(t *testing.T) { - err := ValidateVersionUpgrade(current, previous, "") - if err == nil { - t.Errorf("Expected %s -> %s to be invalid downgrade", current, previous) - } - }) - } -} diff --git a/go.mod b/go.mod deleted file mode 100644 index aa11010d8..000000000 --- a/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module dependency_updater - -go 1.24.3 diff --git a/versions.json b/versions.json deleted file mode 100644 index 3ff19367a..000000000 --- a/versions.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "base_reth_node": { - "tag": "v0.8.0", - "commit": "3049ce2e3a5132f2ef74b4ba14a1a952ea6abdfb", - "owner": "base", - "repo": "base", - "tracking": "release" - }, - "nethermind": { - "tag": "1.36.2", - "commit": "f5507dec1c9c7f5e31dadae445c08622be166054", - "owner": "NethermindEth", - "repo": "nethermind", - "tracking": "release" - }, - "op_geth": { - "tag": "v1.101702.0", - "commit": "d0734fd5f44234cde3b0a7c4beb1256fc6feedef", - "owner": "ethereum-optimism", - "repo": "op-geth", - "tracking": "release" - }, - "op_node": { - "tag": "op-node/v1.16.11", - "commit": "cba7aba0c98aae22720b21c3a023990a486cb6e0", - "tagPrefix": "op-node", - "owner": "ethereum-optimism", - "repo": "optimism", - "tracking": "release" - } -}