diff --git a/.github/workflows/request-reviewers.yml b/.github/workflows/request-reviewers.yml new file mode 100644 index 000000000..98d2387e9 --- /dev/null +++ b/.github/workflows/request-reviewers.yml @@ -0,0 +1,81 @@ +--- +name: Request Reviewers + +on: + pull_request_target: + types: [opened, ready_for_review, reopened, synchronize] + paths: + - 'modules/' + +jobs: + request-reviewers: + runs-on: ubuntu-24.04 + if: vars.APP_ID + steps: + - uses: actions/checkout@v4.2.2 + with: + ref: ${{ github.base_ref }} + + - uses: cachix/install-nix-action@v31 + + - uses: cachix/cachix-action@v16 + with: + name: nix-community + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + continue-on-error: true + + - uses: actions/create-github-app-token@v2 + id: app-token + with: + app-id: ${{ vars.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + permission-contents: read + permission-pull-requests: write + + - run: nix build .#subsystem-maintainers + + - id: get-reviewers + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAX_REVIEWERS: 5 + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + printf \ + 'reviewers=%s\n' \ + "$( + gh pr diff --name-only "$PR_NUMBER" | + jq \ + --argjson max_reviewers "$MAX_REVIEWERS" \ + --raw-input \ + --raw-output \ + --slurp \ + --slurpfile maintainers result ' + ($maintainers[0] | keys_unsorted) as $subsystems | + split("\n") as $changed_files | + [ + $changed_files[] as $changed_file | + ( + $maintainers[0][ + $subsystems[] | + select( + . as $subsystem | + $changed_file | + startswith($subsystem) + ) + ] + )[] + ] | + unique | + if length <= $max_reviewers then + . | join(",") + else + "" + end + ' + )" \ + >>"$GITHUB_OUTPUT" + + - uses: AveryCameronUofR/add-reviewer-gh-action@1.0.3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + reviewers: ${{ steps.get-reviewers.outputs.reviewers }} diff --git a/flake/dev/default.nix b/flake/dev/default.nix index 953bcdd27..18075861c 100644 --- a/flake/dev/default.nix +++ b/flake/dev/default.nix @@ -4,7 +4,8 @@ ./dev-shell.nix ./packages.nix ./pre-commit.nix - ./treefmt.nix ./public-and-dev-version-consistency.nix + ./subsystem-maintainers.nix + ./treefmt.nix ]; } diff --git a/flake/dev/subsystem-maintainers.nix b/flake/dev/subsystem-maintainers.nix new file mode 100644 index 000000000..d978f3864 --- /dev/null +++ b/flake/dev/subsystem-maintainers.nix @@ -0,0 +1,17 @@ +{ lib, ... }: +{ + perSystem = + { pkgs, ... }: + { + packages.subsystem-maintainers = pkgs.writeText "subsystem-maintainers" ( + lib.pipe ../../stylix/meta.nix [ + (lib.flip pkgs.callPackage { }) + (lib.mapAttrs ( + _: meta: map (maintainer: maintainer.github) (meta.maintainers or [ ]) + )) + (lib.mapAttrs' (name: lib.nameValuePair "modules/${name}/")) + builtins.toJSON + ] + ); + }; +} diff --git a/flake/propagated-packages.nix b/flake/propagated-packages.nix index 215458de2..ebc2a75b2 100644 --- a/flake/propagated-packages.nix +++ b/flake/propagated-packages.nix @@ -24,6 +24,7 @@ { inherit (config.partitions.dev.module.flake.packages.${system}) all-maintainers + subsystem-maintainers ; } (lib.mkIf pkgs.stdenv.hostPlatform.isLinux (