Skip to content

Commit 43475a6

Browse files
authored
Merge pull request #6 from applanga/AL-6517-cli-wildcard-versions
AL-6517 added support for wildcard versions
2 parents ad1b081 + c239ce8 commit 43475a6

File tree

3 files changed

+120
-4
lines changed

3 files changed

+120
-4
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ bin-release/
66

77
# Other files and folders
88
.settings/
9-
9+
node_modules
1010
# Executables
1111
*.swf
1212
*.air

index.js

+118-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,132 @@ const core = require('@actions/core');
22
const toolCache = require('@actions/tool-cache');
33
const process = require('process');
44
const childProcess = require('child_process');
5+
const https = require('https');
56

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+
}
6114

7115
async function run() {
8116
try {
9117
const applanga = 'applanga'
10118
const osPlatform = process.platform;
11119
var url = '', extractedFile = '';
12120
//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+
}
14131

15132
//checking if the file was alredy downloaded
16133
//if so, no need to redownload

package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "setup-applanga-cli",
3-
"version": "1.0.1",
3+
"version": "1.0.3",
44
"description": "Setup Applanga command line tool",
55
"main": "index.js",
66
"repository": {
@@ -21,7 +21,6 @@
2121
"bugs": {
2222
"url": "https://github.com/applanga/setup-applanga-cli/issues"
2323
},
24-
"devDependencies": {},
2524
"scripts": {
2625
"test": "echo \"Error: no test specified\" && exit 1"
2726
},

0 commit comments

Comments
 (0)