@@ -14,7 +14,9 @@ program
1414 . option ( '-r, --repo <repo>' , 'repo' )
1515 . option ( '-t, --tag <tag>' , 'tag' )
1616 . option ( '-n, --name <name>' , 'name' )
17- . option ( '-b, --body <body>' , 'body' , false ) ;
17+ . option ( '-b, --body <body>' , 'body' , false )
18+ . option ( '-d, --draft' , 'draft' )
19+ . option ( '-p, --prerelease' , 'prerelease' ) ;
1820
1921program . parse ( process . argv ) ;
2022
@@ -34,8 +36,60 @@ github.authenticate({
3436} ) ;
3537
3638const 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+ }
87+ } ) ;
88+ } ;
89+
90+ const getReleases = ( options ) => {
3791 return new Promise ( ( resolve , reject ) => {
38- github . repos . getReleaseByTag ( options , ( err , res ) => {
92+ github . repos . getReleases ( options , ( err , res ) => {
3993 err ? reject ( err ) : resolve ( res ) ;
4094 } ) ;
4195 } ) ;
@@ -83,7 +137,7 @@ const uploadAsset = (options) => {
83137
84138const fn = {
85139 'upload' : async ( ) => {
86- const { owner, repo, tag, name, body } = program ;
140+ const { owner, repo, tag, name, body, draft , prerelease } = program ;
87141 const files = args ;
88142 let release ;
89143
@@ -106,7 +160,9 @@ const fn = {
106160 repo : repo ,
107161 tag_name : tag ,
108162 name : name || tag ,
109- body : body || ''
163+ body : body || '' ,
164+ draft : draft || false ,
165+ prerelease : prerelease || false
110166 } ) ;
111167 } else if ( body && ( release . body !== body ) ) {
112168 console . log ( '> releases#editRelease' ) ;
@@ -116,7 +172,9 @@ const fn = {
116172 id : release . id ,
117173 tag_name : tag ,
118174 name : name || tag ,
119- body : body || ''
175+ body : body || '' ,
176+ draft : draft == null ? release . draft : draft ,
177+ prerelease : prerelease == null ? release . prerelease : prerelease
120178 } ;
121179 release = await editRelease ( releaseOptions ) ;
122180 }
@@ -140,7 +198,7 @@ const fn = {
140198 }
141199 } ,
142200 'delete' : async ( ) => {
143- const { owner, repo, tag, name, body } = program ;
201+ const { owner, repo, tag, name, body, draft , prerelease } = program ;
144202 const patterns = args ;
145203 let release ;
146204
0 commit comments