Skip to content

Commit 7bd7d2f

Browse files
committed
fix: get changeset from rss
1 parent 3db1fa9 commit 7bd7d2f

File tree

5 files changed

+113
-96
lines changed

5 files changed

+113
-96
lines changed

.github/workflows/update-changesets.yml

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ name: update-changesets
22

33
env:
44
WORKFLOW_FILE: update-changesets.yml
5-
DB_FILE: db
65
RSS_URLS: |
76
https://unity.com/releases/editor/lts-releases.xml
87
https://unity.com/releases/editor/tech-and-preview-releases.xml
@@ -39,30 +38,7 @@ jobs:
3938
[ "$RESULT" = "false" ] && echo "::error::Other '${{ env.WORKFLOW_FILE }}' workflows are in progress." && exit 1 || :
4039
4140
- name: 🛠️ Update changesets file
42-
run: |
43-
touch "${{ env.DB_FILE }}"
44-
urls=(`echo "${{ env.RSS_URLS }}"`)
45-
for url in "${urls[@]}"; do
46-
# Find versions from RSS
47-
echo "Processing: $url" | tee -a $GITHUB_STEP_SUMMARY
48-
versions=($(curl -s "$url" | grep -oE "${{ env.REGEX_UNITY_VERSION }}" | sort -u))
49-
50-
for version in "${versions[@]}"; do
51-
# Already exists
52-
if grep -q "$version" "${{ env.DB_FILE }}"; then
53-
continue
54-
fi
55-
56-
# Get changeset for the Unity version
57-
changeset_output=$(npx unity-changeset "$version" 2>/dev/null)
58-
59-
if [ $? -eq 0 ]; then
60-
echo -e "$version\t$changeset_output" | tee -a "${{ env.DB_FILE }}" $GITHUB_STEP_SUMMARY
61-
else
62-
echo " Error: $version is not valid"
63-
fi
64-
done
65-
done
41+
run: npx unity-changeset list --all > db
6642

6743
- name: Commit & Push changes
6844
uses: actions-js/push@master

