Spaces:
Sleeping
Sleeping
Commit ·
eb706ee
1
Parent(s): e4c8b1d
added modification to listen to content changes
Browse files
app.py
CHANGED
|
@@ -6,6 +6,7 @@ files with Pydantic, checks for duplicates, and comments results on the PR.
|
|
| 6 |
|
| 7 |
import logging
|
| 8 |
import os
|
|
|
|
| 9 |
import tempfile
|
| 10 |
import threading
|
| 11 |
from datetime import datetime, timezone
|
|
@@ -329,12 +330,27 @@ threading.Thread(target=startup_sweep, daemon=True).start()
|
|
| 329 |
# Webhook endpoint
|
| 330 |
# ---------------------------------------------------------------------------
|
| 331 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 332 |
@webhook_endpoint
|
| 333 |
async def validate(payload):
|
| 334 |
"""Handle incoming webhook events from HuggingFace."""
|
| 335 |
logger.info("Received webhook event: %s", payload.event)
|
| 336 |
|
| 337 |
-
# Filter:
|
| 338 |
if payload.event.scope == "discussion.comment":
|
| 339 |
logger.info("Skipping comment event")
|
| 340 |
return {"status": "skipped", "reason": "comment event"}
|
|
@@ -343,6 +359,22 @@ async def validate(payload):
|
|
| 343 |
logger.info("Skipping non-dataset event (type=%s)", payload.repo.type)
|
| 344 |
return {"status": "skipped", "reason": "not a dataset repo"}
|
| 345 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 346 |
if not payload.discussion or not payload.discussion.isPullRequest:
|
| 347 |
logger.info("Skipping non-PR event")
|
| 348 |
return {"status": "skipped", "reason": "not a pull request"}
|
|
|
|
| 6 |
|
| 7 |
import logging
|
| 8 |
import os
|
| 9 |
+
import re
|
| 10 |
import tempfile
|
| 11 |
import threading
|
| 12 |
from datetime import datetime, timezone
|
|
|
|
| 330 |
# Webhook endpoint
|
| 331 |
# ---------------------------------------------------------------------------
|
| 332 |
|
| 333 |
+
PR_REF_RE = re.compile(r"^refs/pr/(\d+)$")
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
def _extract_pr_nums_from_refs(payload) -> list[int]:
|
| 337 |
+
"""Extract PR numbers from updatedRefs in repo.content events."""
|
| 338 |
+
if not payload.updatedRefs:
|
| 339 |
+
return []
|
| 340 |
+
pr_nums = []
|
| 341 |
+
for ref in payload.updatedRefs:
|
| 342 |
+
m = PR_REF_RE.match(ref.ref)
|
| 343 |
+
if m:
|
| 344 |
+
pr_nums.append(int(m.group(1)))
|
| 345 |
+
return pr_nums
|
| 346 |
+
|
| 347 |
+
|
| 348 |
@webhook_endpoint
|
| 349 |
async def validate(payload):
|
| 350 |
"""Handle incoming webhook events from HuggingFace."""
|
| 351 |
logger.info("Received webhook event: %s", payload.event)
|
| 352 |
|
| 353 |
+
# Filter: ignore comments
|
| 354 |
if payload.event.scope == "discussion.comment":
|
| 355 |
logger.info("Skipping comment event")
|
| 356 |
return {"status": "skipped", "reason": "comment event"}
|
|
|
|
| 359 |
logger.info("Skipping non-dataset event (type=%s)", payload.repo.type)
|
| 360 |
return {"status": "skipped", "reason": "not a dataset repo"}
|
| 361 |
|
| 362 |
+
# Route 1: repo.content events (new commits pushed to PR branches)
|
| 363 |
+
if payload.event.scope == "repo.content":
|
| 364 |
+
pr_nums = _extract_pr_nums_from_refs(payload)
|
| 365 |
+
if not pr_nums:
|
| 366 |
+
logger.info("No PR refs in repo.content event")
|
| 367 |
+
return {"status": "skipped", "reason": "no PR refs"}
|
| 368 |
+
results = []
|
| 369 |
+
for pr_num in pr_nums:
|
| 370 |
+
try:
|
| 371 |
+
results.append(process_pr(pr_num))
|
| 372 |
+
except Exception:
|
| 373 |
+
logger.exception("Failed to process PR #%d", pr_num)
|
| 374 |
+
results.append({"status": "error", "pr": pr_num})
|
| 375 |
+
return {"status": "ok", "results": results}
|
| 376 |
+
|
| 377 |
+
# Route 2: discussion events (status changes, merges)
|
| 378 |
if not payload.discussion or not payload.discussion.isPullRequest:
|
| 379 |
logger.info("Skipping non-PR event")
|
| 380 |
return {"status": "skipped", "reason": "not a pull request"}
|