@@ -14,6 +14,11 @@ const area: string = 'DownloadGitHubRelease';
1414const userAgent : string = 'download-github-release-task-' + packagejson . version ;
1515const defaultRetryLimit : number = 4 ;
1616
17+ interface Release {
18+ Id : number ;
19+ Name : string ;
20+ }
21+
1722function getDefaultProps ( ) {
1823 var hostType = ( tl . getVariable ( 'SYSTEM.HOSTTYPE' ) || "" ) . toLowerCase ( ) ;
1924 return {
@@ -52,15 +57,19 @@ function publishTelemetry(feature, properties: any): void {
5257 }
5358}
5459
55- async function getLatestRelease ( repositoryName : string , handler ) : Promise < string > {
56- var promise = new Promise < string > ( ( resolve , reject ) => {
60+ async function getLatestRelease ( repositoryName : string , handler ) : Promise < Release > {
61+ var promise = new Promise < Release > ( ( resolve , reject ) => {
5762 let httpClient : httpc . HttpClient = new httpc . HttpClient ( userAgent , [ handler ] ) ;
5863 let latestReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/latest" ;
5964 latestReleaseUrl = latestReleaseUrl . replace ( / ( [ ^ : ] \/ ) \/ + / g, "$1" ) ;
6065 httpClient . get ( latestReleaseUrl ) . then ( ( res ) => {
6166 res . readBody ( ) . then ( ( body ) => {
62- var response = JSON . parse ( body ) ;
63- resolve ( response [ "id" ] ) ;
67+ let response = JSON . parse ( body ) ;
68+ let release : Release = {
69+ Id : response [ "id" ] ,
70+ Name : response [ "tag_name" ]
71+ }
72+ resolve ( release ) ;
6473 } ) ;
6574 } , ( reason ) => {
6675 reject ( reason ) ;
@@ -70,15 +79,41 @@ async function getLatestRelease(repositoryName: string, handler): Promise<string
7079 return promise ;
7180}
7281
73- async function getTaggedRelease ( repositoryName : string , tag : string , handler ) : Promise < string > {
74- var promise = new Promise < string > ( ( resolve , reject ) => {
82+ async function getTaggedRelease ( repositoryName : string , tag : string , handler ) : Promise < Release > {
83+ var promise = new Promise < Release > ( ( resolve , reject ) => {
7584 let httpClient : httpc . HttpClient = new httpc . HttpClient ( userAgent , [ handler ] ) ;
7685 let taggedReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/tags/" + tag ;
7786 taggedReleaseUrl = taggedReleaseUrl . replace ( / ( [ ^ : ] \/ ) \/ + / g, "$1" ) ;
7887 httpClient . get ( taggedReleaseUrl ) . then ( ( res ) => {
7988 res . readBody ( ) . then ( ( body ) => {
80- var response = JSON . parse ( body ) ;
81- resolve ( response [ "id" ] ) ;
89+ let response = JSON . parse ( body ) ;
90+ let release : Release = {
91+ Id : response [ "id" ] ,
92+ Name : response [ "tag_name" ]
93+ }
94+ resolve ( release ) ;
95+ } ) ;
96+ } , ( reason ) => {
97+ reject ( reason ) ;
98+ } ) ;
99+ } ) ;
100+
101+ return promise ;
102+ }
103+
104+ async function getSpecificRelease ( repositoryName : string , version : string , handler ) : Promise < Release > {
105+ var promise = new Promise < Release > ( ( resolve , reject ) => {
106+ let httpClient : httpc . HttpClient = new httpc . HttpClient ( userAgent , [ handler ] ) ;
107+ let taggedReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + version ;
108+ taggedReleaseUrl = taggedReleaseUrl . replace ( / ( [ ^ : ] \/ ) \/ + / g, "$1" ) ;
109+ httpClient . get ( taggedReleaseUrl ) . then ( ( res ) => {
110+ res . readBody ( ) . then ( ( body ) => {
111+ let response = JSON . parse ( body ) ;
112+ let release : Release = {
113+ Id : response [ "id" ] ,
114+ Name : ! ! ( response [ "name" ] ) ? response [ "name" ] : response [ "tag_name" ]
115+ }
116+ resolve ( release ) ;
82117 } ) ;
83118 } , ( reason ) => {
84119 reject ( reason ) ;
@@ -96,7 +131,7 @@ async function main(): Promise<void> {
96131 let itemPattern = tl . getInput ( "itemPattern" , false ) ;
97132 let downloadPath = tl . getInput ( "downloadPath" , true ) ;
98133 let version = tl . getInput ( "version" , false ) ;
99- let releaseId ;
134+ let release : Release = null ;
100135
101136 var token = tl . getEndpointAuthorizationParameter ( connection , 'AccessToken' , false ) ;
102137 var retryLimit = parseInt ( tl . getVariable ( "VSTS_HTTP_RETRY" ) ) ? parseInt ( tl . getVariable ( "VSTS_HTTP_RETRY" ) ) : defaultRetryLimit ;
@@ -124,18 +159,38 @@ async function main(): Promise<void> {
124159 }
125160 }
126161
127- switch ( defaultVersionType . toLowerCase ( ) ) {
128- case 'latest' : releaseId = await executeWithRetries ( "getLatestRelease" , ( ) => getLatestRelease ( repositoryName , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
129- break ;
130- case 'specifictag' : releaseId = await executeWithRetries ( "getTaggedRelease" , ( ) => getTaggedRelease ( repositoryName , version , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
131- break ;
132- case 'specificversion' :
133- default : releaseId = version ;
162+ if ( ! ! defaultVersionType ) {
163+ switch ( defaultVersionType . toLowerCase ( ) ) {
164+ case 'latest' : release = await executeWithRetries ( "getLatestRelease" , ( ) => getLatestRelease ( repositoryName , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
165+ break ;
166+ case 'specifictag' : release = await executeWithRetries ( "getTaggedRelease" , ( ) => getTaggedRelease ( repositoryName , version , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
167+ break ;
168+ case 'specificversion' : release = await executeWithRetries ( "getSpecificRelease" , ( ) => getSpecificRelease ( repositoryName , version , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
169+ break ;
170+ default : release = null ;
171+ }
172+ } else {
173+ if ( ! ! version ) {
174+ release = await executeWithRetries ( "getTaggedRelease" , ( ) => getTaggedRelease ( repositoryName , version , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
175+ } else {
176+ release = await executeWithRetries ( "getLatestRelease" , ( ) => getLatestRelease ( repositoryName , customCredentialHandler ) , retryLimit ) . catch ( ( reason ) => { reject ( reason ) ; } ) ;
177+ }
178+ }
179+
180+ if ( ! release ) {
181+ reject ( tl . loc ( "InvalidDefaultVersionType" , defaultVersionType ) ) ;
182+ return ;
183+ }
184+
185+ if ( ! release . Id ) {
186+ reject ( tl . loc ( "InvalidRelease" , version ) ) ;
187+ return ;
134188 }
135189
136- var itemsUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + releaseId + "/assets" ;
190+ var itemsUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + release . Id + "/assets" ;
137191 itemsUrl = itemsUrl . replace ( / ( [ ^ : ] \/ ) \/ + / g, "$1" ) ;
138- console . log ( tl . loc ( "DownloadArtifacts" , releaseId , itemsUrl ) ) ;
192+
193+ console . log ( tl . loc ( "DownloadArtifacts" , release . Name , itemsUrl ) ) ;
139194
140195 var templatePath = path . join ( __dirname , 'githubrelease.handlebars.txt' ) ;
141196 var gitHubReleaseVariables = {
0 commit comments