This app was generated by Townie.
Serves the History section of a PostgreSQL commitfest patch page as an RSS feed. The commitfest JSON API (apiv1.py) doesn't expose history, so the patch page's HTML is fetched and parsed instead.
GET /patch/<id>— RSS feedGET /patch/<id>.json— parsed history as JSONGET /<id>— alias for the RSS feedGET /— form for looking up a patch
Trailing slashes are accepted. Example: feed for patch 6982.
Each history row becomes an item with title "who: what", description what, and the row's timestamp as pubDate. Item guids are hashes of the row contents, so they don't change when new rows are added. Responses carry an ETag (hash of the history) and answer If-None-Match with a 304 when nothing changed.
The parser (commitfest.ts) uses cheerio to locate the table following the <th>History</th> cell in patch.html. If the page doesn't match the expected structure, a ScrapeError (HTTP 502) is returned. Timestamps on commitfest are naive GMT (Django TIME_ZONE = "GMT", USE_TZ = False).
Parsed results are cached in blob storage for 10 minutes (cache.ts); concurrent requests for the same patch share one upstream fetch, and a failed refresh falls back to the cached copy.
main.ts— HTTP routescommitfest.ts— upstream fetch + HTML parsingrss.ts— RSS generation and ETagcache.ts— blob cacheconfig.ts— TTL constanttest/— parser and renderer tests (run withrun_file)