-
Notifications
You must be signed in to change notification settings - Fork 56
136 lines (108 loc) · 6.5 KB
/
create_pr_on_pr.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
name: Create and Update Translation Branches and PRs
# This will run when there is a push to any English language branch
# With the format listed below.
on:
push:
branches:
- 'handbook_v*_en'
jobs:
create_and_update_translation_branches:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Git and Github CLI
run: |
git config --global user.name 'ntluong95'
git config --global user.email '[email protected]'
sudo apt update
sudo apt install -y gh
- name: Fetch all branches
run: git fetch --all
- name: Create and update language branches and PRs
run: |
LANGS=("fr" "es" "vn" "jp" "tr" "pt" "ru")
EN_BRANCH="${{ github.ref }}"
VERSION_SUFFIX="${EN_BRANCH#refs/heads/handbook_}"
for lang in "${LANGS[@]}"; do
TRANSLATION_BRANCH="handbook_${VERSION_SUFFIX/_en/_$lang}"
git fetch --prune
# Ensure we have all history
git fetch --all
#! Check if the translation branch exists
if git ls-remote --exit-code --heads origin "${TRANSLATION_BRANCH}"; then
echo "Branch ${TRANSLATION_BRANCH} exists. Checking out and rebasing with ${EN_BRANCH}"
git checkout "${TRANSLATION_BRANCH}"
git pull -s recursive -X theirs --no-rebase --no-edit origin "${EN_BRANCH#refs/heads/}" --allow-unrelated-histories
else
echo "Branch ${TRANSLATION_BRANCH} does not exist. Creating new branch from ${EN_BRANCH}."
git checkout -b "${TRANSLATION_BRANCH}"
git pull origin "${EN_BRANCH#refs/heads/}"
fi
#! Force push the changes to the remote repository
git push origin "${TRANSLATION_BRANCH}" --force
#! Get the list of changed .qmd files
changed_files=$(git diff --name-only "${EN_BRANCH}" | grep '\.qmd$')
if [ -z "$changed_files" ]; then
echo "No .qmd file changes to include in PR for ${TRANSLATION_BRANCH}"
continue
fi
echo "Changed files: $changed_files"
#! Get the date of the latest commit on the english branch
latest_commit_date=$(git show -s --format=%ci ${EN_BRANCH})
echo "Commits on the English branch that were made after the latest commit on the translation branch at $latest_commit_date"
latest_commit_en_branch=$(git show --format=%H -s ${EN_BRANCH})
latest_commit_info=$(git log ${EN_BRANCH} --since="$latest_commit_date" --format="%H %s" --reverse)
commit_messages=$(echo "$latest_commit_info" | cut -d' ' -f2-)
latest_commit_main=$(git show --format=%H -s origin/master)
echo $latest_commit_en_branch
echo $latest_commit_main
echo $latest_commit_info
#! Check if there are new commits
if [ "$latest_commit_en_branch" == "$latest_commit_main" ]; then
echo "No new commits to include in PR for ${TRANSLATION_BRANCH}"
continue
fi
#! Check if a PR already exists for this branch
PR_EXISTS=$(gh pr list --head "${TRANSLATION_BRANCH}" --state open --json number --jq length)
if [ "$PR_EXISTS" -eq 0 ]; then
echo "Creating new PR for ${TRANSLATION_BRANCH}"
PR_URL=$(gh pr create --base deploy-preview --head "$TRANSLATION_BRANCH" --title "Handbook ${VERSION_SUFFIX/_en/} $lang" --body "Automated pull request for $lang handbook version ${VERSION_SUFFIX/_en/}")
PR_NUMBER=$(echo "$PR_URL" | grep -oE '[0-9]+$')
else
#! Get the PR number for the translation branch
echo "PR already exists for ${TRANSLATION_BRANCH}"
PR_NUMBER=$(gh pr list --head "${TRANSLATION_BRANCH}" --state open --json number --jq ".[0].number")
fi
echo "Pull Request Number: $PR_NUMBER"
#! Initialize new PR body
new_pr_body="# Automated pull request for $lang handbook version ${VERSION_SUFFIX/_en/}"
#! Add new commits as checkboxes to the PR description
IFS=$'\n' # Change the Internal Field Separator to newline for correct iteration over lines
checkboxes=""
for file in $changed_files; do
#! List only new commits compared with the main branch, tail -n +2 to skip the first line of output from git log, the latest commit will not be added into the message
list_commits=$(git log origin/main..${TRANSLATION_BRANCH} --follow --pretty=format:"%H" -- $file | tail -n +2 | paste -sd, - | sed 's/,/, /g')
for commit in $latest_commit_en_branch; do
checkboxes="$checkboxes- [ ] Chapter [\`$file\`](https://github.com/${{ github.repository }}/pull/$PR_NUMBER/files?file-filters%5B%5D=.qmd&show-viewed-files=true) has new changes in the following commit(s): $list_commits. "
#! Mention a user in the PR description
case "$lang" in
"vn") checkboxes="$checkboxes @ntluong95, please review changes and check the box when you finish" ;;
"fr") checkboxes="$checkboxes @oliviabboyd, please review changes and check the box when you finish" ;;
"es") checkboxes="$checkboxes @amateo250, please review changes and check the box when you finish" ;;
"jp") checkboxes="$checkboxes @hitomik723, please review changes and check the box when you finish" ;;
"tr") checkboxes="$checkboxes @ntluong95, please review changes and check the box when you finish" ;;
"pt") checkboxes="$checkboxes @Luccan97, please review changes and check the box when you finish" ;;
"ru") checkboxes="$checkboxes @ntluong95, please review changes and check the box when you finish" ;;
esac
checkboxes="$checkboxes"$'\n'"$checkbox"
done
done
if [ -n "$checkboxes" ]; then
# Append the checkboxes to the new PR body
new_pr_body="$new_pr_body"$'\n'"$checkboxes"
fi
gh api repos/${{ github.repository }}/issues/$PR_NUMBER --method PATCH --field body="$new_pr_body"
done
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}