forked from GuillaumeFalourd/pull-request-action
-
Notifications
You must be signed in to change notification settings - Fork 0
/
action.yml
166 lines (141 loc) · 5.17 KB
/
action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
name: Pull Request Action
description: Github Actions to create pull request ⤵️
inputs:
source_branch:
description: Branch name to pull from, default is triggered branch
required: false
destination_branch:
description: Branch name to sync to in this repo, default is master
required: false
default: master
pr_title:
description: Pull request title
required: false
pr_body:
description: Pull request body
required: false
pr_template:
description: Pull request template
required: false
pr_reviewer:
description: Pull request reviewers, comma-separated list (no spaces)
required: false
pr_assignee:
description: Pull request assignees, comma-separated list (no spaces)
required: false
pr_label:
description: Pull request labels, comma-separated list (no spaces)
required: false
pr_milestone:
description: Pull request milestone
required: false
pr_draft:
description: Draft pull request
required: false
pr_allow_empty:
description: Create PR even if no changes
required: false
github_token:
description: GitHub token secret
required: true
default: ${{ github.token }}
outputs:
pr_url:
description: 'Pull request URL'
pr_number:
description: 'Pull request number'
has_changed_files:
description: 'Boolean string indicating whether any file has been changed'
runs:
using: "composite"
steps:
- name: Create Pull Request ⤵️
shell: bash
run: |
set -e
set -o pipefail
if [[ ! -z "${{ inputs.source_branch }}" ]]; then
echo one
SOURCE_BRANCH="${{ inputs.source_branch }}"
elif [[ ! -z "$GITHUB_REF" ]]; then
echo two
SOURCE_BRANCH=${GITHUB_REF/refs\/heads\//} # Remove branch prefix
else
echo three
echo "Set the ${{ inputs.source_branch }} environment variable or trigger from a branch."
exit 1
fi
echo SOURCE_BRANCH $SOURCE_BRANCH
if [[ ! -z "${{ inputs.destination_branch }}" ]]; then
echo four
DESTINATION_BRANCH="${{ inputs.destination_branch }}"
else
echo five
DESTINATION_BRANCH="main"
fi
echo DESTINATION_BRANCH $DESTINATION_BRANCH
# Github actions no longer auto set the username and GITHUB_TOKEN
git remote set-url origin "https://$GITHUB_ACTOR:${{ github.token }}@${GITHUB_SERVER_URL#https://}/$GITHUB_REPOSITORY"
# Pull all branches references down locally so subsequent commands can see them
git fetch origin '+refs/heads/*:refs/heads/*' --update-head-ok
# Print out all branches
git --no-pager branch -a -vv
if [ "$(git rev-parse --revs-only "$SOURCE_BRANCH")" = "$(git rev-parse --revs-only "$DESTINATION_BRANCH")" ]; then
echo "Source and destination branches are the same."
exit 0
fi
# Do not proceed if there are no file differences, this avoids PRs with just a merge commit and no content
LINES_CHANGED=$(git diff --name-only "$DESTINATION_BRANCH" "$SOURCE_BRANCH" -- | wc -l | awk '{print $1}')
if [[ "$LINES_CHANGED" = "0" ]] && [[ ! "${{ inputs.pr_allow_empty }}" == "true" ]]; then
echo "No file changes detected between source and destination branches."
exit 0
fi
# Workaround for `hub` auth error https://github.com/github/hub/issues/2149#issuecomment-513214342
export GITHUB_USER="$GITHUB_ACTOR"
PR_ARG="${{ inputs.pr_title }}"
if [[ ! -z "$PR_ARG" ]]; then
PR_ARG="-m \"$PR_ARG\""
if [[ ! -z "${{ inputs.pr_template }}" ]]; then
sed -i 's/`/\\`/g; s/\$/\\\$/g' "${{ inputs.pr_template }}"
PR_ARG="$PR_ARG -m \"$(echo -e "$(cat "${{ inputs.pr_template }}")")\""
elif [[ ! -z "${{ inputs.pr_body }}" ]]; then
PR_ARG="$PR_ARG -m \"${{ inputs.pr_body }}\""
fi
fi
if [[ ! -z "${{ inputs.pr_reviewer }}" ]]; then
PR_ARG="$PR_ARG -r \"${{ inputs.pr_reviewer }}\""
fi
if [[ ! -z "${{ inputs.pr_assignee }}" ]]; then
PR_ARG="$PR_ARG -a \"${{ inputs.pr_assignee }}\""
fi
if [[ ! -z "${{ inputs.pr_label }}" ]]; then
PR_ARG="$PR_ARG -l \"${{ inputs.pr_label }}\""
fi
if [[ ! -z "${{ inputs.pr_milestone }}" ]]; then
PR_ARG="$PR_ARG -M \"${{ inputs.pr_milestone }}\""
fi
if [[ "${{ inputs.pr_draft }}" == "true" ]]; then
PR_ARG="$PR_ARG -d"
fi
COMMAND="hub pull-request \
-b $DESTINATION_BRANCH \
-h $SOURCE_BRANCH \
--no-edit \
$PR_ARG \
|| true"
echo "$COMMAND"
PR_URL=$(sh -c "$COMMAND")
if [[ "$?" != "0" ]]; then
exit 1
fi
echo ${PR_URL}
echo "::set-output name=pr_url::${PR_URL}"
echo "::set-output name=pr_number::${PR_URL##*/}"
if [[ "$LINES_CHANGED" = "0" ]]; then
echo "::set-output name=has_changed_files::false"
else
echo "::set-output name=has_changed_files::true"
fi
branding:
icon: 'git-pull-request'
color: 'black'