@@ -4,60 +4,66 @@ import dateFormat from "dateformat";
44import path from 'path' ;
55import { fileURLToPath } from 'url' ;
66
7- const __filename = fileURLToPath ( import . meta. url ) ;
8- const __dirname = path . dirname ( __filename ) ;
7+ const __dirname = path . dirname ( fileURLToPath ( import . meta. url ) ) ;
8+ const resolve = ( ... args ) => path . resolve ( __dirname , ... args ) ;
99
10- var src = {
11- git : simpleGit ( __dirname + "/../binaryen" ) ,
12- filter : tag => {
13- var match = / ^ v e r s i o n _ ( \d + ) $ / . exec ( tag ) ; // see: https://github.com/WebAssembly/binaryen/issues/1156
14- return match ? {
15- tag : tag ,
16- version : match [ 1 ] + ".0.0" ,
17- } : null ;
18- }
19- } ;
10+ const MAX_TAGS_LIMIT = 64 ;
2011
21- var dst = {
22- git : simpleGit ( __dirname + "/.." ) ,
12+ function isGreater ( a , b ) {
13+ const cmp = semver . compare ( semver . coerce ( a ) , semver . coerce ( b ) ) ;
14+ return cmp === 0
15+ ? a . includes ( "nightly" ) && ! b . includes ( "nightly" )
16+ : cmp > 0 ;
17+ }
18+
19+ const createRepo = ( path , regex , mapVersion ) => ( {
20+ git : simpleGit ( path ) ,
2321 filter : tag => {
24- var match = / ^ v ( \d + \. \d + \. \d + ) (?: \- | $ ) / . exec ( tag ) ;
22+ const match = regex . exec ( tag ) ;
2523 return match ? {
26- tag : tag ,
27- version : match [ 1 ]
24+ tag,
25+ version : mapVersion ( match ) ,
2826 } : null ;
2927 }
30- } ;
31-
32- function latest ( repo ) {
33- return new Promise ( ( resolve , reject ) => {
34- repo . git . tags ( { "--sort" : "-committerdate" } , ( err , tags ) => {
35- if ( err ) return reject ( err ) ;
36- for ( var i = 0 ; i < tags . all . length ; ++ i ) {
37- var result = repo . filter ( tags . all [ i ] ) ;
38- if ( result !== null ) {
39- repo . tag = result . tag ;
40- repo . version = result . version ;
41- return resolve ( ) ;
42- } ;
28+ } ) ;
29+
30+ // see: https://github.com/WebAssembly/binaryen/issues/1156
31+ const src = createRepo ( resolve ( '../binaryen' ) , / ^ v e r s i o n _ ( \d + ) (?: _ .* ) ? $ / , ( [ , maj ] ) => `${ maj } .0.0` ) ;
32+ const dst = createRepo ( resolve ( '..' ) , / ^ v ( \d + \. \d + \. \d + ) (?: \- | $ ) / , ( [ , ver ] ) => ver ) ;
33+
34+ async function latest ( repo ) {
35+ try {
36+ const tagsRaw = await repo . git . raw ( [ 'tag' , '--sort=-v:refname' ] ) ;
37+ const allTags = tagsRaw . split ( '\n' ) . filter ( Boolean ) . slice ( 0 , MAX_TAGS_LIMIT ) ;
38+
39+ for ( let tag of allTags ) {
40+ const res = repo . filter ( tag ) ;
41+ if ( res !== null ) {
42+ return res ;
4343 }
44- return reject ( Error ( "no matching tags: " + tags . all . join ( ", " ) ) ) ;
45- } ) ;
46- } ) . catch ( err => {
44+ }
45+ return { version : null , tag : null } ;
46+ } catch ( err ) {
4747 console . error ( err . stack ) ;
4848 process . exit ( 1 ) ;
49- } ) ;
49+ }
5050}
5151
52- if ( process . argv [ 2 ] === "tag" ) {
53- latest ( src ) . then ( ( ) => console . log ( src . tag ) ) ;
54- } else {
55- latest ( src ) . then ( ( ) => {
56- latest ( dst ) . then ( ( ) => {
57- if ( semver . gt ( src . version , dst . version ) )
58- console . log ( src . version ) ;
59- else
60- console . log ( src . version + "-nightly." + dateFormat ( Date . UTC ( ) , "yyyymmdd" ) ) ;
61- } ) ;
62- } ) ;
52+ async function main ( ) {
53+ if ( process . argv [ 2 ] === "tag" ) {
54+ const { tag } = await latest ( src ) ;
55+ console . log ( tag ) ;
56+ return ;
57+ }
58+
59+ let { version : srcVer } = await latest ( src ) ;
60+ let { version : dstVer } = await latest ( dst ) ;
61+
62+ if ( ! dstVer || isGreater ( srcVer , dstVer ) ) {
63+ console . log ( srcVer ) ;
64+ } else {
65+ console . log ( `${ srcVer } -nightly.${ dateFormat ( Date . UTC ( ) , "yyyymmdd" ) } ` ) ;
66+ }
6367}
68+
69+ main ( ) ;
0 commit comments