diff --git a/.github/workflows/new-prs.yml b/.github/workflows/new-prs.yml index 9ba55d59ff15b..18caa408df57b 100644 --- a/.github/workflows/new-prs.yml +++ b/.github/workflows/new-prs.yml @@ -15,16 +15,43 @@ on: - synchronize jobs: - automate-prs-labels: + greeter: + runs-on: ubuntu-latest permissions: pull-requests: write + # Only comment on PRs that have been opened for the first time, by someone + # new to LLVM or to GitHub as a whole. + if: >- + (github.repository == 'llvm/llvm-project') && + (github.event.action == 'opened') && + (github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' || + github.event.pull_request.author_association == 'FIRST_TIMER') + steps: + - name: Setup Automation Script + run: | + curl -O -L --fail https://raw.githubusercontent.com/"$GITHUB_REPOSITORY"/main/llvm/utils/git/github-automation.py + curl -O -L --fail https://raw.githubusercontent.com/"$GITHUB_REPOSITORY"/main/llvm/utils/git/requirements.txt + chmod a+x github-automation.py + pip install -r requirements.txt + + - name: Greet Author + run: | + ./github-automation.py \ + --token '${{ secrets.GITHUB_TOKEN }}' \ + pr-greeter \ + --issue-number "${{ github.event.pull_request.number }}" + + automate-prs-labels: + # Greet first so that only the author gets that notification. + needs: greeter runs-on: ubuntu-latest # Ignore PRs with more than 10 commits. Pull requests with a lot of # commits tend to be accidents usually when someone made a mistake while trying # to rebase. We want to ignore these pull requests to avoid excessive # notifications. + # always() means that even if greeter is skipped, this job will run. if: > - github.repository == 'llvm/llvm-project' && + always() && github.repository == 'llvm/llvm-project' && github.event.pull_request.draft == false && github.event.pull_request.commits < 10 steps: diff --git a/llvm/utils/git/github-automation.py b/llvm/utils/git/github-automation.py index ad1878d411939..dae87bf0c3847 100755 --- a/llvm/utils/git/github-automation.py +++ b/llvm/utils/git/github-automation.py @@ -211,6 +211,39 @@ def _get_curent_team(self) -> Optional[github.Team.Team]: return None +class PRGreeter: + def __init__(self, token: str, repo: str, pr_number: int): + repo = github.Github(token).get_repo(repo) + self.pr = repo.get_issue(pr_number).as_pull_request() + + def run(self) -> bool: + # We assume that this is only called for a PR that has just been opened + # by a user new to LLVM and/or GitHub itself. + + # This text is using Markdown formatting. + comment = f"""\ +Thank you for submitting a Pull Request (PR) to the LLVM Project! + +This PR will be automatically labeled and the relevant teams will be +notified. + +If you wish to, you can add reviewers by using the "Reviewers" section on this page. + +If this is not working for you, it is probably because you do not have write +permissions for the repository. In which case you can instead tag reviewers by +name in a comment by using `@` followed by their GitHub username. + +If you have received no comments on your PR for a week, you can request a review +by "ping"ing the PR by adding a comment “Ping”. The common courtesy "ping" rate +is once a week. Please remember that you are asking for valuable time from other developers. + +If you have further questions, they may be answered by the [LLVM GitHub User Guide](https://llvm.org/docs/GitHub.html). + +You can also ask questions in a comment on this PR, on the [LLVM Discord](https://discord.com/invite/xS7Z362) or on the [forums](https://discourse.llvm.org/).""" + self.pr.as_issue().create_comment(comment) + return True + + def setup_llvmbot_git(git_dir="."): """ Configure the git repo in `git_dir` with the llvmbot account so @@ -655,6 +688,9 @@ def execute_command(self) -> bool: pr_subscriber_parser.add_argument("--label-name", type=str, required=True) pr_subscriber_parser.add_argument("--issue-number", type=int, required=True) +pr_greeter_parser = subparsers.add_parser("pr-greeter") +pr_greeter_parser.add_argument("--issue-number", type=int, required=True) + release_workflow_parser = subparsers.add_parser("release-workflow") release_workflow_parser.add_argument( "--llvm-project-dir", @@ -705,6 +741,9 @@ def execute_command(self) -> bool: args.token, args.repo, args.issue_number, args.label_name ) pr_subscriber.run() +elif args.command == "pr-greeter": + pr_greeter = PRGreeter(args.token, args.repo, args.issue_number) + pr_greeter.run() elif args.command == "release-workflow": release_workflow = ReleaseWorkflow( args.token,