@@ -4,6 +4,15 @@ export const UnityChangeset = UnityChangesetClass;
44export type UnityChangeset = UnityChangesetClass ;
55
66const 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+ ] ;
716
817/*
918Unity release URLs for each lifecycle.
@@ -21,67 +30,37 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
2130 * @returns An Unity changeset.
2231 */
2332export 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
158137export 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+
199197export 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` ) ;
0 commit comments