-
Notifications
You must be signed in to change notification settings - Fork 1
116 lines (104 loc) · 3.67 KB
/
sync-from-template.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
---
#
# - Run this workflow to pull changes from the template repository.
#
# - Clone this repository. Check out a branch
# - Copy files from the template onto this clone
# - Push the branch to this repository
# - Create a pull request in this repository
#
name: Sync changes from template
# TODO:
# - Switch to gh. Check https://github.com/cli/cli/issues/297 for updates
on:
# Run at 0517 UTC each Friday
schedule:
- cron: "17 5 * * 5"
# Run when this file changes
push:
paths:
- .github/workflows/sync-from-template.yml
# Run when manually triggered
workflow_dispatch:
env:
BASE_BRANCH: main
HEAD_BRANCH: chore/sync-from-template
GIT_AUTHOR_NAME: ${{ github.repository_owner }}
GIT_AUTHOR_EMAIL: ${{ github.repository_owner }}@users.noreply.github.com
REPO_TEMPLATE: solvaholic/template
THIS_REPO: ${{ github.repository }}
jobs:
sync-from-template:
# Do not run on the template repository itself
if: github.repository != 'solvaholic/template'
name: Sync changes from solvaholic/template
runs-on: ubuntu-latest
continue-on-error: true
steps:
# Clone the template repository
- name: Check out template repository
uses: actions/checkout@v2
with:
repository: ${{ env.REPO_TEMPLATE }}
token: ${{ github.token }}
path: ${{ env.REPO_TEMPLATE }}
# Clone the target repository. Check out a branch
- name: Check out ${{ github.repository }}
uses: actions/checkout@v2
with:
repository: ${{ github.repository }}
token: ${{ github.token }}
path: ${{ github.repository }}
- name: Create branch in ${{ env.THIS_REPO }}
run: |
git -C "${THIS_REPO}" fetch origin "${HEAD_BRANCH}" || true
git -C "${THIS_REPO}" branch -a
git -C "${THIS_REPO}" checkout -B "${HEAD_BRANCH}" \
"remotes/origin/${HEAD_BRANCH}" || \
git -C "${THIS_REPO}" checkout -b "${HEAD_BRANCH}"
# Copy files from the template onto the target clone
- name: Copy template contents
run: |
_files="$(find ${REPO_TEMPLATE} \
! -path "*/.git/*" \
! -path "*/.github/workflows/*" \
! -name ".gitignore" \
! -name "README.md" \
-type f \
-print)"
for _file in ${_files}; do
_src="${_file}"
_dst="${THIS_REPO}/${_file#${REPO_TEMPLATE}/}"
# TODO: Find a more robust / elegant way to get this :point_down:
_dst="${_dst%/*}/"
mkdir -p "${_dst}"
echo "INFO: Copy '${_src}' to '${_dst}'."
cp "${_src}" "${_dst}"
done
git -C "${THIS_REPO}" diff
# Commit changes, if there are any
- name: Commit changes, if any
run: |
git -C ${THIS_REPO} config user.name "${GIT_AUTHOR_NAME}"
git -C ${THIS_REPO} config \
user.email "${GIT_AUTHOR_EMAIL}"
git -C ${THIS_REPO} add .
git -C ${THIS_REPO} commit \
-m "Sync from template@${{ github.sha }}"
# Push the branch to the target repository
- name: Push topic branch
run: git -C ${THIS_REPO} push -u origin "${HEAD_BRANCH}"
# Create a pull request in the target repository
- name: Create pull request
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_USER: ${{ github.actor }}
run: |
pushd ${THIS_REPO}
hub pull-request \
-b "${BASE_BRANCH}" \
-h "${HEAD_BRANCH}" \
--no-edit \
-m "Pull updates from ${REPO_TEMPLATE}" \
-m "Pull updates from ${REPO_TEMPLATE}"
popd