@@ -4,15 +4,12 @@ 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 UNITY_ARCHIVE_URL = "https://unity.com/releases/editor/archive" ;
8- const UNITY_RSS_URL = "https://unity.com/releases/editor/releases.xml" ;
9- const UNITY_BETA_RSS_URL = "https://unity.com/releases/editor/beta/latest.xml" ;
10- const UNITY_LTS_RSS_URL = "https://unity.com/releases/editor/lts-releases.xml" ;
117
128/*
139Unity release URLs for each lifecycle.
1410*/
1511const UNITY_RELEASE_URLS : { [ key : string ] : string } = {
12+ "p" : "https://unity.com/releases/editor/whats-new/" ,
1613 "f" : "https://unity.com/releases/editor/whats-new/" ,
1714 "a" : "https://unity.com/releases/editor/alpha/" ,
1815 "b" : "https://unity.com/releases/editor/beta/" ,
@@ -24,70 +21,50 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
2421 * @returns An Unity changeset.
2522 */
2623export async function getUnityChangeset (
24+ db : string ,
2725 version : string ,
2826) : Promise < UnityChangeset > {
29- const match = version . match ( / ^ ( \d { 4 } \. \d + \. \d + ) ( a | b | f ) \d + $ / ) ;
27+ let results = await loadDb ( db , version ) ;
28+ if ( 0 < results . length ) {
29+ return results [ 0 ] ;
30+ }
31+
32+ const match = version . match ( / ^ ( \d \. \d + \. \d + ) ( a | b | f | p ) \d + $ / ) ;
3033 const lifecycle = match ?. [ 2 ] as string ;
3134 const releaseUrl = UNITY_RELEASE_URLS [ lifecycle ] ;
32-
33- let results = [ ] ;
3435 if ( lifecycle == "f" ) {
3536 const shortVersion = match ?. [ 1 ] as string ;
3637 results = ( await getUnityChangesetsFromUrl ( releaseUrl + shortVersion ) )
3738 . filter ( ( c ) => c . version === version ) ;
38- if ( 0 < results . length ) return results [ 0 ] ;
39-
40- results = ( await scrapeArchivedChangesets ( ) )
41- . filter ( ( c ) => c . version === version ) ;
42- if ( 0 < results . length ) return results [ 0 ] ;
4339 } else {
4440 results = ( await getUnityChangesetsFromUrl ( releaseUrl + version ) )
4541 . filter ( ( c ) => c . version === version ) ;
46- if ( 0 < results . length ) return results [ 0 ] ;
4742 }
48-
49- throw new Error ( `No changeset found for '${ version } '` ) ;
50- }
5143
52- /*
53- * Scrape the archived Unity changesets from Unity archives.
54- * @returns The Unity changesets.
55- */
56- export function scrapeArchivedChangesets ( ) : Promise < UnityChangeset [ ] > {
57- return Promise . all ( [
58- getUnityChangesetsFromUrl ( UNITY_ARCHIVE_URL ) ,
59- getUnityChangesetsFromUrl ( UNITY_RSS_URL ) ,
60- getUnityChangesetsFromUrl ( UNITY_LTS_RSS_URL ) ,
61- ] )
62- . then ( ( results ) => {
63- const changesets = results [ 0 ] . concat ( results [ 1 ] ) ;
64- const ltsVersons = groupChangesets ( results [ 2 ] , GroupMode . LatestPatch )
65- . map ( ( c ) => c . minor ) ;
66- const unique = new Set ( ) ;
44+ if ( 0 < results . length ) {
45+ return results [ 0 ] ;
46+ }
6747
68- return changesets
69- . filter ( ( c ) => {
70- const duplicated = unique . has ( c . versionNumber ) ;
71- unique . add ( c . versionNumber ) ;
72- return ! duplicated ;
73- } )
74- . map ( ( c ) => {
75- c . lts = ltsVersons . includes ( c . minor ) ;
76- return c ;
77- } )
78- . sort ( ( a , b ) => b . versionNumber - a . versionNumber ) ;
79- } ) ;
48+ throw new Error ( `No changeset found for '${ version } '` ) ;
8049}
8150
82- /*
83- * Scrape the alpha/beta Unity changesets from Unity RSS feed.
84- * @returns The Unity changesets (alpha/beta).
85- */
86- export function scrapeBetaChangesets ( ) : Promise < UnityChangeset [ ] > {
87- return getUnityChangesetsFromUrl ( UNITY_BETA_RSS_URL )
88- . then ( ( results ) =>
89- results . sort ( ( a , b ) => b . versionNumber - a . versionNumber )
90- ) ;
51+ export async function loadDb (
52+ db : string ,
53+ version ?: string ,
54+ ) : Promise < UnityChangeset [ ] > {
55+ const response = await fetch ( db ) ;
56+ 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 ) ) ;
67+ }
9168}
9269
9370function getUnityChangesetsFromUrl (
@@ -110,13 +87,13 @@ function getUnityChangesetsFromUrl(
11087/*
11188 * Search mode.
11289 *
113- * All: All the changesets.
114- * Archived : Only the archived changesets.
115- * PreRelease: Only the alpha/beta changesets.
90+ * All: All changesets.
91+ * Default : Only non pre-release changesets.
92+ * PreRelease: Only pre-release ( alpha/beta) changesets.
11693 */
11794export enum SearchMode {
11895 All = 0 ,
119- Archived = 2 ,
96+ Default = 2 ,
12097 PreRelease = 3 ,
12198}
12299
@@ -179,13 +156,14 @@ export enum FormatMode {
179156}
180157
181158export function listChangesets (
159+ db : string ,
182160 searchMode : SearchMode ,
183161 filterOptions : FilterOptions ,
184162 groupMode : GroupMode ,
185163 outputMode : OutputMode ,
186164 formatMode : FormatMode ,
187165) : Promise < string > {
188- return searchChangesets ( searchMode )
166+ return searchChangesets ( db , searchMode )
189167 . then ( ( results ) => filterChangesets ( results , filterOptions ) )
190168 . then ( ( results ) => groupChangesets ( results , groupMode ) )
191169 . then ( ( results ) => {
@@ -218,20 +196,20 @@ export function listChangesets(
218196 } ) ;
219197}
220198
221- export function searchChangesets (
199+ export async function searchChangesets (
200+ db : string ,
222201 searchMode : SearchMode ,
223202) : Promise < UnityChangeset [ ] > {
203+ const results = await loadDb ( db ) ;
224204 switch ( searchMode ) {
225205 case SearchMode . All :
226- return Promise . all ( [
227- scrapeArchivedChangesets ( ) ,
228- scrapeBetaChangesets ( ) ,
229- ] )
230- . then ( ( r ) => r . flat ( ) ) ;
231- case SearchMode . Archived :
232- return scrapeArchivedChangesets ( ) ;
206+ return results ;
207+ case SearchMode . Default :
208+ return results
209+ . filter ( ( c ) => ! c . preRelease ) ;
233210 case SearchMode . PreRelease :
234- return scrapeBetaChangesets ( ) ;
211+ return results
212+ . filter ( ( c ) => c . preRelease ) ;
235213 default :
236214 throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
237215 }
0 commit comments