-
Notifications
You must be signed in to change notification settings - Fork 0
/
action.yml
196 lines (177 loc) · 7.97 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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
name: 'Open PR to an Unmanic Repository'
description: 'Generates a PR to an Unmanic repository from a Git Repository containing a Unmanic Plugin source'
inputs:
dst_repo:
description: 'The repository to push to. Should be a fork of the official Unmanic Plugin Repository.'
required: true
pr_repo:
description: 'The repository to open the PR against. Can be either a fork or the official Unmanic Plugin Repository.'
required: false
default: 'Unmanic/unmanic-plugins'
pr_repo_branch_name:
description: 'The name of the branch to open the PR against.'
required: false
default: 'official'
github_token:
description: 'A GitHub token with the permissions to push back to this repository'
required: true
runs:
using: 'composite'
steps:
# Checkout plugin source
- name: Checkout plugin source
uses: actions/checkout@v3
with:
path: build/plugin
submodules: recursive
# Checkout plugin source
- name: Checkout plugin for PR branch
uses: actions/checkout@v3
with:
path: build/repo
repository: ${{ inputs.dst_repo }}
fetch-depth: 0
token: ${{ inputs.github_token }}
# Prepare build environment
- name: Prepare build environment
shell: bash
id: prepare
run: |
# Read plugin id and version from info.json
plugin_id=$(cat build/plugin/info.json | jq -r .id)
plugin_version=$(cat build/plugin/info.json | jq -r .version)
if [[ -z ${plugin_id:-} ]]; then
echo "Unable to determine the ID of your plugin. Is it set in the info.json file?"
exit 1
fi
# Configure paths
repo_root_path="$(pwd)/build/repo"
plugin_location="$(pwd)/build/plugin.${plugin_id:?}"
########################################################################
### MOVE PLUGIN BUILD DIRECTORY
# Rename plugin directory for building
rm -rf build/plugin.${plugin_id:?}
mv -fv build/plugin build/plugin.${plugin_id:?}
########################################################################
### EXPORT VARIABLES FOR FOLLOWING STEPS
echo "plugin_id=${plugin_id:?}" >> $GITHUB_OUTPUT
echo "plugin_version=${plugin_version:?}" >> $GITHUB_OUTPUT
echo "repo_root_path=${repo_root_path:?}" >> $GITHUB_OUTPUT
echo "plugin_location=${plugin_location:?}" >> $GITHUB_OUTPUT
# Check for plugin updates and create a PR branch with any changes found
- name: Generate PR branch
shell: bash
id: execute
env:
pr_repo: "${{ inputs.pr_repo }}"
pr_repo_branch_name: "${{ inputs.pr_repo_branch_name }}"
plugin_id: ${{ steps.prepare.outputs.plugin_id }}
plugin_version: ${{ steps.prepare.outputs.plugin_version }}
repo_root_path: ${{ steps.prepare.outputs.repo_root_path }}
plugin_location: ${{ steps.prepare.outputs.plugin_location }}
run: |
########################################################################
### CREATE PR BRANCH
pushd "${repo_root_path:?}" &> /dev/null
# Create clean PR branch
echo "*** Configure git user"
git config user.name "GitHub Actions"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
echo "*** Checkout clean PR branch for plugin"
git remote add upstream https://github.com/${pr_repo:?}.git
git branch -D "pr-${plugin_id:?}" 2> /dev/null || true
git fetch upstream ${pr_repo_branch_name:?}
git checkout -b "pr-${plugin_id:?}" upstream/${pr_repo_branch_name:?}
popd &> /dev/null
########################################################################
### UPDATE SUBMODULES
pushd "${plugin_location:?}" &> /dev/null
# Update any submodules
echo "*** Pulling plugin submodules"
git submodule update --init --recursive
popd &> /dev/null
########################################################################
### PATCH PROJECT
pushd "${plugin_location:?}" &> /dev/null
# Apply any patches
if [[ -d ./patches ]]; then
echo "*** Patching project"
find ./patches -type f -name "*.patch" -exec patch -p1 --input="{}" --forward --verbose \;
fi
popd &> /dev/null
########################################################################
### BUILD/INSTALL SOURCE INTO PR DIR
pushd "${repo_root_path:?}" &> /dev/null
# Install/update plugin files
echo "*** Installing files from plugin git repo to this repository's source directory"
mkdir -p "${repo_root_path:?}/source/${plugin_id:?}"
ls -la "${plugin_location:?}/"
rm -rf "${repo_root_path:?}/source/${plugin_id:?}"/*
find "${plugin_location:?}" \( -type d -or -type f \) | grep -vE '(\.git/|\.github/|\.gitmodules|\.idea/)' | while read -r file; do
# Construct the relative path
relative_path="${file#${plugin_location:?}/}"
dest_path="${repo_root_path:?}/source/${plugin_id:?}/${relative_path}"
if [ -d "${file}" ]; then
mkdir -p "${dest_path}"
elif [ -f "${file}" ]; then
cp -fv "${file}" "${dest_path}"
fi
done
# Read plugin version
plugin_version=$(cat "${repo_root_path:?}/source/${plugin_id:?}/info.json" | jq -rc '.version')
[[ ${plugin_version:?} == "null" ]] && echo "Failed to fetch the plugin's version from the info.json file. Exit!" && exit 1;
popd &> /dev/null
########################################################################
### COMMIT
pushd "${repo_root_path:?}" &> /dev/null
echo "*** Commit changes in unmanic-plugins repository"
commit_message="[${plugin_id:?}] v${plugin_version:?}"
echo ${commit_message}
git add "source/${plugin_id:?}"
git commit -m "${commit_message}"
if [[ $? -gt 0 ]]; then
echo
echo "No commit created. Possibly because there was nothing to commit!"
echo "PR branch will not be pushed."
exit 1
fi
popd &> /dev/null
########################################################################
### PUSH
pushd "${repo_root_path:?}" &> /dev/null
echo "*** Force push PR branch to dst_repo"
git push -f origin "pr-${plugin_id:?}"
# Add a small sleep here before completing this step. This allows time for the push to complete.
sleep 2
popd &> /dev/null
# Mark successful
echo "result=success" >> $GITHUB_OUTPUT
# Prepare build environment
- name: Generate PR
if: steps.execute.outputs.result == 'success'
shell: bash
env:
GITHUB_TOKEN: "${{ inputs.github_token }}"
dst_repo: "${{ inputs.dst_repo }}"
pr_repo: "${{ inputs.pr_repo }}"
pr_repo_branch_name: "${{ inputs.pr_repo_branch_name }}"
plugin_id: ${{ steps.prepare.outputs.plugin_id }}
plugin_version: ${{ steps.prepare.outputs.plugin_version }}
run: |
pushd "$(pwd)/build/repo" &> /dev/null
# Configure the source workflow link
echo "*** Build workflow link for PR body"
workflow_run_link="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
# Fetch user from dst_repo
echo "*** Extract Fork GitHub user from ${dst_repo:?}"
github_user="${dst_repo%%/*}"
# Execute the 'gh pr create' command and exit quietly without error if the command fails
echo "*** Create PR from PR branch"
gh pr create \
--title "[${plugin_id:?}] v${plugin_version:?}" \
--body "PR automatically generated from [plugin source workflow](${workflow_run_link:?})" \
--repo "${pr_repo:?}" \
--base "${pr_repo_branch_name:?}" \
--head "${github_user:?}:pr-${plugin_id:?}" \
|| true
popd &> /dev/null