Skip to content

Commit 93584b4

Browse files
Add go-version check to avoid introduces an version that we cannot support yet
1 parent 16c6783 commit 93584b4

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

.github/workflows/go-verdiff.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: go-verdiff
2+
on:
3+
pull_request:
4+
paths:
5+
- '**.mod'
6+
- '.github/workflows/go-verdiff.yaml'
7+
branches:
8+
- main
9+
jobs:
10+
go-verdiff:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
with:
15+
fetch-depth: 0
16+
- name: Check golang version
17+
run: hack/tools/check-go-version.sh "${{ github.event.pull_request.base.sha }}"

hack/tools/check-go-version.sh

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/bin/bash
2+
3+
BASE_REF=${1:-main}
4+
GO_VER=$(sed -En 's/^go (.*)$/\1/p' "go.mod")
5+
OLDIFS="${IFS}"
6+
IFS='.' MAX_VER=(${GO_VER})
7+
IFS="${OLDIFS}"
8+
9+
if [ ${#MAX_VER[*]} -ne 3 -a ${#MAX_VER[*]} -ne 2 ]; then
10+
echo "Invalid go version: ${GO_VER}"
11+
exit 1
12+
fi
13+
14+
GO_MAJOR=${MAX_VER[0]}
15+
GO_MINOR=${MAX_VER[1]}
16+
GO_PATCH=${MAX_VER[2]}
17+
18+
RETCODE=0
19+
20+
check_version () {
21+
local whole=$1
22+
local file=$2
23+
OLDIFS="${IFS}"
24+
IFS='.' ver=(${whole})
25+
IFS="${OLDIFS}"
26+
27+
if [ ${ver[0]} -gt ${GO_MAJOR} ]; then
28+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
29+
return 1
30+
fi
31+
if [ ${ver[1]} -gt ${GO_MINOR} ]; then
32+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
33+
return 1
34+
fi
35+
36+
if [ ${#ver[*]} -eq 2 ] ; then
37+
return 0
38+
fi
39+
if [ ${#ver[*]} -ne 3 ] ; then
40+
echo "${file}: ${whole}: Badly formatted golang version"
41+
return 1
42+
fi
43+
44+
if [ ${ver[1]} -eq ${GO_MINOR} -a ${ver[2]} -gt ${GO_PATCH} ]; then
45+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
46+
return 1
47+
fi
48+
return 0
49+
}
50+
51+
echo "Found golang version: ${GO_VER}"
52+
53+
for f in $(find . -name "*.mod"); do
54+
v=$(sed -En 's/^go (.*)$/\1/p' ${f})
55+
if [ -z ${v} ]; then
56+
echo "${f}: Skipping, no version found"
57+
continue
58+
fi
59+
if ! check_version ${v} ${f}; then
60+
RETCODE=1
61+
fi
62+
old=$(git grep -ohP '^go .*$' "${BASE_REF}" -- "${f}")
63+
old=${old#go }
64+
new=$(git grep -ohP '^go .*$' "${f}")
65+
new=${new#go }
66+
# If ${old} is empty, it means this is a new .mod file
67+
if [ -z "${old}" ]; then
68+
continue
69+
fi
70+
# Check if patch version remains 0: X.x.0 <-> X.x
71+
if [ "${new}.0" == "${old}" -o "${new}" == "${old}.0" ]; then
72+
continue
73+
fi
74+
if [ "${new}" != "${old}" ]; then
75+
echo "${f}: ${v}: Updated golang version from ${old}"
76+
RETCODE=1
77+
fi
78+
done
79+
80+
exit ${RETCODE}

0 commit comments

Comments
 (0)