Build & Deploy / deploy (push) Successful in 54s
Claude-Session: https://claude.ai/code/session_01GGe7kUhooMFuzY6GaDb2w9
78 lines
2.7 KiB
Python
Executable File
78 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Pinger IndexNow med de sider der er ændret i dette push. Kør efter buildet
|
|
(bruger public/sitemap-0.xml). --dry-run viser hvad der ville blive sendt."""
|
|
import json
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import urllib.error
|
|
import urllib.request
|
|
|
|
HOST = "asger.weirsoe.dk"
|
|
KEY = "b68b31655cb9c1a662d53905dd0b1b06"
|
|
ORIGIN = f"https://{HOST}"
|
|
|
|
|
|
def git(*args):
|
|
r = subprocess.run(["git", *args], capture_output=True, text=True)
|
|
return r.stdout.strip() if r.returncode == 0 else None
|
|
|
|
|
|
def sitemap_urls():
|
|
with open("public/sitemap-0.xml") as f:
|
|
return set(re.findall(r"<loc>([^<]+)</loc>", f.read()))
|
|
|
|
|
|
def route_for_file(f):
|
|
"""Kanonisk form uden afsluttende skråstreg, som i sitemap'et."""
|
|
m = re.fullmatch(r"content/(.+?)(/index|/_index|_index)?\.md", f)
|
|
if m:
|
|
return "/" + m[1].rstrip("/") if m[1] != "_index" else "/"
|
|
m = re.fullmatch(r"templates/sider/(.+)\.html", f) or re.fullmatch(r"data/(.+)\.json", f)
|
|
if m:
|
|
name = {"forside": "", "forside-en": "en"}.get(m[1], m[1])
|
|
return "/en/" + name[:-3] if name.endswith("-en") else "/" + name
|
|
return None
|
|
|
|
|
|
def changed_files():
|
|
before, sha = os.environ.get("GITHUB_EVENT_BEFORE"), os.environ.get("GITHUB_SHA")
|
|
if before and not re.fullmatch(r"0*", before):
|
|
d = git("diff", "--name-only", before, sha or "HEAD")
|
|
if d is not None:
|
|
return d.split("\n") if d else []
|
|
d = git("diff", "--name-only", "HEAD~1", "HEAD")
|
|
return d.split("\n") if d else None
|
|
|
|
|
|
def main():
|
|
files = changed_files()
|
|
if files is None:
|
|
print("IndexNow: kan ikke bestemme hvad der ændrede sig (shallow clone?), springer over.")
|
|
return
|
|
valid = sitemap_urls()
|
|
urls = sorted({ORIGIN + r for r in map(route_for_file, files) if r} & valid)
|
|
if not urls:
|
|
print("IndexNow: ingen sider med ændret indhold i dette push, springer over.")
|
|
return
|
|
print(f"IndexNow: indsender {len(urls)} URL(er):")
|
|
for u in urls:
|
|
print(" ", u)
|
|
if "--dry-run" in sys.argv:
|
|
print("IndexNow: --dry-run, sender ikke.")
|
|
return
|
|
body = {"host": HOST, "key": KEY, "keyLocation": f"{ORIGIN}/{KEY}.txt", "urlList": urls}
|
|
req = urllib.request.Request("https://api.indexnow.org/indexnow", data=json.dumps(body).encode(),
|
|
headers={"Content-Type": "application/json; charset=utf-8"}, method="POST")
|
|
try:
|
|
with urllib.request.urlopen(req, timeout=30) as r:
|
|
print(f"IndexNow: HTTP {r.status} {r.reason}")
|
|
except urllib.error.URLError as e:
|
|
# Deployet er allerede ude, så vi fejler ikke buildet.
|
|
print(f"IndexNow: afvist: {e}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|