From f209f602ccff9007193bc3e685e22fa75ff2aa27 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 30 Jun 2023 19:37:47 +0200
Subject: [PATCH] Fetch SD versions through 'gh release list -R libsdl-org/SDL
-L 1000'
---
packed/index.js | 144 ++++++++++++++++++++------------------------
src/constants.ts | 39 ------------
src/main.ts | 7 ++-
src/version.test.ts | 43 ++++++++++---
src/version.ts | 119 +++++++++++++++++++++++-------------
5 files changed, 185 insertions(+), 167 deletions(-)
diff --git a/packed/index.js b/packed/index.js
index 617f50d..734d5ae 100644
--- a/packed/index.js
+++ b/packed/index.js
@@ -7,47 +7,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.SDL_TAGS = exports.SDL_GIT_URL = exports.NINJA_VERSION = void 0;
+exports.SDL_GIT_URL = exports.NINJA_VERSION = void 0;
exports.NINJA_VERSION = "1.11.1";
exports.SDL_GIT_URL = "https://github.com/libsdl-org/SDL.git";
-exports.SDL_TAGS = [
- "2.0.22-RC1",
- "2.0.22-RC2",
- "2.0.22-RC3",
- "release-2.0.0",
- "release-2.0.1",
- "release-2.0.2",
- "release-2.0.3",
- "release-2.0.4",
- "release-2.0.5",
- "release-2.0.6",
- "release-2.0.7",
- "release-2.0.8",
- "release-2.0.9",
- "release-2.0.10",
- "release-2.0.12",
- "release-2.0.14",
- "release-2.0.16",
- "release-2.0.18",
- "release-2.0.20",
- "release-2.0.22",
- "prerelease-2.23.1",
- "prerelease-2.23.2",
- "release-2.24.0",
- "release-2.24.1",
- "release-2.24.2",
- "prerelease-2.25.1",
- "release-2.26.0",
- "release-2.26.1",
- "release-2.26.2",
- "release-2.26.3",
- "release-2.26.4",
- "release-2.26.5",
- "prerelease-2.27.1",
- // Add SDL2 releases here
- "prerelease-3.0.0",
- // Add SDL3 releases here
-];
/***/ }),
@@ -385,7 +347,7 @@ function get_cmake_toolchain_path() {
}
function run() {
return __awaiter(this, void 0, void 0, function () {
- var SDL_BUILD_PLATFORM, SETUP_SDL_ROOT, IGNORED_SHELLS, shell_in, SHELL, REQUESTED_VERSION_TYPE, CMAKE_BUILD_TYPE, CMAKE_BUILD_TYPES, git_branch_hash, requested_version, requested_type, sdl_release, GIT_HASH, CMAKE_TOOLCHAIN_FILE, STATE_HASH, PACKAGE_DIR, CACHE_KEY, CACHE_PATHS, sdl_from_cache, SOURCE_DIR, BUILD_DIR, USE_NINJA, cmake_configure_args, SDL_VERSION;
+ var SDL_BUILD_PLATFORM, SETUP_SDL_ROOT, IGNORED_SHELLS, shell_in, SHELL, REQUESTED_VERSION_TYPE, CMAKE_BUILD_TYPE, CMAKE_BUILD_TYPES, git_branch_hash, requested_version, requested_type, github_releases, release_db, sdl_release, GIT_HASH, CMAKE_TOOLCHAIN_FILE, STATE_HASH, PACKAGE_DIR, CACHE_KEY, CACHE_PATHS, sdl_from_cache, SOURCE_DIR, BUILD_DIR, USE_NINJA, cmake_configure_args, SDL_VERSION;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
@@ -428,7 +390,9 @@ function run() {
}
}
else {
- sdl_release = version_1.SdlRelease.find_release(requested_version, core.getBooleanInput("pre-release"), requested_type);
+ github_releases = version_1.GitHubRelease.fetch_all("libsdl-org/SDL");
+ release_db = version_1.SdlReleaseDb.create(github_releases);
+ sdl_release = release_db.find(requested_version, core.getBooleanInput("pre-release"), requested_type);
if (!sdl_release) {
throw new util_1.SetupSdlError("Could not find a matching SDL release for ".concat(requested_version));
}
@@ -845,10 +809,30 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.parse_requested_sdl_version = exports.SdlRelease = exports.SdlReleaseType = exports.SdlVersion = void 0;
+exports.parse_requested_sdl_version = exports.SdlRelease = exports.SdlReleaseDb = exports.SdlReleaseType = exports.SdlVersion = exports.GitHubRelease = void 0;
+var child_process = __importStar(__nccwpck_require__(2081));
var fs = __importStar(__nccwpck_require__(7147));
-var constants_1 = __nccwpck_require__(7077);
var util_1 = __nccwpck_require__(9731);
+var GitHubRelease = /** @class */ (function () {
+ function GitHubRelease(name, prerelease, tag, time) {
+ this.name = name;
+ this.prerelease = prerelease;
+ this.tag = tag;
+ this.time = time;
+ }
+ GitHubRelease.fetch_all = function (repo) {
+ var buffer = child_process.execSync("gh release list -R ".concat(repo, " -L 1000"));
+ return GitHubRelease.from_gh_output(buffer.toString());
+ };
+ GitHubRelease.from_gh_output = function (text) {
+ return text.trim().split("\n").map(function (line_str) {
+ var line_parts = line_str.split("\t");
+ return new GitHubRelease(line_parts[0], line_parts[1].toLowerCase() == "pre-release", line_parts[2], Date.parse(line_parts[3]));
+ });
+ };
+ return GitHubRelease;
+}());
+exports.GitHubRelease = GitHubRelease;
var SdlVersion = /** @class */ (function () {
function SdlVersion(version) {
if (typeof version == "string") {
@@ -961,20 +945,36 @@ var SdlReleaseType;
SdlReleaseType["Latest"] = "Latest";
SdlReleaseType["Exact"] = "Exact";
})(SdlReleaseType = exports.SdlReleaseType || (exports.SdlReleaseType = {}));
-var SdlRelease = /** @class */ (function () {
- function SdlRelease(version, prerelease, tag) {
- this.version = version;
- this.prerelease = prerelease;
- this.tag = tag;
+var SdlReleaseDb = /** @class */ (function () {
+ function SdlReleaseDb(releases) {
+ this.releases = releases;
}
- SdlRelease.get_releases = function () {
- var releases = [];
+ SdlReleaseDb.prototype.find = function (version, prerelease, type) {
+ for (var _i = 0, _a = this.releases; _i < _a.length; _i++) {
+ var release = _a[_i];
+ // Skip if a pre-release has not been requested
+ if (release.prerelease != null && !prerelease) {
+ continue;
+ }
+ if (type == SdlReleaseType.Exact) {
+ if (release.version.equals(version)) {
+ return release;
+ }
+ }
+ if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
+ if (release.version.major == version.major) {
+ return release;
+ }
+ }
+ }
+ return null;
+ };
+ SdlReleaseDb.create = function (github_releases) {
var R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
- for (var _i = 0, SDL_TAGS_1 = constants_1.SDL_TAGS; _i < SDL_TAGS_1.length; _i++) {
- var tag = SDL_TAGS_1[_i];
- var m = tag.match(R);
+ var releases = github_releases.map(function (gh_release) {
+ var m = gh_release.tag.match(R);
if (m == null) {
- throw new util_1.SetupSdlError("Invalid tag: ".concat(tag));
+ throw new util_1.SetupSdlError("Invalid tag: ".concat(gh_release.tag));
}
var prerelease = null;
if (m[1] != null && m[1] != "release-") {
@@ -984,34 +984,22 @@ var SdlRelease = /** @class */ (function () {
prerelease = Number(m[4]) + 1;
}
var version = m[2];
- releases.push(new SdlRelease(new SdlVersion(version), prerelease, tag));
- }
+ return new SdlRelease(new SdlVersion(version), prerelease, gh_release.tag);
+ });
releases.sort(function (release1, release2) {
return release1.compare(release2);
});
- return releases;
- };
- SdlRelease.find_release = function (version, prerelease, type) {
- var RELEASES = SdlRelease.get_releases();
- for (var _i = 0, RELEASES_1 = RELEASES; _i < RELEASES_1.length; _i++) {
- var sdl_release = RELEASES_1[_i];
- // Skip if a pre-release has not been requested
- if (sdl_release.prerelease != null && !prerelease) {
- continue;
- }
- if (type == SdlReleaseType.Exact) {
- if (sdl_release.version.equals(version)) {
- return sdl_release;
- }
- }
- if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
- if (sdl_release.version.major == version.major) {
- return sdl_release;
- }
- }
- }
- return null;
+ return new SdlReleaseDb(releases);
};
+ return SdlReleaseDb;
+}());
+exports.SdlReleaseDb = SdlReleaseDb;
+var SdlRelease = /** @class */ (function () {
+ function SdlRelease(version, prerelease, tag) {
+ this.version = version;
+ this.prerelease = prerelease;
+ this.tag = tag;
+ }
SdlRelease.prototype.compare = function (other) {
var cmp = this.version.compare(other.version);
if (cmp != 0) {
diff --git a/src/constants.ts b/src/constants.ts
index cfa7da9..7c1ba19 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -1,42 +1,3 @@
export const NINJA_VERSION = "1.11.1";
export const SDL_GIT_URL = "https://github.com/libsdl-org/SDL.git";
-
-export const SDL_TAGS = [
- "2.0.22-RC1",
- "2.0.22-RC2",
- "2.0.22-RC3",
- "release-2.0.0",
- "release-2.0.1",
- "release-2.0.2",
- "release-2.0.3",
- "release-2.0.4",
- "release-2.0.5",
- "release-2.0.6",
- "release-2.0.7",
- "release-2.0.8",
- "release-2.0.9",
- "release-2.0.10",
- "release-2.0.12",
- "release-2.0.14",
- "release-2.0.16",
- "release-2.0.18",
- "release-2.0.20",
- "release-2.0.22",
- "prerelease-2.23.1",
- "prerelease-2.23.2",
- "release-2.24.0",
- "release-2.24.1",
- "release-2.24.2",
- "prerelease-2.25.1",
- "release-2.26.0",
- "release-2.26.1",
- "release-2.26.2",
- "release-2.26.3",
- "release-2.26.4",
- "release-2.26.5",
- "prerelease-2.27.1",
- // Add SDL2 releases here
- "prerelease-3.0.0",
- // Add SDL3 releases here
-];
diff --git a/src/main.ts b/src/main.ts
index a13349d..89f2805 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -12,7 +12,8 @@ import { configure_ninja_build_tool } from "./ninja";
import { SetupSdlError } from "./util";
import {
- SdlRelease,
+ GitHubRelease,
+ SdlReleaseDb,
SdlReleaseType,
SdlVersion,
parse_requested_sdl_version,
@@ -306,7 +307,9 @@ async function run() {
throw new SetupSdlError("Invalid -head version");
}
} else {
- const sdl_release = SdlRelease.find_release(
+ const github_releases = GitHubRelease.fetch_all("libsdl-org/SDL");
+ const release_db = SdlReleaseDb.create(github_releases);
+ const sdl_release = release_db.find(
requested_version,
core.getBooleanInput("pre-release"),
requested_type
diff --git a/src/version.test.ts b/src/version.test.ts
index 9a55536..a2e677e 100644
--- a/src/version.test.ts
+++ b/src/version.test.ts
@@ -1,12 +1,39 @@
import {
+ GitHubRelease,
parse_requested_sdl_version,
SdlVersion,
SdlRelease,
+ SdlReleaseDb,
SdlReleaseType,
} from "./version";
import { describe, expect, test } from "@jest/globals";
+const GH_RELEASE_OUTPUT = ""
+ + "3.1.1\tLatest\tprerelease-3.1.1\t2023-12-25T18:45:17Z\n"
+ + "2.28.0\tLatest\trelease-2.28.0\t2023-06-20T18:45:17Z\n"
+ + "2.28.0 RC1\tPre-release\tprerelease-2.27.1\t2023-06-14T03:59:14Z\n"
+ + "2.26.5\t\trelease-2.26.5\t2023-04-05T19:35:40Z\n"
+ + "2.26.4\t\trelease-2.26.4\t2023-03-07T00:17:02Z\n"
+ + "2.26.3\t\trelease-2.26.3\t2023-02-06T23:31:56Z\n"
+ + "2.26.2\t\trelease-2.26.2\t2023-01-03T15:08:11Z\n"
+ + "2.26.1\t\trelease-2.26.1\t2022-12-01T20:33:11Z\n"
+ + "2.26.0\t\trelease-2.26.0\t2022-11-22T00:28:26Z\n"
+ + "2.26.0 RC1\tPre-release\tprerelease-2.25.1\t2022-11-17T17:49:02Z\n"
+ + "2.24.2\t\trelease-2.24.2\t2022-11-01T13:39:15Z\n"
+ + "2.24.1\t\trelease-2.24.1\t2022-10-05T00:16:33Z\n"
+ + "2.24.0\t\trelease-2.24.0\t2022-08-19T16:04:03Z\n"
+ + "2.0.22\t\trelease-2.0.22\t2022-04-25T19:20:25Z\n"
+ + "2.0.20\t\trelease-2.0.20\t2022-01-11T01:03:58Z\n"
+ + "2.0.18\t\trelease-2.0.18\t2021-11-30T17:15:42Z\n"
+ + "2.0.16\t\trelease-2.0.16\t2021-08-10T16:03:15Z\n"
+ + "2.0.14\t\trelease-2.0.14\t2021-07-08T17:14:16Z\n"
+ + "2.0.12\t\trelease-2.0.12\t2022-05-24T22:37:24Z\n"
+ + "2.0.10\t\trelease-2.0.10\t2022-05-24T22:35:08Z\n"
+ + "2.0.9\t\trelease-2.0.9\t2022-05-24T22:33:03Z\n"
+ + "2.0.8\t\trelease-2.0.8\t2022-05-23T22:20:21Z\n"
+;
+
describe("testing parsing of version string", () => {
function add_parse_to_version_test(
input: string,
@@ -69,11 +96,13 @@ describe("testing parsing of version string", () => {
});
describe("test finding a release", () => {
- expect(SdlRelease.get_releases()).toBeTruthy();
+ const github_releases = GitHubRelease.from_gh_output(GH_RELEASE_OUTPUT);
+ const sdl_release_db = SdlReleaseDb.create(github_releases);
+ expect(sdl_release_db.releases).toBeTruthy();
test(`test finding exact 2.0.22 release`, () => {
const v = new SdlVersion({ major: 2, minor: 0, patch: 22 });
- const rel = SdlRelease.find_release(v, true, SdlReleaseType.Exact);
+ const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
expect(rel).not.toBeNull();
if (rel) {
expect(rel.version).toStrictEqual(v);
@@ -83,7 +112,7 @@ describe("test finding a release", () => {
test(`test finding exact 2.26.1 release`, () => {
const v = new SdlVersion({ major: 2, minor: 26, patch: 1 });
- const rel = SdlRelease.find_release(v, true, SdlReleaseType.Exact);
+ const rel = sdl_release_db.find(v, true, SdlReleaseType.Exact);
expect(rel).not.toBeNull();
if (rel) {
expect(rel.version).toStrictEqual(v);
@@ -93,7 +122,7 @@ describe("test finding a release", () => {
test(`test finding latest 2 release`, () => {
const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
- const rel = SdlRelease.find_release(v, true, SdlReleaseType.Latest);
+ const rel = sdl_release_db.find(v, true, SdlReleaseType.Latest);
expect(rel).not.toBeNull();
if (rel) {
// 2.26.5 exists, so the result must be > 2.26.4
@@ -104,7 +133,7 @@ describe("test finding a release", () => {
test(`test finding latest non-prerelease 2 release`, () => {
const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
- const rel = SdlRelease.find_release(v, false, SdlReleaseType.Latest);
+ const rel = sdl_release_db.find(v, false, SdlReleaseType.Latest);
expect(rel).not.toBeNull();
if (rel) {
// 2.26.5 exists, so the result must be > 2.26.4
@@ -116,7 +145,7 @@ describe("test finding a release", () => {
test(`test finding any 2 release`, () => {
const v = new SdlVersion({ major: 2, minor: 0, patch: 0 });
- const rel = SdlRelease.find_release(v, true, SdlReleaseType.Any);
+ const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
expect(rel).not.toBeNull();
if (rel) {
// 2.26.5 exists, so the result must be > 2.26.4
@@ -126,7 +155,7 @@ describe("test finding a release", () => {
test(`test finding any 3 release`, () => {
const v = new SdlVersion({ major: 3, minor: 0, patch: 0 });
- const rel = SdlRelease.find_release(v, true, SdlReleaseType.Any);
+ const rel = sdl_release_db.find(v, true, SdlReleaseType.Any);
expect(rel).not.toBeNull();
if (rel) {
// FIXME: Only 3.0.0-prerelease exists at the moment
diff --git a/src/version.ts b/src/version.ts
index c0543c0..eb64351 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1,8 +1,38 @@
+import * as child_process from "child_process";
import * as fs from "fs";
-import { SDL_TAGS } from "./constants";
import { SetupSdlError } from "./util";
+export class GitHubRelease {
+ name: string;
+ prerelease: boolean;
+ tag: string;
+ time: number;
+ constructor(name: string, prerelease: boolean, tag: string, time: number) {
+ this.name = name;
+ this.prerelease = prerelease;
+ this.tag = tag;
+ this.time = time;
+ }
+
+ static fetch_all(repo: string): GitHubRelease[] {
+ const buffer = child_process.execSync(`gh release list -R ${repo} -L 1000`);
+ return GitHubRelease.from_gh_output(buffer.toString());
+ }
+
+ static from_gh_output(text: string): GitHubRelease[] {
+ return text.trim().split("\n").map(line_str => {
+ const line_parts = line_str.split("\t");
+ return new GitHubRelease(
+ line_parts[0],
+ line_parts[1].toLowerCase() == "pre-release",
+ line_parts[2],
+ Date.parse(line_parts[3]),
+ );
+ });
+ }
+}
+
export class SdlVersion {
major: number;
minor: number;
@@ -163,66 +193,73 @@ export enum SdlReleaseType {
Exact = "Exact",
}
-export class SdlRelease {
- version: SdlVersion;
- prerelease: number | null;
- tag: string;
+export class SdlReleaseDb {
+ releases: SdlRelease[];
- constructor(version: SdlVersion, prerelease: number | null, tag: string) {
- this.version = version;
- this.prerelease = prerelease;
- this.tag = tag;
+ constructor(releases: SdlRelease[]) {
+ this.releases = releases;
}
- static get_releases(): SdlRelease[] {
- const releases: SdlRelease[] = [];
- const R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
-
- for (const tag of SDL_TAGS) {
- const m = tag.match(R);
- if (m == null) {
- throw new SetupSdlError(`Invalid tag: ${tag}`);
- }
- let prerelease: number | null = null;
- if (m[1] != null && m[1] != "release-") {
- prerelease = 1;
- } else if (m[3] != null && m[4] != null) {
- prerelease = Number(m[4]) + 1;
- }
- const version = m[2];
- releases.push(new SdlRelease(new SdlVersion(version), prerelease, tag));
- }
- releases.sort(function (release1, release2) {
- return release1.compare(release2);
- });
- return releases;
- }
-
- static find_release(
+ find(
version: SdlVersion,
prerelease: boolean,
type: SdlReleaseType
): SdlRelease | null {
- const RELEASES: SdlRelease[] = SdlRelease.get_releases();
- for (const sdl_release of RELEASES) {
+ for (const release of this.releases) {
// Skip if a pre-release has not been requested
- if (sdl_release.prerelease != null && !prerelease) {
+ if (release.prerelease != null && !prerelease) {
continue;
}
if (type == SdlReleaseType.Exact) {
- if (sdl_release.version.equals(version)) {
- return sdl_release;
+ if (release.version.equals(version)) {
+ return release;
}
}
if (type == SdlReleaseType.Latest || type == SdlReleaseType.Any) {
- if (sdl_release.version.major == version.major) {
- return sdl_release;
+ if (release.version.major == version.major) {
+ return release;
}
}
}
return null;
}
+ static create(github_releases: GitHubRelease[]): SdlReleaseDb {
+
+ const R = new RegExp("(release-|prerelease-)?([0-9.]+)(-RC([0-9]+))?");
+ const releases = github_releases.map(gh_release => {
+ const m = gh_release.tag.match(R);
+ if (m == null) {
+ throw new SetupSdlError(`Invalid tag: ${gh_release.tag}`);
+ }
+ let prerelease: number | null = null;
+ if (m[1] != null && m[1] != "release-") {
+ prerelease = 1;
+ } else if (m[3] != null && m[4] != null) {
+ prerelease = Number(m[4]) + 1;
+ }
+ const version = m[2];
+ return new SdlRelease(new SdlVersion(version), prerelease, gh_release.tag);
+ });
+ releases.sort((release1, release2) => {
+ return release1.compare(release2);
+ });
+
+ return new SdlReleaseDb(releases);
+ }
+}
+
+export class SdlRelease {
+ version: SdlVersion;
+ prerelease: number | null;
+ tag: string;
+
+ constructor(version: SdlVersion, prerelease: number | null, tag: string) {
+ this.version = version;
+ this.prerelease = prerelease;
+ this.tag = tag;
+ }
+
compare(other: SdlRelease): number {
const cmp = this.version.compare(other.version);
if (cmp != 0) {