You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit cd6865d
Browse filesBrowse the repository at this point in the historyBrowse files
Licence-change feeds per entry, and one OPML for the whole shortlist (#186)
- lib/changes.mjs reads the catalog's git history once (with patches,
following moves by file name) for changes to license, commercial,
attribution_required and status; a file's creating commit is not a
change. 136 changes on 80 entries today
- the build writes entry/<id>/changes.xml (Atom, newest first; an entry
with no changes is a valid empty feed), linked from each entry page
- the shortlist panel's "Follow licence changes (OPML)" bundles the
shortlisted entries' feeds for a feed reader, in one step
- build.mjs: one gitCached() helper (per-HEAD cache inside .git) now
serves both the sitemap dates and the change history
Checked in a browser: the OPML lists each shortlisted feed; a feed shows
its recorded changes.
Closes#186
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LpkeXQPaUhxjgqdqnk6BrJ
<p class="page-actions"><a class="btn" href="${esc(entry.url)}" rel="noopener noreferrer">Go to source</a></p>
178
+
<p class="entry-feed"><a href="changes.xml" type="application/atom+xml">Follow licence changes</a> (an Atom feed of changes to this licence, its commercial use, credit or status)</p>
178
179
<p class="page-links">
179
180
<a href="${esc(`${repo}/blob/main/${entry.path}`)}" rel="noopener noreferrer">View the file on GitHub</a>
180
181
<a href="${esc(issue)}" rel="noopener noreferrer">Report a problem with this entry</a>
eq("changes: the creating commit is not a change",(ev.get("a")||[]).some((e)=>e.commit==="aaa"),false);
2660
+
eq("changes: a moved file keeps its history, unchanged values skipped",ev.get("a").map((e)=>`${e.date}${e.field}${e.from}>${e.to}`).join("|"),"2026-08-01 license CC0>CC-BY-4.0|2026-09-01 commercial true>false");
2661
+
eq("changes: README files are not entries",ev.has("README"),false);
2662
+
constfeed=changesFeedXml({entry: {id: "a",name: "A & B"},events: ev.get("a"),siteUrl: "https://x.test/s/",generatedAt: "2026-11-07T00:00:00Z"});
has("feed: escaped title",feed,"A & B: licence changes");
2666
+
has("feed: updated is the last change",feed,"<updated>2026-09-01T00:00:00Z</updated>");
2667
+
has("feed: an entry without changes is a valid empty feed",changesFeedXml({entry: {id: "z",name: "Z"},events: [],siteUrl: "https://x.test/s/",generatedAt: "2026-11-07T00:00:00Z"}),"<updated>2026-11-07T00:00:00Z</updated>");
2668
+
constopml=changesOpml([{id: "a",name: "A <1>"},{id: "b",name: "B"}],"https://x.test/s/");
2669
+
has("opml: one outline per entry",opml,'xmlUrl="https://x.test/s/entry/b/changes.xml"');
<buttontype="button" class="btn-ghost" data-shortlist-action="opml" title="Import into a feed reader to hear when any of these licences changes">Follow licence changes (OPML)</button>
0 commit comments