diff --git a/.github/workflows/diff-release.yml b/.github/workflows/diff-release.yml new file mode 100644 index 00000000..b66a0fa4 --- /dev/null +++ b/.github/workflows/diff-release.yml @@ -0,0 +1,46 @@ +# Show differences between the submitted manifest and the previous +# release of the same crate, to enable easier catching of problems + +name: Diff release + +on: + pull_request: + paths: + - 'index/**.toml' + +jobs: + + diff: + + runs-on: ubuntu-latest + + steps: + - name: Check out alire-index + uses: actions/checkout@v2 + with: + fetch-depth: 0 + # Needed to be able to diff and obtain changed files. Furthermore, we + # need the full history or else grafted partial branches confuse the + # changed files detector + +# - name: Set up GNAT toolchain (FSF) +# uses: ada-actions/toolchain@ce2020 +# with: +# distrib: fsf # faster install? + + - name: Set up stable `alr` + if: contains(github.base_ref, 'stable-') + uses: alire-project/setup-alire@v1 + with: + toolchain: --disable-assistant # We don't need the compiler + + - name: Set up devel `alr` + if: contains(github.base_ref, 'devel-') + uses: alire-project/setup-alire@v1 + with: + toolchain: --disable-assistant # We don't need the compiler + branch: master + + - name: Diff releases + run: scripts/diff-release.sh || true # No deal breaker if failed + shell: bash \ No newline at end of file diff --git a/scripts/diff-release.sh b/scripts/diff-release.sh new file mode 100755 index 00000000..a44fef61 --- /dev/null +++ b/scripts/diff-release.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +trap 'echo "ERROR at line ${LINENO} (code: $?)" >&2' ERR +trap 'echo "Interrupted" >&2 ; exit 1' INT + +set -o errexit +set -o nounset + +# Ensure all alr runs are non-interactive +alias alr="alr -n" + +# Detect changes +CHANGES=$(git diff --name-only HEAD~1) + +# Bulk changes for the record +echo Changed files: $CHANGES + +# Disable assistant. This is necessary despite the setup-alire action doing it +# too, because we sometimes run inside a Docker with fresh configuration +alr toolchain --disable-assistant + +# Configure index +alr index --del local >/dev/null || true # Simplifies local testing +alr index --name local --add ./index + +# Remove community index in case it has been added before +alr index --del community >/dev/null || true + +diff_opts=(--minimal -U0 --line-prefix "--| " --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol) + +function diff_one() { + local file="$1" + local folder=$(dirname $file) + local crate=$(basename $file .toml | cut -f1 -d-) + local version=$(basename $file .toml | cut -f2- -d-) + local milestone="$crate=$version" + + echo " " + echo "------8<------" + + if echo $milestone | grep -q external; then + echo DIFFING external: $milestone + git diff "${diff_opts[@]}" HEAD~1 -- $file + else + echo DIFFING release: $milestone + + # Locate the immediately precedent release + + # For a first release, there's nothing to compare + if [ $(ls $folder | grep -v external | wc -l) -eq 1 ]; then + echo NOTHING to diff against, first crate release + return 0 + fi + + # Othewise, get from alr what's the immediately preceding version + local prev_milestone=$(alr show "$crate<$version" | head -1 | cut -f1 -d:) + echo DIFFING milestones $prev_milestone '-->' $milestone + + if [ "$prev_milestone" == "ERROR" ]; then + echo ERROR extracting milestone: + alr show "$crate<$version" + return 1 + fi + + # Convert into filename + local prev_file=$folder/${prev_milestone//=/-}.toml + + git diff --no-index "${diff_opts[@]}" -- $prev_file $file + fi + + return 0 +} + +for file in $CHANGES; do + diff_one "$file" || true # keep on trying for different files +done