Add support to specify major or major.minor versions for tools with GitHub repository

This commit is contained in:
Shivam Mathur
2021-07-05 16:12:58 +05:30
parent 6449431df2
commit e1a9afe11c
4 changed files with 153 additions and 80 deletions

View File

@ -1,22 +1,36 @@
import * as utils from './utils';
export async function getToolSemver(
data: Record<string, string>
): Promise<string> {
const api_url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${data['version_prefix']}${data['version']}`;
return JSON.parse(await utils.fetch(api_url))
.pop()
['ref'].split('/')
.pop();
}
/**
* Function to get tool version
*
* @param tool
* @param version
* @param data
*/
export async function getToolVersion(
tool: string,
version: string
data: Record<string, string>
): Promise<string> {
// semver_regex - https://semver.org/
const semver_regex =
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
const composer_regex = /^stable$|^preview$|^snapshot$|^v?[1|2]$/;
version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1');
const major_minor_regex = /^v?\d+(\.\d+)?$/;
const version = data['version']
.replace(/[><=^]*/, '')
.replace(/^v(\d)/, '$1');
switch (true) {
case composer_regex.test(version):
case data['tool'] === 'composer' && composer_regex.test(version):
return version;
case data['repository'] && major_minor_regex.test(version):
return await getToolSemver(data);
case semver_regex.test(version):
return version;
default:
@ -33,7 +47,7 @@ export async function getToolVersion(
export async function parseRelease(
release: string,
data: Record<string, string>
): Promise<{version: string; release: string}> {
): Promise<Record<string, string>> {
const parts: string[] = release.split(':');
const tool: string = parts[0];
const version: string | undefined = parts[1];
@ -45,21 +59,20 @@ export async function parseRelease(
: data['tool'];
switch (true) {
case version === undefined:
return {
release: release,
version: 'latest'
};
data['release'] = release;
data['version'] = 'latest';
break;
case /^[\w.-]+\/[\w.-]+$/.test(tool):
return {
release: release,
version: version
};
data['release'] = release;
data['version'] = version;
break;
default:
return {
release: release,
version: await getToolVersion(parts[0], parts[1])
};
data['release'] = release;
data['version'] = version;
data['version'] = await getToolVersion(data);
break;
}
return data;
}
/**
@ -410,12 +423,7 @@ export async function initToolData(
php_version: string,
os_version: string
): Promise<Record<string, string>> {
const release_data: {release: string; version: string} = await parseRelease(
release,
data
);
data['version'] = release_data.version;
data['release'] = release_data.release;
data = await parseRelease(release, data);
data['version_parameter'] = JSON.stringify(data['version_parameter']);
data['os_version'] = os_version;
data['php_version'] = php_version;

View File

@ -2,6 +2,7 @@ import {IncomingMessage} from 'http';
import * as fs from 'fs';
import * as https from 'https';
import * as path from 'path';
import * as url from 'url';
import * as core from '@actions/core';
/**
@ -46,11 +47,17 @@ export async function getInput(
/**
* Function to fetch an URL
*
* @param url
* @param input_url
*/
export async function fetch(url: string): Promise<string> {
export async function fetch(input_url: string): Promise<string> {
const fetch_promise: Promise<string> = new Promise(resolve => {
const req = https.get(url, (res: IncomingMessage) => {
const url_object: url.UrlObject = new url.URL(input_url);
const options: https.RequestOptions = {
hostname: url_object.hostname,
path: url_object.pathname,
headers: {'User-Agent': 'setup-php'}
};
const req = https.get(options, (res: IncomingMessage) => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => (body += chunk));