diff --git a/libevm/tooling/go.mod b/libevm/tooling/go.mod index a0edc3e00ae..ba183372060 100644 --- a/libevm/tooling/go.mod +++ b/libevm/tooling/go.mod @@ -7,7 +7,6 @@ replace github.com/ava-labs/libevm => ../../ require ( github.com/ava-labs/libevm v0.0.0-00010101000000-000000000000 github.com/go-git/go-git/v5 v5.14.0 - github.com/google/go-cmp v0.7.0 github.com/stretchr/testify v1.10.0 ) diff --git a/libevm/tooling/release/cherrypick.sh b/libevm/tooling/release/cherrypick.sh deleted file mode 100755 index c9100a39855..00000000000 --- a/libevm/tooling/release/cherrypick.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2025 the libevm authors. -# -# The libevm additions to go-ethereum are free software: you can redistribute -# them and/or modify them under the terms of the GNU Lesser General Public License -# as published by the Free Software Foundation, either version 3 of the License, -# or (at your option) any later version. -# -# The libevm additions are distributed in the hope that they will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser -# General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with the go-ethereum library. If not, see -# . - -# Usage: run `./cherrypick.sh` on a branch intended to become a release. -# -# Reads the contents of ./cherrypicks, filters out commits that are already -# ancestors of HEAD, and calls `git cherry-pick` with the remaining commit -# hashes. - -set -eu; -set -o pipefail; - -SELF_DIR=$(dirname "${0}") -# The format of the `cherrypicks` file is guaranteed by a test so we can use simple parsing here. -CHERRY_PICKS=$(< "${SELF_DIR}/cherrypicks" grep -Ev "^#" | awk '{print $1}') - -commits=() -for commit in ${CHERRY_PICKS}; do - git merge-base --is-ancestor "${commit}" HEAD && \ - echo "Skipping ${commit} already in history" && \ - continue; - - echo "Cherry-picking ${commit}"; - commits+=("${commit}"); -done - -if [[ -z "${commits[*]// }" ]]; then # $x// removes whitespace - echo "No commits to cherry-pick"; - exit 0; -fi - -git cherry-pick -S "${commits[@]}"; diff --git a/libevm/tooling/release/cherrypicks b/libevm/tooling/release/cherrypicks deleted file mode 100644 index 58eeb1b0287..00000000000 --- a/libevm/tooling/release/cherrypicks +++ /dev/null @@ -1,15 +0,0 @@ -# Lines starting with # are ignored as comments. -# All other lines MUST have the format [ # ]. -# Commits MUST be in chronological order. -# A test in release_test.go will enforce this / provide the correct lines to copy and paste. -# -# The very first commit is where libevm branched off geth and is included to confirm that it is skipped. -# -2bd6bd01d2e8561dd7fc21b631f4a34ac16627a1 # Merge branch 'master' into release/1.13 -99bbbc0277e34fc3a31512a345ba20874ae98e18 # internal/build, rpc: add missing HTTP response body Close() calls (#29223) -1e9bf2a09ed3d82ac1aa69750a556f3ce127721d # core/state: fix bug in statedb.Copy and remove unnecessary preallocation (#29563) -69f815f6f5791e0e48160bdad284773d0ffb1ba9 # params: print time value instead of pointer in ConfigCompatError (#29514) -e4b8058d5a5832cdebdac7da385cf6d829c0d433 # eth/gasprice: add query limit for FeeHistory to defend DDOS attack (#29644) -34b46a2f756da71595ac84eb7f25441f2a5b6ebb # core/state/snapshot: add a missing lock (#30001) -159fb1a1db551c544978dc16a5568a4730b4abf3 # crypto: add IsOnCurve check (#31100) -da71839a270a353bac92e3108e4b74fb0eefec29 # internal/ethapi: fix panic in debug methods (#31157) diff --git a/libevm/tooling/release/release_test.go b/libevm/tooling/release/release_test.go index 2415145bf2b..1159f57188d 100644 --- a/libevm/tooling/release/release_test.go +++ b/libevm/tooling/release/release_test.go @@ -22,23 +22,17 @@ import ( "fmt" "os" "path/filepath" - "regexp" "slices" - "sort" "strings" "testing" - "time" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" - "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/ava-labs/libevm/params" - - _ "embed" ) func TestMain(m *testing.M) { @@ -46,76 +40,6 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -var ( - //go:embed cherrypicks - cherryPicks string - lineFormatRE = regexp.MustCompile(`^([a-fA-F0-9]{40}) # (.*)$`) -) - -type parsedLine struct { - hash, commitMsg string -} - -func parseCherryPicks(t *testing.T) (rawLines []string, lines []parsedLine) { - t.Helper() - for i, line := range strings.Split(cherryPicks, "\n") { - if line == "" || strings.HasPrefix(line, "#") { - continue - } - - switch matches := lineFormatRE.FindStringSubmatch(line); len(matches) { - case 3: - rawLines = append(rawLines, line) - lines = append(lines, parsedLine{ - hash: matches[1], - commitMsg: matches[2], - }) - - default: - t.Errorf("Line %d is improperly formatted: %s", i, line) - } - } - return rawLines, lines -} - -func TestCherryPicksFormat(t *testing.T) { - rawLines, lines := parseCherryPicks(t) - if t.Failed() { - t.Fatalf("Required line regexp: %s", lineFormatRE.String()) - } - - commits := make([]struct { - obj *object.Commit - line parsedLine - }, len(lines)) - - repo := openGitRepo(t) - for i, line := range lines { - obj, err := repo.CommitObject(plumbing.NewHash(line.hash)) - require.NoErrorf(t, err, "%T.CommitObject(%q)", repo, line.hash) - - commits[i].obj = obj - commits[i].line = line - } - sort.Slice(commits, func(i, j int) bool { - ci, cj := commits[i].obj, commits[j].obj - return ci.Committer.When.Before(cj.Committer.When) - }) - - var want []string - for _, c := range commits { - msg := strings.Split(c.obj.Message, "\n")[0] - want = append( - want, - fmt.Sprintf("%s # %s", c.line.hash, msg), - ) - } - if diff := cmp.Diff(want, rawLines); diff != "" { - t.Errorf("Commits in `cherrypicks` file out of order or have incorrect commit message(s);\n(-want +got):\n%s", diff) - t.Logf("To fix, copy:\n%s", strings.Join(want, "\n")) - } -} - const ( defaultBranch = "main" releaseBranchPrefix = "release/" @@ -149,20 +73,8 @@ func TestBranchProperties(t *testing.T) { // 1. They are named release/v${libevm-version}; // 2. The libevm version's [params.ReleaseType] is appropriate for a release // branch; and -// 3. The commit history is a "linear fork" off the default branch, with only -// certain allowable commits. -// -// We define a "linear fork" as there being a single ancestral commit at which -// the release branch diverged from the default branch, with no merge commits -// after this divergence: -// -// ______________ main -// \___ release/* -// -// The commits in the release branch that are not in the default branch MUST be: -// -// 1. The cherry-pick commits embedded as [cherryPicks], in order; then -// 2. A single, final commit to change the libevm version. +// 3. The commit history since the default branch is only a single commit, to +// change the version. // // testReleaseBranch assumes that the git HEAD currently points at either // `targetBranch` itself, or at a candidate (i.e. PR source) for said branch. @@ -199,27 +111,10 @@ func testReleaseBranch(t *testing.T, targetBranch string) { newCommits := linearCommitsSince(t, history, fork) logCommits(t, "History since fork from default branch", newCommits) - t.Run("cherry_picked_commits", func(t *testing.T) { - _, cherryPick := parseCherryPicks(t) - wantCommits := commitsFromHashes(t, repo, cherryPick, fork) - logCommits(t, "Expected cherry-picks", wantCommits) - if got, want := len(newCommits), len(wantCommits)+1; got != want { - t.Fatalf("Got %d commits since fork from default; want number to be cherry-picked plus one (%d)", got, want) - } - - opt := compareCherryPickedCommits() - if diff := cmp.Diff(wantCommits, newCommits[:len(wantCommits)], opt); diff != "" { - t.Fatalf("Cherry-picked commits for release branch (-want +got):\n%s", diff) - } - }) - t.Run("final_commit", func(t *testing.T) { - n := len(newCommits) - last := newCommits[n-1] + require.Len(t, newCommits, 1, "Single commit off default branch") + last := newCommits[0] penultimate := fork - if n >= 2 { - penultimate = newCommits[n-2] - } lastCommitDiffs, err := object.DiffTree( treeFromCommit(t, last), @@ -293,25 +188,6 @@ func linearCommitsSince(t *testing.T, iter object.CommitIter, since *object.Comm return commits } -func commitsFromHashes(t *testing.T, repo *git.Repository, lines []parsedLine, skipAncestorsOf *object.Commit) []*object.Commit { - t.Helper() - - var commits []*object.Commit - for _, l := range lines { - c, err := repo.CommitObject(plumbing.NewHash(l.hash)) - require.NoError(t, err) - - skip, err := c.IsAncestor(skipAncestorsOf) - require.NoError(t, err) - if skip || c.Hash == skipAncestorsOf.Hash { - continue - } - commits = append(commits, c) - } - - return commits -} - func commitMsgFirstLine(c *object.Commit) string { return strings.Split(c.Message, "\n")[0] } @@ -323,25 +199,6 @@ func logCommits(t *testing.T, header string, commits []*object.Commit) { } } -// compareCherryPickedCommits returns a [cmp.Transformer] that converts -// [object.Commit] instances into structs carrying only the pertinent commit -// properties that remain stable when cherry-picked. Note, however, that this -// does not include the actual diffs induced by cherry-picking. -func compareCherryPickedCommits() cmp.Option { - type comparableCommit struct { - MessageFirstLine, Author string - Authored time.Time - } - - return cmp.Transformer("gitCommit", func(c *object.Commit) comparableCommit { - return comparableCommit{ - MessageFirstLine: commitMsgFirstLine(c), - Author: c.Author.String(), - Authored: c.Author.When, - } - }) -} - func treeFromCommit(t *testing.T, c *object.Commit) *object.Tree { t.Helper() tree, err := c.Tree()