mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-07-13 16:16:44 +02:00
added automatic Changelog XML to new Website.
also now the XML gets pulled from new Website
This commit is contained in:
@@ -0,0 +1,382 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Historical changelog entries for releases not published as GitHub Releases.
|
||||
The CI pipeline prepends new entries from GitHub Releases on top of these. -->
|
||||
<history>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.41</changedVersionNumber>
|
||||
<date>2026-07-01</date>
|
||||
<description>Map view and path calculations</description>
|
||||
<added>
|
||||
Band and Frequency Detection per Chatmember, Band alert, Win-Test SKED Push via UDP,
|
||||
Win-Test Broadcast Defaults and SKed Workflow, Chat History at Startup, Station Map / Map View
|
||||
Local Leaflet /-TileProxy Backend, Maidenhead /-Grid Overlay, Path calculation, path profile,
|
||||
Reachability filters, NAC filters (grid sqaure marking)
|
||||
</added>
|
||||
<changed>
|
||||
button housing, it works now on smaller screens / plus: detecting maximum screen size
|
||||
</changed>
|
||||
<fixed>
|
||||
9A2HM reported that 23cm qsos with N1MM are not marked correctly, ist fixed
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.40</changedVersionNumber>
|
||||
<date>2026-02-16</date>
|
||||
<description>Much changes and fixes</description>
|
||||
<added>
|
||||
- win-test support (not deactivable yet, beta)
|
||||
- QSO sniffer which filters changable callsigns lists messages to your pm window
|
||||
- Chatmember Score system. Each chatmember gets a score depending to antenna direction, activity time,
|
||||
activity msgcount, positive signals, active bands, active frequencies, his sked direction (degrees),
|
||||
self handed rate, sked-made-rate and some others
|
||||
- Chatmember Band and frequency recognition: now we list all active bands of each other chatmember
|
||||
- Band alert for logged stations
|
||||
- Sked reminder ALERT with automatic messages in 2+1 / 5+2+1 / 10+5+2+1 minutes
|
||||
- PSTRotator interface
|
||||
- AirPlane Timeline
|
||||
- Skedfail button in furtherinfo panel
|
||||
- Wintest logsynch interface can now be activated and deactivated in the preferences
|
||||
- load chat history on startup
|
||||
</added>
|
||||
<changed>
|
||||
- added save option: ServerDNS / Port
|
||||
- added save option: activate/deactivate pstRotator interface
|
||||
- added save option: activate/deactivate wintest interface
|
||||
- added save option: callsign sniffer
|
||||
- added save option: boolean GUI_darkModeActiveByDefault = false
|
||||
- added AP notes at the internal DX cluster spots
|
||||
- Generic Autoanswer fires maximum once in 45 seconds per rx callsign
|
||||
</changed>
|
||||
<fixed>
|
||||
- Userlist sort automatically on new member signon
|
||||
- Posonpill-messages now kills only exactly one Client instance (bugreport 9A2HM)
|
||||
- Crash of wtkst by disconnection of kst4Contest
|
||||
- wtKST crashes when kst4contest is running (many reporters)
|
||||
- wintest: logged per band excludes pre worked band (bugreport SM6VTZ)
|
||||
- PSTRotator SOCKET Close on DISCONNECT BUTTON works now
|
||||
- AirScout Map had not been updated (bugreport SM0RJV)
|
||||
- QTFDefault had been not saved correctly (bugreport SM0RJV)
|
||||
- Show path in AS button worked only with fixed server Strings (bugreport 9A2HM)
|
||||
- Version number had been displayed wrong
|
||||
- suffixes like /p, -2, etc. problem now fixed everywhere
|
||||
- Dark mode: passing for qrg fields fix
|
||||
</fixed>
|
||||
<removed>
|
||||
- No more date display. Not needed. Saving space, only time is important
|
||||
</removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.31</changedVersionNumber>
|
||||
<date>2025-12-13</date>
|
||||
<description>Much changes and a hotfix</description>
|
||||
<added>
|
||||
- win-test support (not deactivable yet, beta)
|
||||
- pstRotator support (not deactivable yet, beta)
|
||||
- airScout fix (calculations depends to cpu load now)
|
||||
- QSO sniffer
|
||||
</added>
|
||||
<changed>
|
||||
- DNS from www.on4kst.info to www.on4kst.org (hotfix, now configurable in preferences)
|
||||
</changed>
|
||||
<fixed>
|
||||
- Endless loop in error case lets freeze the client
|
||||
- PSTRotator SOCKET Close on DISCONNECT BUTTON
|
||||
- Dark mode: passing for qrg fields fix
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.266</changedVersionNumber>
|
||||
<date>2025-10-03</date>
|
||||
<description>Airscout interface did not work with multi-signons</description>
|
||||
<added>nothing</added>
|
||||
<changed>nothing</changed>
|
||||
<fixed>
|
||||
Fixed by using raw callsign (without -2 suffix etc.) when communicating with AirScout.
|
||||
Thank you very much for testing this, Kreso 9A2HM!
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.265</changedVersionNumber>
|
||||
<date>2025-09-28</date>
|
||||
<description>Direction buttons stay now colored, if activated</description>
|
||||
<added>nothing</added>
|
||||
<changed>nothing</changed>
|
||||
<fixed>The buttons stay now colored, if activated</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.264</changedVersionNumber>
|
||||
<date>2025-08-02</date>
|
||||
<description>Changed the callsign recognition pattern for Simplelogfile</description>
|
||||
<added>nothing</added>
|
||||
<changed>nothing</changed>
|
||||
<fixed>
|
||||
Callsigns like S53CC, S51A etc. are now correctly marked as worked in SimpleLogFile.txt.
|
||||
(bugreport Boris, S53CC)
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.263</changedVersionNumber>
|
||||
<date>2025-06-08</date>
|
||||
<description>Airscout communication and Loginname</description>
|
||||
<added>nothing</added>
|
||||
<changed>
|
||||
Only entries with QRB lower than max-QRB are sent to AirScout in 60s intervals (was 12s for all).
|
||||
</changed>
|
||||
<fixed>
|
||||
- AS communication message count hugely reduced
|
||||
- Name in chat is now saveable
|
||||
- Fixed AS client name (was hard-wired to "KST")
|
||||
73 / DO5AMF
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.262</changedVersionNumber>
|
||||
<date>2025-05-21</date>
|
||||
<description>Freezes caused by getting messages before user login should be fixed now</description>
|
||||
<added>nothing</added>
|
||||
<changed>nothing</changed>
|
||||
<fixed>
|
||||
ON4KST delivers messages of stations not yet logged in. That caused a freeze at the message
|
||||
processing engine which is now fixed.
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.26</changedVersionNumber>
|
||||
<date>2025-05</date>
|
||||
<description>Login to multiple Channels via single signon / spend some colors</description>
|
||||
<added>
|
||||
1. UI: Dark mode. Switch in "Window -> use dark mode"
|
||||
2. Usage of two Chatcategories at the same time
|
||||
3. opposite station multi-callsign login-tagging
|
||||
73 / DO5AMF
|
||||
</added>
|
||||
<changed>
|
||||
- Coloring mechanic of the software. Modify colors via css by yourself...
|
||||
</changed>
|
||||
<fixed>
|
||||
- Station tagging fixed completely
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.251</changedVersionNumber>
|
||||
<date>2025-02</date>
|
||||
<description>BUGFIX of 1.25, tnx Steve Clements!</description>
|
||||
<added>
|
||||
- Steve spotted a problem in udp broadcast spot info reading, its now fixed!
|
||||
73 / DO5AMF
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed>- Station tagging</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.25</changedVersionNumber>
|
||||
<date>2025-02</date>
|
||||
<description>Wishlist-time</description>
|
||||
<added>
|
||||
- New configuration Tab: Messagehandling (auto-answering, CQ qrg auto-answer)
|
||||
- Coloured lines: new pm rows appear in red, fade rainbow-like to white over 30s (tnx Gianluca)
|
||||
73 / DO5AMF
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed>
|
||||
- Users with suffixes like "-2 and -70" are now correctly marked as worked
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.24</changedVersionNumber>
|
||||
<date>2024-11</date>
|
||||
<description>Wishlist-time</description>
|
||||
<added>
|
||||
- Button to show qrz.com profile of a selected station
|
||||
- Button to show qrzcq.com profile of a selected station
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.23</changedVersionNumber>
|
||||
<date>2024-10</date>
|
||||
<description>DXCluster Server is now implemented</description>
|
||||
<added>
|
||||
- DXCluster Server (tnx OMAAO): KST4Contest now provides a DXCluster server to feed
|
||||
your log client with station-reachable warnings.
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.22</changedVersionNumber>
|
||||
<date>2024-05</date>
|
||||
<description>Increase usability, fixed AS button</description>
|
||||
<added>- Variables (tnx OMAAO): MYLOCATORSHORT, MYQRGSHORT, QRZNAME</added>
|
||||
<changed>- Sendtext-field focus on callsign click</changed>
|
||||
<fixed>
|
||||
- Worked-station-filter (tnx Gianluca): filter is now live
|
||||
- Chatters list sorting by QRB (tnx Alessandro): fixed to numeric sort
|
||||
- Airscout showpath button now maximizes AS and shows the path
|
||||
</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.21</changedVersionNumber>
|
||||
<date>2024-04</date>
|
||||
<description>Increase usability</description>
|
||||
<added></added>
|
||||
<changed>
|
||||
- Window sizes and divider positions are now stored and restored on next startup
|
||||
- Filters section is now a flowpane for lower resolutions
|
||||
</changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.2</changedVersionNumber>
|
||||
<date>2024-04</date>
|
||||
<description>Increase usability</description>
|
||||
<added>
|
||||
- Selectable bands
|
||||
- Unworkable tags for each callsign per band
|
||||
- QTF-Arrow on the "show path in AS" button
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.1</changedVersionNumber>
|
||||
<date>2024-03</date>
|
||||
<description>Increased workflow</description>
|
||||
<added>
|
||||
- Reachable warning function
|
||||
- Variables FIRSTAP and SECONDAP for predefined texts
|
||||
- Marking new connected stations (bold) and away-state (brackets)
|
||||
- Activity-timer since last message of a chatter
|
||||
</added>
|
||||
<changed>- QRB/QTF info in pm-window</changed>
|
||||
<fixed>
|
||||
- Behaviour of messagefilter-radiobutton corrected (tnx Gian)
|
||||
- Error sending macros on selected stations in pm window (tnx Gian)
|
||||
</fixed>
|
||||
<removed>- boot sound</removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>1.0</changedVersionNumber>
|
||||
<date>2024-02</date>
|
||||
<description>First stable release</description>
|
||||
<added>
|
||||
- audio notification support
|
||||
- update-available warning
|
||||
- changelog displaying
|
||||
- known-bugs displaying
|
||||
- message filters for selected station
|
||||
- stationlist-filters (show by qtf / textstring, hide by qrb, qtf, workedstate)
|
||||
- 10 macros (textsnippets available by hitting strg+numberkey)
|
||||
</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.9</changedVersionNumber>
|
||||
<date>2024-02</date>
|
||||
<description>Now the chat is disconnectable without closing it</description>
|
||||
<added></added>
|
||||
<changed></changed>
|
||||
<fixed>disconnect-button, Textsnippets in CQ Window, "/CQ" at click on own sendtexts,
|
||||
setname "qrg" works now</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.8</changedVersionNumber>
|
||||
<date>2023-10</date>
|
||||
<description>savesettings function and disconnect function added. MYCALL-Highlighting fixed</description>
|
||||
<added>savesettings function, disconnect function</added>
|
||||
<changed></changed>
|
||||
<fixed>MYCALL-Highlighting</fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.7</changedVersionNumber>
|
||||
<date>2023-07</date>
|
||||
<description>Internal database for worked stations, shortcut and textsnippet editor</description>
|
||||
<added>database, shortcut-editor, textsnipped-editor</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.6</changedVersionNumber>
|
||||
<date>2023-07</date>
|
||||
<description>Added periodically sent beacon function</description>
|
||||
<added>beacon to public channel</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.5</changedVersionNumber>
|
||||
<date>2023-02</date>
|
||||
<description>Airscout interface, UDP interfaces for worked-station data and TRX info, shortcuts</description>
|
||||
<added>Airscout-interface, packetreceiver for ucxlog, n1mm, qartest</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.4</changedVersionNumber>
|
||||
<date>2022-12</date>
|
||||
<description>Worked info by logfile via universal pattern matching logfile interpreter</description>
|
||||
<added>simple-logfile</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.3</changedVersionNumber>
|
||||
<date>2022-10</date>
|
||||
<description>Added a GUI, chat was text based only</description>
|
||||
<added>Graphical user interface</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.2</changedVersionNumber>
|
||||
<date>2022-10</date>
|
||||
<description>Pattern matching system for frequency information, frequency collection per chatmember</description>
|
||||
<added>frequency-extraction for every callsign</added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.15</changedVersionNumber>
|
||||
<date>2022-09</date>
|
||||
<description>Researched the Chatprotocol and developed the base communication with the chatserver</description>
|
||||
<added></added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
<changeLog>
|
||||
<changedVersionNumber>0.1</changedVersionNumber>
|
||||
<date>2022-09</date>
|
||||
<description>Primary architecture of the chat, message bus system for handling the message queues</description>
|
||||
<added></added>
|
||||
<changed></changed>
|
||||
<fixed></fixed>
|
||||
<removed></removed>
|
||||
</changeLog>
|
||||
</history>
|
||||
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Static roadmap/bugsReported sections carried over from the previously
|
||||
hand-maintained kst4ContestVersionInfo.xml on do5amf.funkerportal.de.
|
||||
UpdateChecker.java does not parse these today; kept for parity/history. -->
|
||||
<legacy>
|
||||
<roadmap>
|
||||
<featurerequest>
|
||||
<featureDescription>Cyclic update of own name in chat to actual QRG</featureDescription>
|
||||
<requestDate>2024-02</requestDate>
|
||||
<state>open</state>
|
||||
</featurerequest>
|
||||
<featurerequest>
|
||||
<featureDescription>Acoustic warnings</featureDescription>
|
||||
<requestDate>2023-12</requestDate>
|
||||
<state>added</state>
|
||||
</featurerequest>
|
||||
<featurerequest>
|
||||
<featureDescription>Airscout support</featureDescription>
|
||||
<requestDate>2023-03</requestDate>
|
||||
<state>added</state>
|
||||
</featurerequest>
|
||||
<featurerequest>
|
||||
<featureDescription>cyclic beacon messages in public chat</featureDescription>
|
||||
<requestDate>2023-03</requestDate>
|
||||
<state>added</state>
|
||||
</featurerequest>
|
||||
</roadmap>
|
||||
<bugsReported>
|
||||
<bug>
|
||||
<bugdescription>
|
||||
stations like ol7c-7 and ol7c-2 will not be marked as worked if only "ol7c"
|
||||
is in the log. Need to interprete that. May ignore suffix starting with "-"</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>
|
||||
worked callsigns table is updated only once after connected to chat
|
||||
Should be available directly after program started.
|
||||
But Reset works all time</bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request: language-specific strings, maybe based to an xml file
|
||||
</bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request: Macros
|
||||
</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
Automatic elimination of calls already connected from the log
|
||||
</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
Limitation of users beyond a certain QRB
|
||||
</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
User division for QTF perhaps settable based on the antenna lobe
|
||||
</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
Notification of new incoming users</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
Evidence of a call which was written but not responded to.
|
||||
</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
direction based reachable-warnings:
|
||||
if the chatclient detects a realised qso between two stations which both must have
|
||||
directed their beams to my station, there should be an instant warning to me for
|
||||
working at least one of the stations at the detected qrg</bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
implement ASShowpath message to airacout;
|
||||
by doubleclicking a callsign in the chatmember list, the path and plane state should be
|
||||
provided by airscout </bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
make chatlines copyable to the clipboard...</bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>feature request:
|
||||
adding an activity detection for sensing if another chatmembers alive-state</bugdescription>
|
||||
<state>added</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>On sql error close the connection to make a clean exit</bugdescription>
|
||||
<state>open</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>SETNAME /MYQRG in options menu doesnt work</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>Disconnect button does not work (DL5ZK)</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>Password-wrong error not displayed (DO5SA)</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>/CQ isnt written on own PMs</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
<bug>
|
||||
<bugdescription>rightclick-textsnippets arent available in cq-table</bugdescription>
|
||||
<state>solved</state>
|
||||
</bug>
|
||||
</bugsReported>
|
||||
</legacy>
|
||||
@@ -0,0 +1,183 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const REPO = "praktimarc/kst4contest";
|
||||
const API = `https://api.github.com/repos/${REPO}`;
|
||||
const LABEL_MAP = { enhancement: "added", bug: "fixed" };
|
||||
|
||||
async function githubGet(urlPath) {
|
||||
const headers = { Accept: "application/vnd.github+json" };
|
||||
if (process.env.GITHUB_TOKEN) {
|
||||
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
||||
}
|
||||
const res = await fetch(`${API}${urlPath}`, { headers });
|
||||
if (!res.ok) {
|
||||
throw new Error(`GitHub API ${urlPath} failed: ${res.status}`);
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
// UpdateChecker.java parses <versionNumber> with Double.parseDouble() and
|
||||
// compares it against ApplicationConstants.APPLICATION_CURRENTVERSIONNUMBER,
|
||||
// which encodes patch releases by appending the patch digit(s) instead of a
|
||||
// third dot (e.g. tag v1.41.1 -> app version 1.411, v1.41.0 -> 1.41). See
|
||||
// commit 38ef50c ("...set to 1.41.1 for upcoming hotfix" -> 1.411).
|
||||
function toAppVersionNumber(tag) {
|
||||
const cleaned = tag.replace(/^v/, "");
|
||||
const [major, minor, ...rest] = cleaned.split(".");
|
||||
if (rest.length === 0) return cleaned;
|
||||
const patch = rest.join("");
|
||||
return /^0*$/.test(patch) ? `${major}.${minor}` : `${major}.${minor}${patch}`;
|
||||
}
|
||||
|
||||
function escapeXml(value) {
|
||||
return String(value ?? "")
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">");
|
||||
}
|
||||
|
||||
// Strips GitHub's auto-generated release-notes markdown noise (headings,
|
||||
// "Full Changelog" links, PR author attributions) down to plain text.
|
||||
function cleanReleaseBody(body) {
|
||||
const lines = [];
|
||||
for (let line of (body || "").split("\n")) {
|
||||
if (/^#{1,3}\s/.test(line)) continue;
|
||||
if (line.trim().startsWith("**Full Changelog**")) continue;
|
||||
line = line.replace(/\s+by @\S+ in https:\/\/\S+/, "");
|
||||
line = line.replace(/^\* /, "- ");
|
||||
if (line.trim()) lines.push(line);
|
||||
}
|
||||
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
||||
}
|
||||
|
||||
// Groups closed issues (excluding PRs) in the (since, until] window by
|
||||
// label into "added" (enhancement) / "fixed" (bug) bullet lists.
|
||||
async function getIssuesForRelease(since, until) {
|
||||
const buckets = { added: [], fixed: [] };
|
||||
let page = 1;
|
||||
for (;;) {
|
||||
const items = await githubGet(`/issues?state=closed&per_page=100&page=${page}`);
|
||||
if (!items.length) break;
|
||||
for (const issue of items) {
|
||||
if (issue.pull_request) continue;
|
||||
const closed = issue.closed_at || "";
|
||||
if (!(closed > since && closed <= until)) continue;
|
||||
const labels = issue.labels.map((l) => l.name);
|
||||
const bucket = Object.keys(LABEL_MAP).find((l) => labels.includes(l));
|
||||
if (bucket) buckets[LABEL_MAP[bucket]].push(`- ${issue.title}`);
|
||||
}
|
||||
if (items.length < 100) break;
|
||||
page++;
|
||||
}
|
||||
return { added: buckets.added.join("\n"), fixed: buckets.fixed.join("\n") };
|
||||
}
|
||||
|
||||
// version-history.xml holds hand-written <changeLog> entries for releases
|
||||
// published before GitHub Releases existed; re-emitted verbatim here.
|
||||
function loadHistoryEntries() {
|
||||
const historyPath = path.join(__dirname, "version-history.xml");
|
||||
const xml = fs.readFileSync(historyPath, "utf-8");
|
||||
return [...xml.matchAll(/<changeLog>[\s\S]*?<\/changeLog>/g)].map((m) => m[0]);
|
||||
}
|
||||
|
||||
function historyEntryVersion(entryXml) {
|
||||
const m = entryXml.match(/<changedVersionNumber>([\s\S]*?)<\/changedVersionNumber>/);
|
||||
return m ? m[1].trim() : null;
|
||||
}
|
||||
|
||||
// Static <roadmap>/<bugsReported> sections carried over from the previous
|
||||
// hand-maintained XML on do5amf.funkerportal.de. UpdateChecker.java doesn't
|
||||
// parse these, kept only so the migration doesn't drop existing content.
|
||||
function loadLegacySections() {
|
||||
const legacyPath = path.join(__dirname, "version-legacy-sections.xml");
|
||||
const xml = fs.readFileSync(legacyPath, "utf-8");
|
||||
const roadmap = xml.match(/<roadmap>[\s\S]*?<\/roadmap>/);
|
||||
const bugsReported = xml.match(/<bugsReported>[\s\S]*?<\/bugsReported>/);
|
||||
return [roadmap ? roadmap[0] : null, bugsReported ? bugsReported[0] : null].filter(Boolean);
|
||||
}
|
||||
|
||||
// Builds kst4ContestVersionInfo.xml (the update-checker feed read by
|
||||
// UpdateChecker.java) from GitHub releases + closed issues, falling back to
|
||||
// version-history.xml for releases that predate GitHub Releases.
|
||||
module.exports = async function () {
|
||||
const fallback = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<praktiKST></praktiKST>';
|
||||
|
||||
try {
|
||||
const historyEntries = loadHistoryEntries();
|
||||
|
||||
const rawReleases = await githubGet("/releases?per_page=100");
|
||||
const releases = rawReleases
|
||||
.map((r) => ({
|
||||
tagName: r.tag_name,
|
||||
publishedAt: r.published_at || "",
|
||||
name: r.name || r.tag_name,
|
||||
body: r.body || "",
|
||||
isPrerelease: r.prerelease
|
||||
}))
|
||||
.sort((a, b) => (a.publishedAt < b.publishedAt ? 1 : -1));
|
||||
|
||||
const stableReleases = releases.filter((r) => !r.isPrerelease);
|
||||
const stable = stableReleases[0];
|
||||
const ghVersions = new Set(stableReleases.map((r) => toAppVersionNumber(r.tagName)));
|
||||
|
||||
const parts = [];
|
||||
parts.push('<?xml version="1.0" encoding="UTF-8" standalone="no"?>');
|
||||
parts.push("<praktiKST>");
|
||||
|
||||
const latestTag = stable ? stable.tagName : null;
|
||||
const winFilename = latestTag ? `praktiKST-${latestTag}-windows-x64.zip` : "";
|
||||
|
||||
parts.push(" <latestVersion>");
|
||||
if (stable) {
|
||||
const latestIssues = await getIssuesForRelease("1970-01-01T00:00:00Z", stable.publishedAt);
|
||||
parts.push(` <versionNumber>${escapeXml(toAppVersionNumber(latestTag))}</versionNumber>`);
|
||||
parts.push(" <adminMessage></adminMessage>");
|
||||
parts.push(` <majorChanges>${escapeXml(latestIssues.added.slice(0, 300))}</majorChanges>`);
|
||||
parts.push(
|
||||
` <latestVersionPathOnWebserver>https://github.com/${REPO}/releases/download/${latestTag}/${winFilename}</latestVersionPathOnWebserver>`
|
||||
);
|
||||
}
|
||||
parts.push(" </latestVersion>");
|
||||
|
||||
// UpdateChecker.parseUpdateXMLFile() never actually reads this field
|
||||
// (setNeedUpdateResourcesSinceLastVersion is never called); the
|
||||
// previous server always hardcoded "nothing" here, so we match that.
|
||||
parts.push(" <needUpdateSinceLastVersion>");
|
||||
parts.push(" <filename>nothing</filename>");
|
||||
parts.push(" </needUpdateSinceLastVersion>");
|
||||
|
||||
for (const section of loadLegacySections()) {
|
||||
parts.push(section);
|
||||
}
|
||||
|
||||
for (let i = 0; i < stableReleases.length; i++) {
|
||||
const rel = stableReleases[i];
|
||||
const until = rel.publishedAt;
|
||||
const since = stableReleases[i + 1] ? stableReleases[i + 1].publishedAt : "1970-01-01T00:00:00Z";
|
||||
const issues = await getIssuesForRelease(since, until);
|
||||
|
||||
parts.push(" <changeLog>");
|
||||
parts.push(` <changedVersionNumber>${escapeXml(toAppVersionNumber(rel.tagName))}</changedVersionNumber>`);
|
||||
parts.push(` <date>${escapeXml(until.slice(0, 10))}</date>`);
|
||||
parts.push(` <description>${escapeXml(rel.name)}</description>`);
|
||||
parts.push(` <added>${escapeXml(issues.added)}</added>`);
|
||||
parts.push(` <changed>${escapeXml(cleanReleaseBody(rel.body))}</changed>`);
|
||||
parts.push(` <fixed>${escapeXml(issues.fixed)}</fixed>`);
|
||||
parts.push(" <removed></removed>");
|
||||
parts.push(" </changeLog>");
|
||||
}
|
||||
|
||||
for (const entry of historyEntries) {
|
||||
const version = historyEntryVersion(entry);
|
||||
if (version && ghVersions.has(version)) continue;
|
||||
parts.push(entry);
|
||||
}
|
||||
|
||||
parts.push("</praktiKST>");
|
||||
return parts.join("\n");
|
||||
} catch (err) {
|
||||
console.warn(`[versionInfo] Could not generate version info XML, using empty fallback: ${err.message}`);
|
||||
return fallback;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
permalink: /kst4ContestVersionInfo.xml
|
||||
eleventyExcludeFromCollections: true
|
||||
---
|
||||
{{ versionInfo | safe }}
|
||||
Reference in New Issue
Block a user