96 lines
3.5 KiB
YAML
96 lines
3.5 KiB
YAML
name: Restore Wiki Pages Deleted by Others
|
|
|
|
# The gollum event only fires on page create/update, never on deletion,
|
|
# so deletions can only be caught by polling the wiki git history.
|
|
|
|
on:
|
|
schedule:
|
|
- cron: "*/10 * * * *"
|
|
gollum:
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
issues: write
|
|
|
|
concurrency:
|
|
group: wiki-guard
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
restore:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout wiki repository
|
|
uses: actions/checkout@v7
|
|
with:
|
|
repository: ${{ github.repository }}.wiki
|
|
path: wiki
|
|
fetch-depth: 0
|
|
|
|
- name: Restore pages deleted by non-maintainer
|
|
id: restore
|
|
run: |
|
|
cd wiki
|
|
git config core.quotePath false
|
|
|
|
# Any author email under this domain is the maintainer and may delete pages.
|
|
OWNER_DOMAIN="neilpang.com"
|
|
|
|
: > ../restored.txt
|
|
|
|
# Paths deleted within the recent window (rolling; the cron runs
|
|
# every 10 minutes, so 7 days gives ample overlap without
|
|
# resurrecting old deletions the maintainer already accepted).
|
|
# --no-renames makes a rename count as a deletion of the old path,
|
|
# so a page renamed by a non-maintainer is restored under its
|
|
# original name (the new name stays -- creating pages is allowed).
|
|
git log --since="7 days ago" --diff-filter=D --no-renames --name-only --format= \
|
|
| sort -u \
|
|
| while IFS= read -r f; do
|
|
if [ -z "$f" ] || [ -e "$f" ]; then
|
|
continue
|
|
fi
|
|
# The most recent commit (in full history) that deleted this path.
|
|
del="$(git log -1 --diff-filter=D --no-renames --format=%H -- "$f")"
|
|
if [ -z "$del" ]; then
|
|
continue
|
|
fi
|
|
ae="$(git show -s --format=%ae "$del" | tr 'A-Z' 'a-z')"
|
|
case "$ae" in
|
|
*@"$OWNER_DOMAIN")
|
|
continue
|
|
;;
|
|
esac
|
|
an="$(git show -s --format=%an "$del")"
|
|
echo "Restoring: $f (deleted in $del by $an <$ae>)"
|
|
git checkout "$del^" -- "$f"
|
|
printf '%s\n' "- \`$f\` deleted in $del by $an <$ae>" >> ../restored.txt
|
|
done
|
|
|
|
if [ -s ../restored.txt ]; then
|
|
git config user.name "github-actions[bot]"
|
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
git commit -m "Restore pages deleted by non-maintainer"
|
|
git push origin HEAD || { git pull --rebase && git push origin HEAD; }
|
|
{
|
|
echo "The following wiki pages were deleted or renamed by someone other than the maintainer and have been restored automatically:"
|
|
echo ""
|
|
cat ../restored.txt
|
|
echo ""
|
|
echo "Wiki: https://github.com/${GITHUB_REPOSITORY}/wiki"
|
|
} > ../restore-msg.txt
|
|
echo "restored=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "No unauthorized deletions found."
|
|
echo "restored=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Create issue to notify Neilpang
|
|
if: steps.restore.outputs.restored == 'true'
|
|
uses: peter-evans/create-issue-from-file@v6
|
|
with:
|
|
title: "Wiki pages restored after unauthorized deletion"
|
|
content-filepath: ./restore-msg.txt
|
|
assignees: Neilpang
|