6 Commits

Author SHA1 Message Date
vsoch
2ca266185d updating changelog preparing for release
Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2021-04-18 19:54:26 -06:00
Max Anderson
e2a437cdbd Prevent unhandled exception when running via schedule (#69)
* Prevent unhandled exception when running via schedule
2021-04-18 19:53:12 -06:00
Vanessasaurus
2d5c80f215 dont use version for examples, stick to master (#67)
* dont use version for examples, stick to master
* add note about it being important to use stable release in README.md

Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2021-03-27 19:08:35 -06:00
Vanessasaurus
7f0d383d15 adding back assignees variable (#65)
Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2021-02-15 10:51:43 -07:00
Vanessasaurus
6d137cdd42 adding changes to update a PR (#60)
* adding changes to update a pr
including a second envar to set a state, along with refactor
of main body to be multiple functions, and adding docstrings
* fixing missing variable
* Try removing maintainer can modify
* Update pull-request.py

Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2021-02-12 17:42:23 -07:00
Vanessasaurus
ebce8e4918 making abort_if_fail more verbose (#57)
Signed-off-by: vsoch <vsochat@stanford.edu>
2020-12-18 04:05:17 -07:00
10 changed files with 303 additions and 194 deletions

View File

@@ -14,6 +14,8 @@ represented by the pull requests that fixed them. Critical items to know are:
Versions correspond with GitHub releases that can be referenced with @ using actions. Versions correspond with GitHub releases that can be referenced with @ using actions.
## [master](https://github.com/vsoch/pull-request-action/tree/master) (master) ## [master](https://github.com/vsoch/pull-request-action/tree/master) (master)
- bugfix of missing from branch with scheduled run (1.0.16)
- forgot to add assignees (1.0.15)
- output and environment variables for PR number and return codes (1.0.5) - output and environment variables for PR number and return codes (1.0.5)
- added support for reviewer (individual and team) assignments (1.0.4) - added support for reviewer (individual and team) assignments (1.0.4)
- added support for maintainer can modify and assignees (1.0.3) - added support for maintainer can modify and assignees (1.0.3)

View File

@@ -22,13 +22,16 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@1.0.6 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"
PULL_REQUEST_BRANCH: "master" PULL_REQUEST_BRANCH: "master"
``` ```
**Important**: Make sure to use a stable [release](https://github.com/vsoch/pull-request-action/releases) instead of a branch for your workflow.
## Environment Variable Inputs ## Environment Variable Inputs
Unlike standard actions, this action just uses variables from the environment. Unlike standard actions, this action just uses variables from the environment.
@@ -47,6 +50,8 @@ Unlike standard actions, this action just uses variables from the environment.
| PULL_REQUEST_TEAM_REVIEWERS | A list (string with spaces) of teams to assign review | false | unset | | PULL_REQUEST_TEAM_REVIEWERS | A list (string with spaces) of teams to assign review | false | unset |
| PASS_ON_ERROR | Instead of failing on an error response, pass | unset | | PASS_ON_ERROR | Instead of failing on an error response, pass | unset |
| PASS_IF_EXISTS | Instead of failing if the pull request already exists, pass | unset | | PASS_IF_EXISTS | Instead of failing if the pull request already exists, pass | unset |
| PULL_REQUEST_UPDATE | If the pull request already exists, update it | unset |
| PULL_REQUEST_STATE | If `PULL_REQUEST_UPDATE` is true, update to this state (open, closed) | open |
For `PULL_REQUEST_DRAFT`, `PASS_ON_ERROR`, `PASS_IF_EXISTS`, and `MAINTAINER_CANT_MODIFY`, these are For `PULL_REQUEST_DRAFT`, `PASS_ON_ERROR`, `PASS_IF_EXISTS`, and `MAINTAINER_CANT_MODIFY`, these are
treated as environment booleans. If they are defined in the environment, they trigger the treated as environment booleans. If they are defined in the environment, they trigger the
@@ -56,6 +61,7 @@ treated as environment booleans. If they are defined in the environment, they tr
- Define `PULL_REQUEST_DRAFT` if you want the PR to be a draft. - Define `PULL_REQUEST_DRAFT` if you want the PR to be a draft.
- Define `PASS_ON_ERROR` if you want the PR to not exit given any non 200/201 response. - Define `PASS_ON_ERROR` if you want the PR to not exit given any non 200/201 response.
- Define `PASS_IF_EXISTS` if you want the PR to not exit given the pull request is already open. - Define `PASS_IF_EXISTS` if you want the PR to not exit given the pull request is already open.
- Define `PULL_REQUEST_UPDATE` if you want the pull request to be updated if it already exits.
For `PULL_REQUEST_ASSIGNEES`, `PULL_REQUEST_REVIEWERS`, and `PULL_REQUEST_TEAM_REVIEWERS` For `PULL_REQUEST_ASSIGNEES`, `PULL_REQUEST_REVIEWERS`, and `PULL_REQUEST_TEAM_REVIEWERS`
you can provide a string of one or more GitHub usernames (or team names) to you can provide a string of one or more GitHub usernames (or team names) to
@@ -111,7 +117,7 @@ jobs:
PR_BRANCH_FROM=release-v$(cat VERSION) PR_BRANCH_FROM=release-v$(cat VERSION)
export "PULL_REQUEST_FROM_BRANCH=${PR_BRANCH_FROM}" >> $GITHUB_ENV export "PULL_REQUEST_FROM_BRANCH=${PR_BRANCH_FROM}" >> $GITHUB_ENV
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@1.0.6 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_BRANCH: "master" PULL_REQUEST_BRANCH: "master"

View File

@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@1.0.3 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"

View File

@@ -43,7 +43,7 @@ jobs:
echo "PULL_REQUEST_FROM_BRANCH=${BRANCH_FROM}" >> $GITHUB_ENV echo "PULL_REQUEST_FROM_BRANCH=${BRANCH_FROM}" >> $GITHUB_ENV
- name: Open Pull Request - name: Open Pull Request
uses: vsoch/pull-request-action@1.0.6 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_BRANCH: "master" PULL_REQUEST_BRANCH: "master"

View File

@@ -47,7 +47,7 @@ jobs:
- name: Set PR body - name: Set PR body
run: echo "PULL_REQUEST_BODY=${{steps.set-pr-body.outputs.result}}" >> $GITHUB_ENV run: echo "PULL_REQUEST_BODY=${{steps.set-pr-body.outputs.result}}" >> $GITHUB_ENV
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@1.0.10 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "hotfix-" BRANCH_PREFIX: "hotfix-"

View File

@@ -10,7 +10,7 @@ jobs:
steps: steps:
- name: pull-request-action - name: pull-request-action
id: pull_request id: pull_request
uses: vsoch/pull-request-action@1.0.6 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@add/support-null-branch uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"

View File

@@ -39,7 +39,7 @@ jobs:
git push --force "https://${{ github.actor }}:${{secrets.GITHUB_TOKEN}}@github.com/${{ github.repository }}.git" "HEAD:${{ steps.data.outputs.suite_update_branch }}" git push --force "https://${{ github.actor }}:${{secrets.GITHUB_TOKEN}}@github.com/${{ github.repository }}.git" "HEAD:${{ steps.data.outputs.suite_update_branch }}"
- name: Open a PR to the default branch - name: Open a PR to the default branch
uses: vsoch/pull-request-action@1.0.2 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PULL_REQUEST_FROM_BRANCH: "${{ steps.data.outputs.suite_update_branch }}" PULL_REQUEST_FROM_BRANCH: "${{ steps.data.outputs.suite_update_branch }}"

View File

@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull-request-action - name: pull-request-action
uses: vsoch/pull-request-action@1.0.4 uses: vsoch/pull-request-action@master
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "update/" BRANCH_PREFIX: "update/"

View File

@@ -11,6 +11,13 @@ import requests
def get_envar(name): def get_envar(name):
"""
Given a name, return the corresponding environment variable. Exit if not
defined, as using this function indicates the envar is required.
Parameters:
name (str): the name of the environment variable
"""
value = os.environ.get(name) value = os.environ.get(name)
if not value: if not value:
sys.exit("%s is required for vsoch/pull-request-action" % name) sys.exit("%s is required for vsoch/pull-request-action" % name)
@@ -18,6 +25,9 @@ def get_envar(name):
def check_events_json(): def check_events_json():
"""the github events json is required in order to indicate that we are
in an action environment.
"""
events = get_envar("GITHUB_EVENT_PATH") events = get_envar("GITHUB_EVENT_PATH")
if not os.path.exists(events): if not os.path.exists(events):
sys.exit("Cannot find Github events file at ${GITHUB_EVENT_PATH}") sys.exit("Cannot find Github events file at ${GITHUB_EVENT_PATH}")
@@ -25,15 +35,33 @@ def check_events_json():
return events return events
def abort_if_fail(reason): def abort_if_fail(response, reason):
"""If PASS_ON_ERROR, don't exit. Otherwise exit with an error and print the reason""" """If PASS_ON_ERROR, don't exit. Otherwise exit with an error and print
the reason.
Parameters:
response (requests.Response) : an unparsed response from requests
reason (str) : a message to print to the user for fail.
"""
message = "%s: %s: %s\n %s" % (
reason,
response.status_code,
response.reason,
response.json(),
)
if os.environ.get("PASS_ON_ERROR"): if os.environ.get("PASS_ON_ERROR"):
print("Error, but PASS_ON_ERROR is set, continuing: %s" % reason) print("Error, but PASS_ON_ERROR is set, continuing: %s" % message)
else: else:
sys.exit(reason) sys.exit(message)
def parse_into_list(values): def parse_into_list(values):
"""A list of reviewers or assignees to parse from a string to a list
Parameters:
values (str) : a list of space separated, quoted values to parse to a list
"""
if values: if values:
values = values.replace('"', "").replace("'", "") values = values.replace('"', "").replace("'", "")
if not values: if not values:
@@ -42,13 +70,197 @@ def parse_into_list(values):
def set_env(name, value): def set_env(name, value):
"""helper function to echo a key/value pair to the environement file""" """helper function to echo a key/value pair to the environement file
Parameters:
name (str) : the name of the environment variable
value (str) : the value to write to file
"""
environment_file_path = os.environ.get("GITHUB_ENV") environment_file_path = os.environ.get("GITHUB_ENV")
with open(environment_file_path, "a") as environment_file: with open(environment_file_path, "a") as environment_file:
environment_file.write("%s=%s" % (name, value)) environment_file.write("%s=%s" % (name, value))
def open_pull_request(title, body, target, source, is_draft=False, can_modify=True):
"""Open pull request opens a pull request with a given body and content,
and sets output variables. An unparsed response is returned.
Parameters:
title (str) : the title to set for the new pull request
body (str) : the body to set for the new pull request
target (str) : the target branch
source (str) : the source branch
is_draft (bool) : indicate the pull request is a draft
can_modify (bool) : indicate the maintainer can modify
"""
print("No pull request from %s to %s is open, continuing!" % (source, target))
# Post the pull request
data = {
"title": title,
"body": body,
"base": target,
"head": source,
"draft": is_draft,
"maintainer_can_modify": can_modify,
}
print("Data for opening pull request: %s" % data)
response = requests.post(PULLS_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(response, "Unable to create pull request")
return response
def update_pull_request(entry, title, body, target, state=None):
"""Given an existing pull request, update it.
Parameters:
entry (dict) : the pull request metadata
title (str) : the title to set for the new pull request
body (str) : the body to set for the new pull request
target (str) : the target branch
state (bool) : the state of the PR (open, closed)
"""
print("PULL_REQUEST_UPDATE is set, updating existing pull request.")
data = {
"title": title,
"body": body,
"base": target,
"state": state or "open",
}
# PATCH /repos/{owner}/{repo}/pulls/{pull_number}
url = "%s/%s" % (PULLS_URL, entry.get("number"))
print("Data for updating pull request: %s" % data)
response = requests.patch(url, json=data, headers=HEADERS)
if response.status_code != 200:
abort_if_fail(response, "Unable to create pull request")
return response
def set_pull_request_groups(response):
"""Given a response for an open or updated PR, set metadata
Parameters:
response (requests.Response) : a requests response, unparsed
"""
# Expected return codes are 0 for success
pull_request_return_code = (
0 if response.status_code == 201 else response.status_code
)
response = response.json()
print("::group::github response")
print(response)
print("::endgroup::github response")
number = response.get("number")
html_url = response.get("html_url")
print("Number opened for PR is %s" % number)
set_env("PULL_REQUEST_NUMBER", number)
print("::set-output name=pull_request_number::%s" % number)
set_env("PULL_REQUEST_RETURN_CODE", pull_request_return_code)
print("::set-output name=pull_request_return_code::%s" % pull_request_return_code)
set_env("PULL_REQUEST_URL", html_url)
print("::set-output name=pull_request_url::%s" % html_url)
def list_pull_requests(target, source):
"""Given a target and source, return a list of pull requests that match
(or simply exit given some kind of error code)
Parameters:
target (str) : the target branch
source (str) : the source branch
"""
# Check if the branch already has a pull request open
params = {"base": target, "head": source, "state": "open"}
print("Params for checking if pull request exists: %s" % params)
response = requests.get(PULLS_URL, params=params)
# Case 1: 404 might warrant needing a token
if response.status_code == 404:
response = requests.get(PULLS_URL, params=params, headers=HEADERS)
if response.status_code != 200:
abort_if_fail(response, "Unable to retrieve information about pull requests")
return response.json()
def add_assignees(entry, assignees):
"""Given a pull request metadata (from create or update) add assignees
Parameters:
entry (dict) : the pull request metadata
assignees (str) : comma separated assignees string set by action
"""
# Remove leading and trailing quotes
assignees = parse_into_list(assignees)
number = entry.get("number")
print(
"Attempting to assign %s to pull request with number %s" % (assignees, number)
)
# POST /repos/:owner/:repo/issues/:issue_number/assignees
data = {"assignees": assignees}
ASSIGNEES_URL = "%s/%s/assignees" % (ISSUE_URL, number)
response = requests.post(ASSIGNEES_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(response, "Unable to create assignees")
assignees_return_code = 0 if response.status_code == 201 else response.status_code
print("::group::github assignees response")
print(response.json())
print("::endgroup::github assignees response")
set_env("ASSIGNEES_RETURN_CODE", assignees_return_code)
print("::set-output name=assignees_return_code::%s" % assignees_return_code)
def find_pull_request(listing, source):
"""Given a listing and a source, find a pull request based on the source
(the branch name).
Parameters:
listing (list) : the list of PR objects (dict) to parse over
source (str) : the source (head) branch to look for
"""
if listing:
for entry in listing:
if entry.get("head", {}).get("ref", "") == source:
print("Pull request from %s is already open!" % source)
return entry
def add_reviewers(entry, reviewers, team_reviewers):
"""Given regular or team reviewers, add them to a PR.
Parameters:
entry (dict) : the pull request metadata
"""
print("Found reviewers: %s and team reviewers: %s" % (reviewers, team_reviewers))
team_reviewers = parse_into_list(team_reviewers)
reviewers = parse_into_list(reviewers)
print("Parsed reviewers: %s and team reviewers: %s" % (reviewers, team_reviewers))
# POST /repos/:owner/:repo/pulls/:pull_number/requested_reviewers
REVIEWERS_URL = "%s/%s/requested_reviewers" % (PULLS_URL, entry.get("number"))
data = {"reviewers": reviewers, "team_reviewers": team_reviewers}
response = requests.post(REVIEWERS_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(response, "Unable to assign reviewers")
reviewers_return_code = 0 if response.status_code == 201 else response.status_code
print("::group::github reviewers response")
print(response.json())
print("::endgroup::github reviewers response")
set_env("REVIEWERS_RETURN_CODE", reviewers_return_code)
print("::set-output name=reviewers_return_code::%s" % reviewers_return_code)
print("Add reviewers return code: %s" % reviewers_return_code)
################################################################################ ################################################################################
# Global Variables (we can't use GITHUB_ prefix) # Global Variables (we can't use GITHUB_ prefix)
################################################################################ ################################################################################
@@ -78,155 +290,44 @@ def create_pull_request(
team_reviewers, team_reviewers,
is_draft=False, is_draft=False,
can_modify=True, can_modify=True,
state="open",
): ):
"""Create pull request is the base function that determines if the PR exists,
and then updates or creates it depending on user preferences.
"""
listing = list_pull_requests(target, source)
# Check if the branch already has a pull request open # Determine if the pull request is already open
params = {"base": target, "head": source, "state": "open"} entry = find_pull_request(listing, source)
data = {"base": target, "head": source, "body": body} response = None
print("Params for checking if pull request exists: %s" % params)
response = requests.get(PULLS_URL, params=params)
# Case 1: 404 might warrant needing a token # Case 1: we found the PR, the user wants to pass
if response.status_code == 404: if entry and os.environ.get("PASS_IF_EXISTS"):
response = requests.get(PULLS_URL, params=params, headers=HEADERS)
if response.status_code != 200:
abort_if_fail(
"Unable to retrieve information about pull requests: %s: %s"
% (response.status_code, response.reason)
)
response = response.json()
# Option 1: The pull request is already open
is_open = False
if response:
for entry in response:
if entry.get("head", {}).get("ref", "") == source:
print("Pull request from %s to %s is already open!" % (source, target))
is_open = True
# Does the user want to pass if the pull request exists?
if os.environ.get("PASS_IF_EXISTS"):
print("PASS_IF_EXISTS is set, exiting with success status.") print("PASS_IF_EXISTS is set, exiting with success status.")
sys.exit(0) sys.exit(0)
break
# Option 2: Open a new pull request # Does the user want to update the existing PR?
if not is_open: if entry and os.environ.get("PULL_REQUEST_UPDATE"):
print("No pull request from %s to %s is open, continuing!" % (source, target)) response = update_pull_request(entry, title, body, target, state)
set_pull_request_groups(response)
# Post the pull request # If it's not open, we open a new pull request
data = { elif not entry:
"title": title, response = open_pull_request(title, body, target, source, is_draft, can_modify)
"body": body, set_pull_request_groups(response)
"base": target,
"head": source,
"draft": is_draft,
"maintainer_can_modify": can_modify,
}
print("Data for opening pull request: %s" % data)
response = requests.post(PULLS_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(
"Unable to create pull request: %s: %s, %s"
% (
response.status_code,
response.reason,
response.json().get("message", ""),
)
)
# Expected return codes are 0 for success # If we have a response, parse into json (no longer need retvals)
pull_request_return_code = ( response = response.json() if response else None
0 if response.status_code == 201 else response.status_code
)
response = response.json()
print("::group::github response")
print(response)
print("::endgroup::github response")
number = response.get("number")
html_url = response.get("html_url")
print("Number opened for PR is %s" % number)
set_env("PULL_REQUEST_NUMBER", number)
print("::set-output name=pull_request_number::%s" % number)
set_env("PULL_REQUEST_RETURN_CODE", pull_request_return_code)
print(
"::set-output name=pull_request_return_code::%s" % pull_request_return_code
)
set_env("PULL_REQUEST_URL", html_url)
print("::set-output name=pull_request_url::%s" % html_url)
if assignees: # If we have opened or updated, we can add assignees
if response and assignees:
# Remove leading and trailing quotes add_assignees(response, assignees)
assignees = parse_into_list(assignees) if response and (reviewers or team_reviewers):
add_reviewers(response, reviewers, team_reviewers)
print(
"Attempting to assign %s to pull request with number %s"
% (assignees, number)
)
# POST /repos/:owner/:repo/issues/:issue_number/assignees
data = {"assignees": assignees}
ASSIGNEES_URL = "%s/%s/assignees" % (ISSUE_URL, number)
response = requests.post(ASSIGNEES_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(
"Unable to create assignees: %s: %s, %s"
% (
response.status_code,
response.reason,
response.json().get("message", ""),
)
)
assignees_return_code = (
0 if response.status_code == 201 else response.status_code
)
set_env("ASSIGNEES_RETURN_CODE", assignees_return_code)
print("::set-output name=assignees_return_code::%s" % assignees_return_code)
if reviewers or team_reviewers:
print(
"Found reviewers: %s and team reviewers: %s"
% (reviewers, team_reviewers)
)
team_reviewers = parse_into_list(team_reviewers)
reviewers = parse_into_list(reviewers)
print(
"Parsed reviewers: %s and team reviewers: %s"
% (reviewers, team_reviewers)
)
# POST /repos/:owner/:repo/pulls/:pull_number/requested_reviewers
REVIEWERS_URL = "%s/%s/requested_reviewers" % (PULLS_URL, number)
data = {"reviewers": reviewers, "team_reviewers": team_reviewers}
response = requests.post(REVIEWERS_URL, json=data, headers=HEADERS)
if response.status_code != 201:
abort_if_fail(
"Unable to assign reviewers: %s: %s, %s"
% (
response.status_code,
response.reason,
response.json().get("message", ""),
)
)
reviewers_return_code = (
0 if response.status_code == 201 else response.status_code
)
response = response.json()
print("::group::github reviewers response")
print(response)
print("::endgroup::github reviewers response")
set_env("REVIEWERS_RETURN_CODE", reviewers_return_code)
print("::set-output name=reviewers_return_code::%s" % reviewers_return_code)
print("Add reviewers return code: %s" % reviewers_return_code)
def main(): def main():
"""main primarily parses environment variables to prepare for creation"""
# path to file that contains the POST response of the event # path to file that contains the POST response of the event
# Example: https://github.com/actions/bin/tree/master/debug # Example: https://github.com/actions/bin/tree/master/debug
@@ -248,21 +349,22 @@ def main():
print("No explicit preference for draft PR: created PRs will be normal PRs.") print("No explicit preference for draft PR: created PRs will be normal PRs.")
pull_request_draft = False pull_request_draft = False
else: else:
print( print("PULL_REQUEST_DRAFT set to a value: created PRs will be draft PRs.")
"Environment variable PULL_REQUEST_DRAFT set to a value: created PRs will be draft PRs."
)
pull_request_draft = True pull_request_draft = True
# If an update is true, we can change the state
pull_request_state = os.environ.get("PULL_REQUEST_STATE", "open")
if pull_request_state not in ["open", "closed"]:
sys.exit("State is required to be one of 'open' or 'closed'")
# Maintainer can modify, defaults to CAN, unless user sets MAINTAINER_CANT_MODIFY # Maintainer can modify, defaults to CAN, unless user sets MAINTAINER_CANT_MODIFY
maintainer_can_modify = os.environ.get("MAINTAINER_CANT_MODIFY") maintainer_can_modify = os.environ.get("MAINTAINER_CANT_MODIFY")
if not maintainer_can_modify: if not maintainer_can_modify:
print( print("No preference for maintainer being able to modify: default is true.")
"No explicit preference for maintainer being able to modify: default is true."
)
maintainer_can_modify = True maintainer_can_modify = True
else: else:
print( print(
"Environment variable MAINTAINER_CANT_MODIFY set to a value: maintainer will not be able to modify." "MAINTAINER_CANT_MODIFY set to a value: maintainer will not be able to modify."
) )
maintainer_can_modify = False maintainer_can_modify = False
@@ -292,7 +394,7 @@ def main():
if not from_branch: if not from_branch:
print("PULL_REQUEST_FROM_BRANCH is not set, checking branch in payload.") print("PULL_REQUEST_FROM_BRANCH is not set, checking branch in payload.")
with open(check_events_json(), "r") as fd: with open(check_events_json(), "r") as fd:
from_branch = json.loads(fd.read()).get("ref") from_branch = json.loads(fd.read()).get("ref", "")
from_branch = from_branch.replace("refs/heads/", "").strip("/") from_branch = from_branch.replace("refs/heads/", "").strip("/")
else: else:
print("PULL_REQUEST_FROM_BRANCH is set.") print("PULL_REQUEST_FROM_BRANCH is set.")
@@ -302,14 +404,13 @@ def main():
print("Found branch %s to open PR from" % from_branch) print("Found branch %s to open PR from" % from_branch)
else: else:
sys.exit( sys.exit(
"No branch in payload, you are required to define PULL_REQUEST_FROM_BRANCH in the environment." "You are required to define PULL_REQUEST_FROM_BRANCH in the environment."
) )
# If it's to the target branch, ignore it # If it's to the target branch, ignore it
if from_branch == pull_request_branch: if from_branch == pull_request_branch:
print("Target and current branch are identical (%s), skipping." % from_branch) print("Target and current branch are identical (%s), skipping." % from_branch)
else: sys.exit(0)
# If the prefix for the branch matches # If the prefix for the branch matches
if not branch_prefix or from_branch.startswith(branch_prefix): if not branch_prefix or from_branch.startswith(branch_prefix):
@@ -317,8 +418,7 @@ def main():
# Pull request body (optional) # Pull request body (optional)
pull_request_body = os.environ.get( pull_request_body = os.environ.get(
"PULL_REQUEST_BODY", "PULL_REQUEST_BODY",
"This is an automated pull request to update from branch %s" "This is an automated pull request to update from branch %s" % from_branch,
% from_branch,
) )
print("::group::pull request body") print("::group::pull request body")
@@ -344,6 +444,7 @@ def main():
assignees=assignees, assignees=assignees,
reviewers=reviewers, reviewers=reviewers,
team_reviewers=team_reviewers, team_reviewers=team_reviewers,
state=pull_request_state,
) )