4 Commits

Author SHA1 Message Date
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
Vanessasaurus
c761be135f replacing set-env with new environment syntax (#48)
* replacing set-env with new environment syntax
* using direct append to file for set_env instead of os.system
Signed-off-by: vsoch <vsochat@stanford.edu>
2020-11-17 08:33:29 -07:00
Vanessasaurus
c39853dfde Add environment variable to pass if PR exists (#53)
* adding PASS_IF_EXISTS

Signed-off-by: vsoch <vsochat@stanford.edu>

* PASS_IF_EXISTS option, to not error out when a matching PR already is open (#52)

* Pass filters to request for PRs, and move PASS_IF_EXISTS exit in different spot
* Changed a printout to say the params used for a req
* break when looping through branches and find the matching one
Co-authored-by: Vanessasaurus <vsochat@gmail.com>

Co-authored-by: tscizzlebg <54290732+tscizzlebg@users.noreply.github.com>
2020-10-20 12:15:41 -06:00
4 changed files with 355 additions and 180 deletions

View File

@@ -46,14 +46,19 @@ Unlike standard actions, this action just uses variables from the environment.
| PULL_REQUEST_REVIEWERS | A list (string with spaces) of users to assign review | false | unset | | PULL_REQUEST_REVIEWERS | A list (string with spaces) of users to assign review | false | unset |
| 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 |
| 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`, 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
"true" condition. E.g.,: "true" condition. E.g.,:
- Define `MAINTAINER_CANT_MODIFY` if you don't want the maintainer to be able to modify the pull request. - Define `MAINTAINER_CANT_MODIFY` if you don't want the maintainer to be able to modify the pull request.
- 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 `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
@@ -91,7 +96,7 @@ Example workflows are provided in [examples](examples), and please contribute an
examples that you might have to help other users! We will walk through a basic examples that you might have to help other users! We will walk through a basic
example here for a niche case. Let's say that we are opening a pull request on the release event. This would mean example here for a niche case. Let's say that we are opening a pull request on the release event. This would mean
that the payload's branch variable would be null. We would need to define `PULL_REQUEST_FROM`. How would that the payload's branch variable would be null. We would need to define `PULL_REQUEST_FROM`. How would
we do that? We can [set environment variables](https://help.github.com/en/actions/reference/development-tools-for-github-actions#set-an-environment-variable-set-env) for next steps. Here is an example: we do that? We can [set environment variables](https://github.com/actions/toolkit/blob/main/docs/commands.md#environment-files) for next steps. Here is an example:
```yaml ```yaml
name: Pull Request on Branch Push name: Pull Request on Branch Push
@@ -107,7 +112,7 @@ jobs:
run: | run: |
# do custom parsing of your code / date to derive a branch from # do custom parsing of your code / date to derive a branch from
PR_BRANCH_FROM=release-v$(cat VERSION) PR_BRANCH_FROM=release-v$(cat VERSION)
::set-env name=PULL_REQUEST_FROM_BRANCH::${PR_BRANCH_FROM} 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@1.0.6
env: env:

View File

@@ -40,7 +40,7 @@ jobs:
git push origin "${BRANCH_FROM}" git push origin "${BRANCH_FROM}"
fi fi
# Here is where we are setting the environment variable! # Here is where we are setting the environment variable!
echo "::set-env name=PULL_REQUEST_FROM_BRANCH::${BRANCH_FROM}" 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@1.0.6

View File

@@ -0,0 +1,55 @@
name: Hotfix Branch Pull Request
on:
push:
branches-ignore:
- master
- production
# See https://github.com/vsoch/pull-request-action/issues/47#issuecomment-707109132
jobs:
auto-pull-request:
name: PullRequestAction
runs-on: ubuntu-latest
steps:
- name: Generate branch name
uses: actions/github-script@v3
id: set-branch-name
with:
script: |
const capitalize = (name) => name.charAt(0).toUpperCase() + name.slice(1);
const emoji = context.payload.ref.startsWith("refs/heads/feature")
? "✨ "
: context.payload.ref.startsWith("refs/heads/hotfix")
? "🚑 "
: "";
return `${emoji}${capitalize(
context.payload.ref
.replace("refs/heads/", "")
.replace(/-/g, " ")
.replace("feature ", "")
.replace("hotfix ", "")
)}`;
result-encoding: string
- name: Set branch name
run: echo "PULL_REQUEST_TITLE=${{steps.set-branch-name.outputs.result}}" >> $GITHUB_ENV
- name: Generate PR body
uses: actions/github-script@v3
id: set-pr-body
with:
script: |
return `I'm opening this pull request for this branch, pushed by @${
context.payload.head_commit.author.username
} with ${context.payload.commits.length} commit${
context.payload.commits.length === 1 ? "" : "s"
}.`;
result-encoding: string
- name: Set PR body
run: echo "PULL_REQUEST_BODY=${{steps.set-pr-body.outputs.result}}" >> $GITHUB_ENV
- name: pull-request-action
uses: vsoch/pull-request-action@1.0.10
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_PREFIX: "hotfix-"
PULL_REQUEST_BRANCH: "production"
PULL_REQUEST_REVIEWERS: "AnandChowdhary"

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:
@@ -41,6 +69,197 @@ def parse_into_list(values):
return [x.strip() for x in values.split(" ")] return [x.strip() for x in values.split(" ")]
def set_env(name, value):
"""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")
with open(environment_file_path, "a") as environment_file:
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):
"""Given a pull request metadata (from create or update) add assignees
Parameters:
entry (dict) : the pull request metadata
"""
# 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)
################################################################################ ################################################################################
@@ -70,148 +289,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
data = {"base": target, "head": source, "body": body} entry = find_pull_request(listing, source)
print("Data for checking if pull request exists: %s" % data) response = None
response = requests.get(PULLS_URL, json=data)
# Case 1: 404 might warrant needing a token
if response.status_code == 404:
response = requests.get(PULLS_URL, json=data, 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() # Case 1: we found the PR, the user wants to pass
if entry and os.environ.get("PASS_IF_EXISTS"):
print("PASS_IF_EXISTS is set, exiting with success status.")
sys.exit(0)
# Option 1: The pull request is already open # Does the user want to update the existing PR?
is_open = False if entry and os.environ.get("PULL_REQUEST_UPDATE"):
if response: response = update_pull_request(entry, title, body, target, state)
for entry in response: set_pull_request_groups(response)
if entry.get("head", {}).get("ref", "") == source:
print("Pull request from %s to %s is already open!" % (source, target))
is_open = True
# Option 2: Open a new pull request # If it's not open, we open a new pull request
if not is_open: elif not entry:
print("%s does not have a pull request open, continuing!" % source) response = open_pull_request(title, body, target, source, is_draft, can_modify)
set_pull_request_groups(response)
# Post the pull request # If we have a response, parse into json (no longer need retvals)
data = { response = response.json() if response else None
"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(
"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 opened or updated, we can add assignees
pull_request_return_code = ( if response and assignees:
0 if response.status_code == 201 else response.status_code add_assignees(response)
) if response and (reviewers or team_reviewers):
response = response.json() add_reviewers(response, reviewers, team_reviewers)
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)
print("::set-env name=PULL_REQUEST_NUMBER::%s" % number)
print("::set-output name=pull_request_number::%s" % number)
print("::set-env name=PULL_REQUEST_RETURN_CODE::%s" % pull_request_return_code)
print(
"::set-output name=pull_request_return_code::%s" % pull_request_return_code
)
print("::set-env name=PULL_REQUEST_URL::%s" % html_url)
print("::set-output name=pull_request_url::%s" % html_url)
if assignees:
# Remove leading and trailing quotes
assignees = parse_into_list(assignees)
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
)
print("::set-env name=ASSIGNEES_RETURN_CODE::%s" % 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")
print("::set-env name=REVIEWERS_RETURN_CODE::%s" % 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
@@ -233,21 +348,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
@@ -287,49 +403,48 @@ 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):
# 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")
print(pull_request_body) print(pull_request_body)
print("::endgroup::pull request body") print("::endgroup::pull request body")
# Pull request title (optional) # Pull request title (optional)
pull_request_title = os.environ.get( pull_request_title = os.environ.get(
"PULL_REQUEST_TITLE", "Update from %s" % from_branch "PULL_REQUEST_TITLE", "Update from %s" % from_branch
) )
print("::group::pull request title") print("::group::pull request title")
print(pull_request_title) print(pull_request_title)
print("::endgroup::pull request title") print("::endgroup::pull request title")
# Create the pull request # Create the pull request
create_pull_request( create_pull_request(
target=pull_request_branch, target=pull_request_branch,
source=from_branch, source=from_branch,
body=pull_request_body, body=pull_request_body,
title=pull_request_title, title=pull_request_title,
is_draft=pull_request_draft, is_draft=pull_request_draft,
can_modify=maintainer_can_modify, can_modify=maintainer_can_modify,
assignees=assignees, assignees=assignees,
reviewers=reviewers, reviewers=reviewers,
team_reviewers=team_reviewers, team_reviewers=team_reviewers,
) state=pull_request_state,
)
if __name__ == "__main__": if __name__ == "__main__":