@@ -2,15 +2,132 @@ const core = require('@actions/core');
2
2
const toolCache = require ( '@actions/tool-cache' ) ;
3
3
const process = require ( 'process' ) ;
4
4
const childProcess = require ( 'child_process' ) ;
5
+ const https = require ( 'https' ) ;
5
6
7
+ async function getReleases ( ) {
8
+ return new Promise ( ( resolve , reject ) => {
9
+ https
10
+ . get (
11
+ "https://api.github.com/repos/applanga/applanga-cli/releases" ,
12
+ {
13
+ headers : { "User-Agent" : "Node.js" } ,
14
+ } ,
15
+ ( res ) => {
16
+ let data = "" ;
17
+
18
+ res . on ( "data" , ( chunk ) => {
19
+ data += chunk ;
20
+ } ) ;
21
+
22
+ res . on ( "end" , ( ) => {
23
+ if ( res . statusCode === 200 ) {
24
+ resolve ( JSON . parse ( data ) ) ;
25
+ } else {
26
+ reject ( new Error ( `Failed to get releases: ${ res . statusCode } ` ) ) ;
27
+ }
28
+ } ) ;
29
+ }
30
+ )
31
+ . on ( "error" , ( err ) => {
32
+ reject ( err ) ;
33
+ } ) ;
34
+ } ) ;
35
+ }
36
+
37
+ function compareVersions ( v1 , v2 ) {
38
+ const v1Parts = v1 . split ( "." ) . map ( Number ) ;
39
+ const v2Parts = v2 . split ( "." ) . map ( Number ) ;
40
+
41
+ for ( let i = 0 ; i < v1Parts . length ; i ++ ) {
42
+ if ( v1Parts [ i ] > v2Parts [ i ] ) return 1 ;
43
+ if ( v1Parts [ i ] < v2Parts [ i ] ) return - 1 ;
44
+ }
45
+
46
+ return 0 ;
47
+ }
48
+
49
+ async function getLatestVersion ( version ) {
50
+ const releases = await getReleases ( ) ;
51
+
52
+ // Regex patterns for the expected wildcard formats
53
+ const majorMinorPattern = / ^ ( \d + ) \. ( \d + ) \. \* $ / ; // match x.y.*
54
+ const majorPattern = / ^ ( \d + ) \. \* \. \* $ / ; // match x.*.*
55
+ const anyVersionPattern = / ^ \* $ / ; // match *
56
+
57
+ let latestVersion = null ;
58
+
59
+ switch ( true ) {
60
+ case majorMinorPattern . test ( version ) :
61
+ // Major.Minor.* pattern match
62
+ const [ _ , major , minor ] = version . match ( majorMinorPattern ) ;
63
+ for ( const release of releases ) {
64
+ const tagName = release . tag_name ;
65
+ if (
66
+ tagName . startsWith ( `${ major } .${ minor } .` ) &&
67
+ ! release . prerelease &&
68
+ ! release . draft &&
69
+ ( ! latestVersion || compareVersions ( tagName , latestVersion ) > 0 )
70
+ ) {
71
+ latestVersion = tagName ;
72
+ }
73
+ }
74
+ break ;
75
+
76
+ case majorPattern . test ( version ) :
77
+ // Major.*.* pattern match
78
+ const [ __ , majorOnly ] = version . match ( majorPattern ) ;
79
+ for ( const release of releases ) {
80
+ const tagName = release . tag_name ;
81
+ if (
82
+ tagName . startsWith ( `${ majorOnly } .` ) &&
83
+ ! release . prerelease &&
84
+ ! release . draft &&
85
+ ( ! latestVersion || compareVersions ( tagName , latestVersion ) > 0 )
86
+ ) {
87
+ latestVersion = tagName ;
88
+ }
89
+ }
90
+ break ;
91
+
92
+ case anyVersionPattern . test ( version ) :
93
+ // * pattern match
94
+ for ( const release of releases ) {
95
+ const tagName = release . tag_name ;
96
+ if (
97
+ ! release . prerelease &&
98
+ ! release . draft &&
99
+ ( ! latestVersion || compareVersions ( tagName , latestVersion ) > 0 )
100
+ ) {
101
+ latestVersion = tagName ;
102
+ }
103
+ }
104
+ break ;
105
+
106
+ default :
107
+ throw new Error (
108
+ `Invalid version pattern: ${ version } . Accepted patterns: *, x.*.*, x.y.*`
109
+ ) ;
110
+ }
111
+
112
+ return latestVersion ;
113
+ }
6
114
7
115
async function run ( ) {
8
116
try {
9
117
const applanga = 'applanga'
10
118
const osPlatform = process . platform ;
11
119
var url = '' , extractedFile = '' ;
12
120
//getting version from workflow input
13
- const version = core . getInput ( 'version' ) ;
121
+ let version = core . getInput ( 'version' ) ;
122
+
123
+ // Resolve version using wildcard
124
+ if ( version . includes ( '*' ) ) {
125
+ version = await getLatestVersion ( version ) ;
126
+ if ( ! version ) {
127
+ core . setFailed ( `No matching version found for: ${ core . getInput ( 'version' ) } ` ) ;
128
+ return ;
129
+ }
130
+ }
14
131
15
132
//checking if the file was alredy downloaded
16
133
//if so, no need to redownload
0 commit comments