mirror of
https://github.com/jlengrand/error-prone-support.git
synced 2026-03-10 08:11:25 +00:00
Publish Error Prone compatibility matrix on website (#938)
The new `website/generate-version-compatibility-overview.sh` script tests all combinations, and stores the result in a Jekyll data file. Resolves #724.
This commit is contained in:
committed by
GitHub
parent
0aa612073f
commit
aa1cfd9071
@@ -14,6 +14,7 @@ plugins:
|
|||||||
exclude:
|
exclude:
|
||||||
- Gemfile
|
- Gemfile
|
||||||
- Gemfile.lock
|
- Gemfile.lock
|
||||||
|
- generate-version-compatibility-overview.sh
|
||||||
- README.md
|
- README.md
|
||||||
- vendor
|
- vendor
|
||||||
|
|
||||||
|
|||||||
82
website/_data/compatibility.yml
Normal file
82
website/_data/compatibility.yml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# An overview of Error Prone Support releases, along with compatible Error
|
||||||
|
# Prone releases. This data was generated by `generate-version-compatibility-overview.sh`.
|
||||||
|
releases:
|
||||||
|
- version: 0.14.0
|
||||||
|
compatible:
|
||||||
|
- "2.24.0"
|
||||||
|
- "2.23.0"
|
||||||
|
- "2.22.0"
|
||||||
|
- version: 0.13.0
|
||||||
|
compatible:
|
||||||
|
- "2.22.0"
|
||||||
|
- "2.21.1"
|
||||||
|
- "2.21.0"
|
||||||
|
- "2.20.0"
|
||||||
|
- version: 0.12.0
|
||||||
|
compatible:
|
||||||
|
- "2.22.0"
|
||||||
|
- "2.21.1"
|
||||||
|
- "2.21.0"
|
||||||
|
- "2.20.0"
|
||||||
|
- version: 0.11.1
|
||||||
|
compatible:
|
||||||
|
- "2.19.1"
|
||||||
|
- "2.19.0"
|
||||||
|
- version: 0.11.0
|
||||||
|
compatible:
|
||||||
|
- "2.19.1"
|
||||||
|
- "2.19.0"
|
||||||
|
- version: 0.10.0
|
||||||
|
compatible:
|
||||||
|
- "2.18.0"
|
||||||
|
- version: 0.9.0
|
||||||
|
compatible:
|
||||||
|
- "2.18.0"
|
||||||
|
- version: 0.8.0
|
||||||
|
compatible:
|
||||||
|
- "2.18.0"
|
||||||
|
- version: 0.7.0
|
||||||
|
compatible:
|
||||||
|
- "2.17.0"
|
||||||
|
- version: 0.6.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- version: 0.5.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- version: 0.4.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- "2.15.0"
|
||||||
|
- "2.14.0"
|
||||||
|
- "2.13.1"
|
||||||
|
- "2.13.0"
|
||||||
|
- "2.12.1"
|
||||||
|
- "2.12.0"
|
||||||
|
- version: 0.3.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- "2.15.0"
|
||||||
|
- "2.14.0"
|
||||||
|
- "2.13.1"
|
||||||
|
- "2.13.0"
|
||||||
|
- "2.12.1"
|
||||||
|
- "2.12.0"
|
||||||
|
- version: 0.2.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- "2.15.0"
|
||||||
|
- "2.14.0"
|
||||||
|
- "2.13.1"
|
||||||
|
- "2.13.0"
|
||||||
|
- "2.12.1"
|
||||||
|
- "2.12.0"
|
||||||
|
- version: 0.1.0
|
||||||
|
compatible:
|
||||||
|
- "2.16"
|
||||||
|
- "2.15.0"
|
||||||
|
- "2.14.0"
|
||||||
|
- "2.13.1"
|
||||||
|
- "2.13.0"
|
||||||
|
- "2.12.1"
|
||||||
|
- "2.12.0"
|
||||||
36
website/compatibility.md
Normal file
36
website/compatibility.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Compatibility matrix
|
||||||
|
nav_order: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Compatibility matrix
|
||||||
|
|
||||||
|
{% comment %}
|
||||||
|
XXX: Once available on the default branch, include a link to the
|
||||||
|
`generate-version-compatibility-overview.sh` script.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
Error Prone Support releases are generally compatible with only a limited
|
||||||
|
number of Error Prone releases. The table below shows, for each Error Prone
|
||||||
|
Support release, the Error Prone versions it is expected to be compatible with.
|
||||||
|
Compatibility is determined by:
|
||||||
|
1. Compiling and testing the Error Prone Support release source code against a
|
||||||
|
given Error Prone version. This validates source and behavioral
|
||||||
|
compatibility.[^1] [^2]
|
||||||
|
2. Applying the released Refaster rules using a given Error Prone version. This
|
||||||
|
validates that the rules can be read by the targeted version of Error Prone,
|
||||||
|
proving that the serialization format is compatible.
|
||||||
|
|
||||||
|
| Error Prone Support version | Compatible Error Prone versions |
|
||||||
|
| --------------------------- | ------------------------------- |
|
||||||
|
{% for release in site.data.compatibility.releases -%}
|
||||||
|
| [{{ release.version }}](https://github.com/PicnicSupermarket/error-prone-support/releases/tag/v{{ release.version }}) | {%
|
||||||
|
for version in release.compatible -%}
|
||||||
|
[{{ version }}](https://github.com/google/error-prone/releases/tag/v{{ version }}){% unless forloop.last %}, {% endunless %}
|
||||||
|
{%- endfor %} |
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
[^1]: Note that this [does not prove][source-binary-compat] that the Error Prone Support and Error Prone versions are _binary_ compatible. This limitation does not appear to be an issue in practice.
|
||||||
|
[^2]: The approach taken here may yield false negatives, because a reported incompatibility may merely be due to a test API incompatibility.
|
||||||
|
[source-binary-compat]: https://stackoverflow.com/questions/57871898/
|
||||||
86
website/generate-version-compatibility-overview.sh
Executable file
86
website/generate-version-compatibility-overview.sh
Executable file
@@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Determines, for each Error Prone Support release, with which Error Prone
|
||||||
|
# releases it is (very likely to be) compatible. The result is written to
|
||||||
|
# `./_data/compatibility.yml`, which is a source for `./compatibility.md`.
|
||||||
|
|
||||||
|
# This script relies on SDKMAN! to install compatible Maven versions.
|
||||||
|
export SDKMAN_OFFLINE_MODE=false
|
||||||
|
source "${HOME}/.sdkman/bin/sdkman-init.sh"
|
||||||
|
|
||||||
|
set -e -u -o pipefail
|
||||||
|
|
||||||
|
output_file="$(dirname "${0}")/_data/compatibility.yml"
|
||||||
|
|
||||||
|
ep_versions=$(
|
||||||
|
git ls-remote \
|
||||||
|
--exit-code --refs --sort='-v:refname' \
|
||||||
|
https://github.com/google/error-prone.git \
|
||||||
|
'v*.*' \
|
||||||
|
| grep -oP '(?<=/v)[^/]+$'
|
||||||
|
)
|
||||||
|
|
||||||
|
work_dir="$(mktemp -d)"
|
||||||
|
trap 'rm -rf -- "${work_dir=}"' INT TERM HUP EXIT
|
||||||
|
build_log="${work_dir}/build.log"
|
||||||
|
|
||||||
|
git clone -q git@github.com:PicnicSupermarket/error-prone-support.git "${work_dir}"
|
||||||
|
pushd "${work_dir}" > /dev/null
|
||||||
|
|
||||||
|
eps_versions="$(git tag --list --sort='-v:refname' 'v*.*.*')"
|
||||||
|
|
||||||
|
# Check out the source of each Error Prone Support release, and try to build
|
||||||
|
# and test it against each Error Prone release.
|
||||||
|
for eps_version in ${eps_versions}; do
|
||||||
|
git checkout --force "${eps_version}" --
|
||||||
|
|
||||||
|
# Make sure to build with a compatible version of Maven.
|
||||||
|
mvn_version="$(grep -oP '(?<=<version.maven>)[^>]+(?=</version.maven>)' pom.xml)"
|
||||||
|
(set +u && echo n | sdk install maven "${mvn_version}")
|
||||||
|
sdk use maven "${mvn_version}"
|
||||||
|
|
||||||
|
# Remove any Error Prone flags used by this build that may not be compatible
|
||||||
|
# with the targeted version of Error Prone. Removal of these build flags does
|
||||||
|
# not influence the compatibility assessment.
|
||||||
|
sed -i -r 's,-XepAllSuggestionsAsWarnings|-Xep:\w+:\w+,,g' pom.xml
|
||||||
|
|
||||||
|
# Using each Error Prone release, attempt to build and test the source, while
|
||||||
|
# also applying the Maven Central-hosted Refaster rules. This determines
|
||||||
|
# source and behavioral (in)compatibility with Error Prone APIs, while also
|
||||||
|
# assessing whether the Refaster rules are deserialization-compatible.
|
||||||
|
for ep_version in ${ep_versions}; do
|
||||||
|
echo "Testing Error Prone Support ${eps_version} with Error Prone ${ep_version}..."
|
||||||
|
mvn clean test \
|
||||||
|
-Perror-prone \
|
||||||
|
-Derror-prone.patch-checks=Refaster \
|
||||||
|
-Ppatch \
|
||||||
|
-Pself-check \
|
||||||
|
-Dverification.skip \
|
||||||
|
-Dversion.error-prone-orig="${ep_version}" \
|
||||||
|
&& echo "SUCCESS: { \"eps_version\": \"${eps_version}\", \"ep_version\": \"${ep_version}\" }" || true
|
||||||
|
# Undo any changes applied by Refaster.
|
||||||
|
git checkout -- '*.java'
|
||||||
|
done
|
||||||
|
done | tee "${build_log}"
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# Regenerate the Jekyll compatibility data file by extracting the collected
|
||||||
|
# data from the build log.
|
||||||
|
cat > "${output_file}" << EOF
|
||||||
|
# An overview of Error Prone Support releases, along with compatible Error
|
||||||
|
# Prone releases. This data was generated by \`$(basename "${0}")\`.
|
||||||
|
EOF
|
||||||
|
grep -oP '(?<=SUCCESS: ).*' "${build_log}" \
|
||||||
|
| jq -s '.' \
|
||||||
|
| yq -r '
|
||||||
|
{
|
||||||
|
"releases":
|
||||||
|
group_by(.eps_version)
|
||||||
|
| map({
|
||||||
|
"version": .[0].eps_version | sub("^v", ""),
|
||||||
|
"compatible": map(.ep_version)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
' \
|
||||||
|
| tee -a "${output_file}"
|
||||||
Reference in New Issue
Block a user