From 1cb1956a68e7d8b6bf693d41299467bb0f1b6a7a Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 27 Apr 2021 20:04:20 +0800 Subject: [PATCH 1/2] Support to open pull request to another repo (#70) * support custom token and repo * print post url if there's error * update as comments * Update README.md Co-authored-by: Vanessasaurus <814322+vsoch@users.noreply.github.com> --- README.md | 4 ++++ pull-request.py | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f07d5f4..2d8d756 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ Unlike standard actions, this action just uses variables from the environment. | Name | Description | Required | Default | |------|-------------|----------|---------| | BRANCH_PREFIX | the prefix to filter to. If the branch doesn't start with the prefix, it will be ignored | false | "" | +| PULL_REQUEST_REPOSITORY | Choose another repository instead of default GITHUB_REPOSITORY for the PR | false | | +| PULL_REQUEST_TOKEN | [Personal Access Token(PAT)](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) only if you define a different repository with PULL_REQUEST_REPOSITORY | false | | | PULL_REQUEST_BRANCH | open pull request against this branch | false | master | | PULL_REQUEST_FROM_BRANCH | if a branch isn't found in your GitHub payload, use this branch | false | | | PULL_REQUEST_BODY | the body for the pull request | false | | @@ -71,6 +73,8 @@ an issue or PR, they are ignored otherwise. The `GITHUB_TOKEN` secret is required to interact and authenticate with the GitHub API to open the pull request. The example is [deployed here](https://github.com/vsoch/pull-request-action-example) with an example opened (and merged) [pull request here](https://github.com/vsoch/pull-request-action-example/pull/1) if needed. +If you want to create a pull request to another repository, for example, a pull request to the upstream repository, you need to define PULL_REQUEST_REPOSITORY and PULL_REQUEST_TOKEN. The PULL_REQUEST_TOKEN is one [Personal Access Token(PAT)](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token), which can be save in the [encrypted secrets](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository) + ## Outputs The action sets a few useful output and environment variables. An output can diff --git a/pull-request.py b/pull-request.py index 9b2ca7b..ff569d0 100755 --- a/pull-request.py +++ b/pull-request.py @@ -108,6 +108,7 @@ def open_pull_request(title, body, target, source, is_draft=False, can_modify=Tr print("Data for opening pull request: %s" % data) response = requests.post(PULLS_URL, json=data, headers=HEADERS) if response.status_code != 201: + print(f"pull request url is {PULLS_URL}") abort_if_fail(response, "Unable to create pull request") return response @@ -268,14 +269,17 @@ def add_reviewers(entry, reviewers, team_reviewers): API_VERSION = "v3" BASE = "https://api.github.com" +PR_TOKEN = os.environ.get("PULL_REQUEST_TOKEN") or get_envar("GITHUB_TOKEN") +PR_REPO = os.environ.get("PULL_REQUEST_REPOSITORY") or get_envar("GITHUB_REPOSITORY") + HEADERS = { - "Authorization": "token %s" % get_envar("GITHUB_TOKEN"), + "Authorization": "token %s" % PR_TOKEN, "Accept": "application/vnd.github.%s+json;application/vnd.github.antiope-preview+json;application/vnd.github.shadow-cat-preview+json" % API_VERSION, } # URLs -REPO_URL = "%s/repos/%s" % (BASE, get_envar("GITHUB_REPOSITORY")) +REPO_URL = "%s/repos/%s" % (BASE, PR_REPO) ISSUE_URL = "%s/issues" % REPO_URL PULLS_URL = "%s/pulls" % REPO_URL From c0bf76830be9ab4d30f5c624de05a1d2bedc94ac Mon Sep 17 00:00:00 2001 From: Danny Sauer Date: Mon, 21 Jun 2021 09:42:07 -0500 Subject: [PATCH 2/2] Use repo's default branch if no branch specified --- pull-request.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pull-request.py b/pull-request.py index ff569d0..f95ad1d 100755 --- a/pull-request.py +++ b/pull-request.py @@ -234,6 +234,22 @@ def find_pull_request(listing, source): return entry +def find_default_branch(): + """Find default branch for a repo (only called if branch not provided) + """ + response = requests.get(REPO_URL) + + # Case 1: 404 might need a token + if response.status_code == 404: + response = requests.get(REPO_URL, headers=HEADERS) + if response.status_code != 200: + abort_if_fail(response, "Unable to retrieve default branch") + + default_branch = response.json()["default_branch"] + print("Found default branch: %s" % default_branch) + return default_branch + + def add_reviewers(entry, reviewers, team_reviewers): """Given regular or team reviewers, add them to a PR. @@ -343,8 +359,8 @@ def main(): if not branch_prefix: print("No branch prefix is set, all branches will be used.") - # Default to master to support older, will eventually change to main - pull_request_branch = os.environ.get("PULL_REQUEST_BRANCH", "master") + # Default to project default branch if none provided + pull_request_branch = os.environ.get("PULL_REQUEST_BRANCH", find_default_branch()) print("Pull requests will go to %s" % pull_request_branch) # Pull request draft