Skip to content

Commit 9e8e1af

Browse files
authored
Merge pull request #49 from pyth-network/feature/gatekeeper-docs-only
Skip extra approvals for docs-only PRs
2 parents 8772062 + 9a88c9b commit 9e8e1af

1 file changed

Lines changed: 41 additions & 1 deletion

File tree

.github/workflows/ai-gatekeeper.yaml

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ jobs:
3737
printf 'summary=%s\n' "No PR context; skipping gatekeeper checks." >> "$GITHUB_OUTPUT"
3838
echo "details=" >> "$GITHUB_OUTPUT"
3939
echo "is_bot=false" >> "$GITHUB_OUTPUT"
40+
echo "docs_only=false" >> "$GITHUB_OUTPUT"
4041
exit 0
4142
fi
4243
@@ -59,10 +60,44 @@ jobs:
5960
printf 'summary=%s\n' "Not a Devin-authored PR. Skipping human-review enforcement." >> "$GITHUB_OUTPUT"
6061
echo "details=" >> "$GITHUB_OUTPUT"
6162
echo "is_bot=false" >> "$GITHUB_OUTPUT"
63+
echo "docs_only=false" >> "$GITHUB_OUTPUT"
6264
exit 0
6365
fi
6466
echo "is_bot=true" >> "$GITHUB_OUTPUT"
6567
68+
# 2b. Docs-only changes skip additional approvals
69+
PR_FILES=$(gh api "repos/$REPO/pulls/$PR/files" --paginate)
70+
DOCS_ONLY=$(
71+
echo "$PR_FILES" | jq -r '
72+
if length == 0 then
73+
"false"
74+
else
75+
all(.[]; (
76+
(.filename | test("(?i)^(docs|doc)/"))
77+
or (.filename | test("(?i)\\.(md|mdx|markdown|rst|adoc)$"))
78+
or (.filename | test("(?i)(^|/)(README|CHANGELOG)(\\..*)?$"))
79+
)) | tostring
80+
end
81+
'
82+
)
83+
84+
if [ "$DOCS_ONLY" = "true" ]; then
85+
FILES_LIST=$(echo "$PR_FILES" | jq -r '[.[].filename] | map("- " + .) | join("\n")')
86+
echo "docs_only=true" >> "$GITHUB_OUTPUT"
87+
echo "conclusion=success" >> "$GITHUB_OUTPUT"
88+
printf 'summary=%s\n' "Docs-only changes detected. Additional approvals are not required." >> "$GITHUB_OUTPUT"
89+
{
90+
echo "details<<EOF"
91+
echo "Docs-only files:"
92+
echo "$FILES_LIST"
93+
echo "EOF"
94+
} >> "$GITHUB_OUTPUT"
95+
echo "approvals_list=" >> "$GITHUB_OUTPUT"
96+
echo "approvals_missing=0" >> "$GITHUB_OUTPUT"
97+
exit 0
98+
fi
99+
echo "docs_only=false" >> "$GITHUB_OUTPUT"
100+
66101
# 3. Reduce to latest review per human
67102
LATEST_REVIEWS_JSON=$(
68103
echo "$PR_DATA" | jq -c '
@@ -153,11 +188,16 @@ jobs:
153188
APPROVERS: ${{ steps.evaluate.outputs.approvals_list }}
154189
MISSING: ${{ steps.evaluate.outputs.approvals_missing }}
155190
CONCLUSION: ${{ steps.evaluate.outputs.conclusion }}
191+
DOCS_ONLY: ${{ steps.evaluate.outputs.docs_only }}
156192
run: |
157193
set -euo pipefail
158194
MARKER="<!-- bot-proxy-gatekeeper-comment -->"
159195
APPROVER_LINE="Current approvals: ${APPROVERS:-none}"
160-
if [ "$CONCLUSION" = "success" ]; then
196+
if [ "$DOCS_ONLY" = "true" ]; then
197+
MSG=$(printf "%s\n%s" \
198+
"$MARKER" \
199+
"📝 **Docs-only changes**: additional approvals are not required.")
200+
elif [ "$CONCLUSION" = "success" ]; then
161201
MSG=$(printf "%s\n%s\n\n**%s**" \
162202
"$MARKER" \
163203
"✅ **Review Requirements Satisfied**: 2 different human approvals are present." \

0 commit comments

Comments
 (0)