.vscode/launch.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,25 @@
44
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7+
{
8+
"request": "launch",
9+
"name": "list",
10+
"type": "node",
11+
"program": "${workspaceFolder}/src/cli.ts",
12+
"cwd": "${workspaceFolder}",
13+
"env": {},
14+
"runtimeExecutable": "/Users/takashi.sakai/.asdf/shims/deno",
15+
"runtimeArgs": [
16+
"run",
17+
"--unstable",
18+
"--inspect-brk",
19+
"--allow-all"
20+
],
21+
"args": [
22+
"list"
23+
],
24+
"attachSimplePort": 9229
25+
},
726
{
827
"request": "launch",
928
"name": "list --versions",
@@ -43,6 +62,25 @@
4362
],
4463
"attachSimplePort": 9229
4564
},
65+
{
66+
"request": "launch",
67+
"name": "6000.0.25f2",
68+
"type": "node",
69+
"program": "${workspaceFolder}/src/cli.ts",
70+
"cwd": "${workspaceFolder}",
71+
"env": {},
72+
"runtimeExecutable": "/Users/takashi.sakai/.asdf/shims/deno",
73+
"runtimeArgs": [
74+
"run",
75+
"--unstable",
76+
"--inspect-brk",
77+
"--allow-all"
78+
],
79+
"args": [
80+
"6000.0.25f2"
81+
],
82+
"attachSimplePort": 9229
83+
},
4684
{
4785
"request": "launch",
4886
"name": "--help",

src/cli.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ new Command()
3030
.description("Find Unity changesets.")
3131
.example("unity-changeset 2018.4.36f1", "Get changeset of Unity 2018.4.36f1 ('6cd387d23174' will be output).")
3232
.arguments("<version>")
33-
.globalOption("--db", "Database url", { default: "https://mob-sakai.github.io/unity-changeset/db" })
34-
.action((options, version) => {
35-
getUnityChangeset(options.db as string, version)
33+
.action((_, version) => {
34+
getUnityChangeset(version)
3635
.then((c) => console.log(c.changeset))
3736
.catch(() => {
3837
console.error("The given version was not found.");
@@ -46,7 +45,6 @@ new Command()
4645
"list",
4746
new Command()
4847
.description("List Unity changesets.")
49-
.globalOption("--db", "Database url", { default: "https://mob-sakai.github.io/unity-changeset/db" })
5048
.example("unity-changeset list", "List changesets.")
5149
.example("unity-changeset list --all --json", "List changesets of all versions in json format.")
5250
.example("unity-changeset list --version-only --min 2018.3 --max 2019.4", "List all versions from 2018.3 to 2019.4.")
@@ -114,7 +112,7 @@ new Command()
114112
? FormatMode.PrettyJson
115113
: FormatMode.None;
116114

117-
listChangesets(options.db as string, searchMode, filterOptions, groupMode, outputMode, formatMode)
115+
listChangesets(searchMode, filterOptions, groupMode, outputMode, formatMode)
118116
.then((result) => console.log(result));
119117
}),
120118
)

src/index.ts

Lines changed: 66 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ export const UnityChangeset = UnityChangesetClass;
44
export type UnityChangeset = UnityChangesetClass;
55

66
const REGEXP_HUB_LINKS = /unityhub:\/\/\d{4}\.\d+\.\d+(a|b|f)\d+\/\w{12}/g;
7+
const REGEXP_UNITY_VERSION = /\d{4}\.\d+\.\d+(a|b|f)\d+/g;
8+
const UNITY_CHANGESETS_DB_URL =
9+
"https://mob-sakai.github.io/unity-changeset/db";
10+
const UNITY_RSS_URLS: string[] = [
11+
"https://unity.com/releases/editor/lts-releases.xml",
12+
"https://unity.com/releases/editor/tech-and-preview-releases.xml",
13+
"https://unity.com/releases/editor/beta-releases.xml",
14+
"https://unity.com/releases/editor/alpha-releases.xml",
15+
];
716

817
/*
918
Unity release URLs for each lifecycle.
@@ -21,67 +30,37 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
2130
* @returns An Unity changeset.
2231
*/
2332
export async function getUnityChangeset(
24-
db: string,
2533
version: string,
2634
): Promise<UnityChangeset> {
27-
let results = await loadDb(db, version);
28-
if (0 < results.length) {
29-
return results[0];
30-
}
35+
const db = await loadDb();
36+
const results = db.filter((c) => c.version === version);
37+
return results.length > 0
38+
? results[0]
39+
: getUnityChangesetFromReleasePage(version);
40+
}
3141

32-
const match = version.match(/^(\d\.\d+\.\d+)(a|b|f|p)\d+$/);
42+
async function getUnityChangesetFromReleasePage(
43+
version: string,
44+
): Promise<UnityChangeset> {
45+
const match = version.match(/^(\d+\.\d+\.\d+)(a|b|f|p)\d+$/);
3346
const lifecycle = match?.[2] as string;
3447
const releaseUrl = UNITY_RELEASE_URLS[lifecycle];
35-
if (lifecycle == "f") {
36-
const shortVersion = match?.[1] as string;
37-
results = (await getUnityChangesetsFromUrl(releaseUrl + shortVersion))
38-
.filter((c) => c.version === version);
39-
} else {
40-
results = (await getUnityChangesetsFromUrl(releaseUrl + version))
41-
.filter((c) => c.version === version);
42-
}
43-
44-
if (0 < results.length) {
45-
return results[0];
46-
}
47-
48-
throw new Error(`No changeset found for '${version}'`);
49-
}
50-
51-
export async function loadDb(
52-
db: string,
53-
version?: string,
54-
): Promise<UnityChangeset[]> {
55-
const response = await fetch(db);
48+
const shortVersion = match?.[1] as string;
49+
const releasePageUrl = releaseUrl +
50+
(lifecycle == "f" ? shortVersion : version);
51+
const response = await fetch(releasePageUrl);
5652
const text = await response.text();
57-
const lines = text.split("\n");
58-
59-
if (version) {
60-
const startsWith = version + "\t";
61-
return lines
62-
.filter((line) => line.startsWith(startsWith))
63-
.map((line) => UnityChangeset.createFromDb(line));
64-
} else {
65-
return lines
66-
.map((line) => UnityChangeset.createFromDb(line));
53+
const matchLink = text.match(REGEXP_HUB_LINKS);
54+
if (!matchLink) {
55+
throw new Error(`No changeset found at '${releasePageUrl}'`);
6756
}
68-
}
6957

70-
function getUnityChangesetsFromUrl(
71-
url: string,
72-
): Promise<UnityChangeset[]> {
73-
return fetch(url)
74-
.then((response) => response.text())
75-
.then((raw) => {
76-
const match = raw.match(REGEXP_HUB_LINKS);
77-
78-
if (!match) {
79-
console.error(`No changesets found at '${url}'`);
80-
return [];
81-
}
58+
const changeset = UnityChangeset.createFromHref(matchLink[0]);
59+
if (changeset.version !== version) {
60+
throw new Error(`No changeset found at '${releasePageUrl}'`);
61+
}
8262

83-
return match.map((m) => UnityChangeset.createFromHref(m));
84-
});
63+
return changeset;
8564
}
8665

8766
/*
@@ -156,14 +135,13 @@ export enum FormatMode {
156135
}
157136

158137
export function listChangesets(
159-
db: string,
160138
searchMode: SearchMode,
161139
filterOptions: FilterOptions,
162140
groupMode: GroupMode,
163141
outputMode: OutputMode,
164142
formatMode: FormatMode,
165143
): Promise<string> {
166-
return searchChangesets(db, searchMode)
144+
return searchChangesets(searchMode)
167145
.then((results) => filterChangesets(results, filterOptions))
168146
.then((results) => groupChangesets(results, groupMode))
169147
.then((results) => {
@@ -196,19 +174,48 @@ export function listChangesets(
196174
});
197175
}
198176

177+
async function loadDb(): Promise<UnityChangeset[]> {
178+
const response = await fetch(UNITY_CHANGESETS_DB_URL);
179+
const text = await response.text();
180+
const lines = text.split("\n");
181+
return lines
182+
.map((line) => UnityChangeset.createFromDb(line));
183+
}
184+
185+
async function findVersions(url: string): Promise<string[]> {
186+
const response = await fetch(url);
187+
const text = await response.text();
188+
const lines = text.split("\n");
189+
190+
const versions = lines
191+
.map((l) => l.match(REGEXP_UNITY_VERSION))
192+
.filter((m) => m)
193+
.map((m) => m?.[0] as string);
194+
return Array.from(new Set<string>(versions));
195+
}
196+
199197
export async function searchChangesets(
200-
db: string,
201198
searchMode: SearchMode,
202199
): Promise<UnityChangeset[]> {
203-
const results = await loadDb(db);
200+
const results = await loadDb();
201+
const versions = await Promise.all(UNITY_RSS_URLS
202+
.map((url) => findVersions(url)));
203+
const appendResults = await Promise.all(
204+
versions
205+
.flat()
206+
.filter((v) => !results.some((r) => r.version === v))
207+
.map((v) => getUnityChangesetFromReleasePage(v)),
208+
);
209+
const allResults = results.concat(appendResults);
210+
204211
switch (searchMode) {
205212
case SearchMode.All:
206-
return results;
213+
return allResults;
207214
case SearchMode.Default:
208-
return results
215+
return allResults
209216
.filter((c) => !c.preRelease);
210217
case SearchMode.PreRelease:
211-
return results
218+
return allResults
212219
.filter((c) => c.preRelease);
213220
default:
214221
throw Error(`The given search mode '${searchMode}' was not supported`);

src/unityChangeset.test.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import {
1414
UnityChangeset,
1515
} from "./index.ts";
1616

17-
const DB_URL = "https://mob-sakai.github.io/unity-changeset/db";
18-
1917
Deno.test("UnityChangeset.toNumber min", () => {
2018
assertEquals(UnityChangeset.toNumber("2018.3", false), 201803000000);
2119
});
@@ -34,22 +32,22 @@ Deno.test("UnityChangeset.toNumber max", () => {
3432
].forEach((testcase) => {
3533
Deno.test(`getUnityChangeset (${testcase.version})`, async () => {
3634
if (testcase.expected) {
37-
const changeset = (await getUnityChangeset(DB_URL, testcase.version)).changeset;
35+
const changeset = (await getUnityChangeset(testcase.version)).changeset;
3836
assertEquals(changeset, testcase.expected);
3937
}
4038
else {
41-
await assertRejects(() => getUnityChangeset(DB_URL, testcase.version));
39+
await assertRejects(() => getUnityChangeset(testcase.version));
4240
}
4341
})
4442
});
4543

4644
Deno.test("scrapeArchivedChangesets", async () => {
47-
const changesets = await searchChangesets(DB_URL, SearchMode.Default);
45+
const changesets = await searchChangesets(SearchMode.Default);
4846
assertNotEquals(changesets.length, 0);
4947
});
5048

5149
Deno.test("scrapeBetaChangesets", async () => {
52-
const changesets = await searchChangesets(DB_URL, SearchMode.PreRelease);
50+
const changesets = await searchChangesets(SearchMode.PreRelease);
5351
console.log(changesets.map((c) => c.version));
5452
assertNotEquals(changesets.length, 0);
5553
});
@@ -61,7 +59,7 @@ Deno.test("scrapeBetaChangesets", async () => {
6159
{ searchMode: SearchMode.PreRelease },
6260
].forEach((testcase) => {
6361
Deno.test(`filterChangesets(${JSON.stringify(testcase.searchMode)})`, async () => {
64-
const changesets = await searchChangesets(DB_URL, testcase.searchMode);
62+
const changesets = await searchChangesets(testcase.searchMode);
6563
assertNotEquals(changesets.length, 0);
6664
});
6765
});

0 commit comments

Comments
 (0)