@@ -4,6 +4,15 @@ export const UnityChangeset = UnityChangesetClass;
4
4
export type UnityChangeset = UnityChangesetClass ;
5
5
6
6
const REGEXP_HUB_LINKS = / u n i t y h u b : \/ \/ \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
+ ] ;
7
16
8
17
/*
9
18
Unity release URLs for each lifecycle.
@@ -21,67 +30,37 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
21
30
* @returns An Unity changeset.
22
31
*/
23
32
export async function getUnityChangeset (
24
- db : string ,
25
33
version : string ,
26
34
) : 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
+ }
31
41
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 + $ / ) ;
33
46
const lifecycle = match ?. [ 2 ] as string ;
34
47
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 ) ;
56
52
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 } '` ) ;
67
56
}
68
- }
69
57
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
+ }
82
62
83
- return match . map ( ( m ) => UnityChangeset . createFromHref ( m ) ) ;
84
- } ) ;
63
+ return changeset ;
85
64
}
86
65
87
66
/*
@@ -156,14 +135,13 @@ export enum FormatMode {
156
135
}
157
136
158
137
export function listChangesets (
159
- db : string ,
160
138
searchMode : SearchMode ,
161
139
filterOptions : FilterOptions ,
162
140
groupMode : GroupMode ,
163
141
outputMode : OutputMode ,
164
142
formatMode : FormatMode ,
165
143
) : Promise < string > {
166
- return searchChangesets ( db , searchMode )
144
+ return searchChangesets ( searchMode )
167
145
. then ( ( results ) => filterChangesets ( results , filterOptions ) )
168
146
. then ( ( results ) => groupChangesets ( results , groupMode ) )
169
147
. then ( ( results ) => {
@@ -196,19 +174,48 @@ export function listChangesets(
196
174
} ) ;
197
175
}
198
176
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
+
199
197
export async function searchChangesets (
200
- db : string ,
201
198
searchMode : SearchMode ,
202
199
) : 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
+
204
211
switch ( searchMode ) {
205
212
case SearchMode . All :
206
- return results ;
213
+ return allResults ;
207
214
case SearchMode . Default :
208
- return results
215
+ return allResults
209
216
. filter ( ( c ) => ! c . preRelease ) ;
210
217
case SearchMode . PreRelease :
211
- return results
218
+ return allResults
212
219
. filter ( ( c ) => c . preRelease ) ;
213
220
default :
214
221
throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
0 commit comments