@@ -36,14 +36,62 @@ github.authenticate({
3636} ) ;
3737
3838const getReleaseByTag = ( options ) => {
39+ return new Promise ( async ( resolve , reject ) => {
40+ try {
41+ let page = 1 ;
42+ let lastPage = 1 ;
43+ let foundRelease = false ;
44+
45+ do {
46+ const releases = await getReleases ( {
47+ owner : options . owner ,
48+ repo : options . repo ,
49+ page : page ,
50+ per_page : 30
51+ } ) ;
52+
53+ console . log ( `Fetched ${ releases . length } results at page ${ page } .` ) ;
54+
55+ const searchedReleases = releases . filter ( r => r . tag_name === options . tag ||
56+ r . name === options . tag ) ;
57+ if ( searchedReleases . length ) {
58+ resolve ( releases [ 0 ] ) ;
59+ foundRelease = true ;
60+ break ;
61+ }
62+
63+ const pagination = ( releases . meta . link || '' ) . split ( ',' )
64+ . reduce ( ( acc , link ) => {
65+ const r = link . match ( / \? p a g e = ( \d ) + .* r e l = " ( \w + ) " / ) ;
66+ if ( r && r [ 1 ] && r [ 2 ] ) {
67+ const key = r [ 2 ] ;
68+ const value = Number ( r [ 1 ] ) || 0 ;
69+ acc [ key ] = value ;
70+ }
71+ return acc ;
72+ } , { } ) ;
73+
74+ if ( pagination . last > 0 ) {
75+ lastPage = pagination . last ;
76+ }
77+
78+ ++ page ;
79+ } while ( page <= lastPage ) ;
80+
81+ if ( ! foundRelease ) {
82+ reject ( 'Cannot find release' ) ;
83+ }
84+ } catch ( err ) {
85+ reject ( err ) ;
86+ return ;
87+ }
88+ } ) ;
89+ } ;
90+
91+ const getReleases = ( options ) => {
3992 return new Promise ( ( resolve , reject ) => {
4093 github . repos . getReleases ( options , ( err , res ) => {
41- if ( err ) {
42- reject ( err ) ;
43- return ;
44- }
45- const releases = res . filter ( r => r . tag_name === options . tag || r . name === options . tag ) ;
46- releases . length ? resolve ( releases [ 0 ] ) : reject ( 'Cannot find release' ) ;
94+ err ? reject ( err ) : resolve ( res ) ;
4795 } ) ;
4896 } ) ;
4997} ;
0 commit comments