diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 00000000..986c15a0 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,13 @@ +ci: + - changed-files: + - any-glob-to-any-file: .github/** +test: + - changed-files: + - any-glob-to-any-file: fuzz/** + - any-glob-to-any-file: '*/tests/**' + - any-glob-to-any-file: 'dep_test' + - any-glob-to-any-file: 'contrib/test.sh' + - any-glob-to-any-file: '*/contrib/test.sh' +doc: + - changed-files: + - any-glob-to-any-file: '**/*.md' diff --git a/.github/workflows/manage-pr.yml b/.github/workflows/manage-pr.yml new file mode 100644 index 00000000..1ae25001 --- /dev/null +++ b/.github/workflows/manage-pr.yml @@ -0,0 +1,26 @@ +name: Manage PR +on: + - pull_request_target + +jobs: + labeler: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - name: Checkout master + uses: actions/checkout@v4 + with: + path: master + - name: Checkout merge commit + uses: actions/checkout@v4 + with: + path: merge + ref: "refs/pull/${{ github.event.number }}/merge" + - name: Generate label config + run: cd master && SCAN_DIR=../merge ./contrib/gen_label_config.sh + - name: Update labels + uses: actions/labeler@v5 + with: + configuration-path: master/.github/labeler.yml diff --git a/contrib/gen_label_config.sh b/contrib/gen_label_config.sh new file mode 100755 index 00000000..1f88145a --- /dev/null +++ b/contrib/gen_label_config.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e + +# Generates the label configuration using crates in the repository. +# The label configuration is appended to the labeler config file. + +config=.github/labeler.yml + +if [ -n "$SCAN_DIR" ]; +then + scan_dir="$SCAN_DIR" +else + scan_dir=. +fi + +if [ "$1" '!=' "--force" ] && ! git diff --exit-code "$config"; +then + echo "Error: $config is not committed." + echo "Refusing to overwrite it to prevent disaster." + echo "Run the script with --force to override this." + exit 1 +fi + +excluded_crates="fuzz|dep_test" + +CRATES="`cd "$scan_dir" && cargo metadata --no-deps --format-version 1 | jq -j -r '.packages | map(.manifest_path | rtrimstr("/Cargo.toml") | ltrimstr("'$PWD'/")) | join(" ")'`" + +for crate in $CRATES; +do + if echo "$crate" | grep -qE "$excluded_crates"; + then + continue + fi + + echo "C-$crate:" >> "$config" + echo " - changed-files:" >> "$config" + echo " - any-glob-to-any-file: $crate/**" >> "$config" +done