go-ethereum/libevm/tooling/release/cherrypick.sh
Arran Schlosberg 00c10cf539
feat: release-branch automation (#137)
## Why this should be merged

Closes #25 

## How this works

See https://github.com/ava-labs/libevm/discussions/126.

The code is in a new module to (a) avoid polluting the root `go.mod`
file and (b) because `go-git` requires a newer version of Go.
Unfortunately `go-git` doesn't support cherry-picking yet so a Bash
script had to be used for that bit `#!/sad`.

## How this was tested

Inspection of output when running `cherrypick.sh` (with `set -x` added)
from the current branch.

```
...
...
+ CHERRY_PICKS='2bd6bd01d2e8561dd7fc21b631f4a34ac16627a1
99bbbc0277
1e9bf2a09e
69f815f6f5
e4b8058d5a
34b46a2f75
159fb1a1db
da71839a270a353bac92e3108e4b74fb0eefec29'
...
Skipping 2bd6bd01d2 already in history
...
Cherry-picking 99bbbc0277
...
Cherry-picking 1e9bf2a09e
...
Cherry-picking 69f815f6f5
...
Cherry-picking e4b8058d5a
...
Cherry-picking 34b46a2f75
...
Cherry-picking 159fb1a1db
...
Cherry-picking da71839a27
...
+ git cherry-pick 99bbbc0277 1e9bf2a09e 69f815f6f5 e4b8058d5a 34b46a2f75 159fb1a1db da71839a27
```
2025-02-14 16:09:41 +00:00

47 lines
1.6 KiB
Bash
Executable file

#!/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
# <http://www.gnu.org/licenses/>.
# 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 -Pv "^#" | 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 "${commits[@]}";