11'use strict'
22
3+ const File = require ( 'vinyl' )
34const fs = require ( 'fs-extra' )
5+ const { obj : map } = require ( 'through2' )
46const Octokit = require ( '@octokit/rest' )
57const path = require ( 'path' )
8+ const zip = require ( 'gulp-vinyl-zip' )
69
7- module . exports = ( dest , bundleName , owner , repo , token , updateMaster ) => async ( ) => {
10+ function getNextReleaseNumber ( { octokit, owner, repo, variant } ) {
11+ const prefix = `${ variant } -`
12+ const filter = ( entry ) => entry . name . startsWith ( prefix )
13+ return collectReleases ( { octokit, owner, repo, filter } ) . then ( ( releases ) => {
14+ if ( releases . length ) {
15+ releases . sort ( ( a , b ) => - 1 * a . name . localeCompare ( b . name , 'en' , { numeric : true } ) )
16+ const latestName = releases [ 0 ] . name
17+ return Number ( latestName . slice ( prefix . length ) ) + 1
18+ } else {
19+ return 1
20+ }
21+ } )
22+ }
23+
24+ function collectReleases ( { octokit, owner, repo, filter, page = 1 , accum = [ ] } ) {
25+ return octokit . repos . listReleases ( { owner, repo, page, per_page : 100 } ) . then ( ( result ) => {
26+ const releases = result . data . filter ( filter )
27+ const links = result . headers . link
28+ if ( links && links . includes ( '; rel="next"' ) ) {
29+ return collectReleases ( { octokit, owner, repo, filter, page : page + 1 , accum : accum . concat ( releases ) } )
30+ } else {
31+ return accum . concat ( releases )
32+ }
33+ } )
34+ }
35+
36+ function versionBundle ( bundleFile , tagName ) {
37+ return new Promise ( ( resolve , reject ) =>
38+ zip . src ( bundleFile )
39+ . on ( 'error' , reject )
40+ . pipe ( ( ( ) => {
41+ const meta = new File ( { path : 'ui.yml' , contents : Buffer . from ( `version: ${ tagName } \n` ) } )
42+ const stream = map ( ( file , _ , next ) => file . path === meta . path && file !== meta ? next ( ) : next ( null , file ) )
43+ stream . write ( meta )
44+ return stream
45+ } ) ( ) )
46+ . pipe ( zip . dest ( bundleFile ) )
47+ . on ( 'finish' , ( ) => resolve ( bundleFile ) )
48+ )
49+ }
50+
51+ module . exports = ( dest , bundleName , owner , repo , token , updateBranch ) => async ( ) => {
852 const octokit = new Octokit ( { auth : `token ${ token } ` } )
9- const {
10- data : { tag_name : lastTagName } ,
11- } = await octokit . repos . getLatestRelease ( { owner, repo } ) . catch ( ( ) => ( { data : { tag_name : 'v0' } } ) )
12- const tagName = `v${ Number ( lastTagName . substr ( 1 ) ) + 1 } `
13- const ref = 'heads/master'
53+ const branchName = process . env . GIT_BRANCH || 'master'
54+ const variant = branchName === 'master' ? 'prod' : branchName
55+ const ref = `heads/${ branchName } `
56+ const tagName = `${ variant } -${ await getNextReleaseNumber ( { octokit, owner, repo, variant } ) } `
1457 const message = `Release ${ tagName } `
1558 const bundleFileBasename = `${ bundleName } -bundle.zip`
16- const bundleFile = path . join ( dest , bundleFileBasename )
59+ const bundleFile = await versionBundle ( path . join ( dest , bundleFileBasename ) , tagName )
1760 let commit = await octokit . gitdata . getRef ( { owner, repo, ref } ) . then ( ( result ) => result . data . object . sha )
1861 const readmeContent = await fs
1962 . readFile ( 'README.adoc' , 'utf-8' )
@@ -35,7 +78,7 @@ module.exports = (dest, bundleName, owner, repo, token, updateMaster) => async (
3578 commit = await octokit . gitdata
3679 . createCommit ( { owner, repo, message, tree, parents : [ commit ] } )
3780 . then ( ( result ) => result . data . sha )
38- if ( updateMaster ) await octokit . gitdata . updateRef ( { owner, repo, ref, sha : commit } )
81+ if ( updateBranch ) await octokit . gitdata . updateRef ( { owner, repo, ref, sha : commit } )
3982 const uploadUrl = await octokit . repos
4083 . createRelease ( {
4184 owner,
0 commit comments