Compare commits

...

30 Commits

Author SHA1 Message Date
Alif Rachmawadi
40bc2f6940 bump version
Some checks failed
Main workflow / Run (ubuntu-latest) (push) Failing after 39m38s
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-05-09 11:03:06 +07:00
Alif Rachmawadi
f0d790518f update dist 2020-05-09 10:37:01 +07:00
Alif Rachmawadi
c4a41752bd update dependencies 2020-05-09 10:36:22 +07:00
Alif Rachmawadi
929035d687 update test 2020-05-09 10:17:16 +07:00
Alif Rachmawadi
4bb529986f use channel for latest release 2020-05-09 09:46:10 +07:00
Alif Rachmawadi
ecb8eabe6f update tests 2020-05-09 09:43:40 +07:00
Alif Rachmawadi
cf426f9aa2 update release manifest 2020-05-09 09:43:05 +07:00
Alif Rachmawadi
794e42ad48 bump version: 1.3.1
Some checks failed
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (ubuntu-latest) (push) Failing after 19m55s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-04-30 09:48:20 +07:00
Alif Rachmawadi
2dd537cc3f update dist 2020-04-30 09:47:38 +07:00
Alif Rachmawadi
3ba093556e Merge pull request #36 from subosito/dependabot/npm_and_yarn/actions/http-client-1.0.8
Bump @actions/http-client from 1.0.7 to 1.0.8
2020-04-30 09:45:20 +07:00
dependabot[bot]
9cde868c41 Bump @actions/http-client from 1.0.7 to 1.0.8
Bumps [@actions/http-client](https://github.com/actions/http-client) from 1.0.7 to 1.0.8.
- [Release notes](https://github.com/actions/http-client/releases)
- [Changelog](https://github.com/actions/http-client/blob/master/RELEASES.md)
- [Commits](https://github.com/actions/http-client/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-29 18:01:31 +00:00
Alif Rachmawadi
c1bf65eb31 add dart usage example
Some checks failed
Main workflow / Run (macos-latest) (push) Failing after 3s
Main workflow / Run (ubuntu-latest) (push) Failing after 33s
Main workflow / Run (windows-latest) (push) Has been cancelled
2020-04-14 02:34:44 +00:00
Alif Rachmawadi
cfb544479d use previous prettier 2020-04-14 02:31:17 +00:00
Alif Rachmawadi
c256877acc bump version 2020-04-14 02:20:56 +00:00
Alif Rachmawadi
5c02dc7f05 update dist 2020-04-14 02:19:57 +00:00
Alif Rachmawadi
4d34db08ae update dependencies 2020-04-14 02:19:33 +00:00
Alif Rachmawadi
b4d02d2183 update test duration 2020-04-14 02:05:13 +00:00
Alif Rachmawadi
713f696c59 update test 2020-04-14 01:47:20 +00:00
Alif Rachmawadi
c8f591812e update dist 2020-04-14 01:17:42 +00:00
Alif Rachmawadi
f7a5d4550a handle new release format 2020-04-14 01:14:56 +00:00
Alif Rachmawadi
19074769c8 add test for new release format 2020-04-14 01:14:55 +00:00
Alif Rachmawadi
1b5073106b update releases data 2020-04-14 01:14:55 +00:00
Alif Rachmawadi
a8119581ff npm audit fix 2020-04-14 01:14:54 +00:00
Alif Rachmawadi
0ee5f96289 Merge pull request #33 from tianhaoz95/patch-2
might be interesting to add dart SDK to path
2020-04-14 07:57:34 +07:00
Tianhao Zhou
9d3762c82e fix: use join to comply with other os 2020-04-13 14:41:49 -07:00
Tianhao Zhou
6ebddd1b83 fix: add the missing bin directory in dart sdk 2020-04-11 18:23:34 -07:00
Tianhao Zhou
a79364fc11 dev: add dart sdk to path
Adding Flutter bin to the path doesn't expose the dart SDK which many people might be interested in using. For example, dartdoc for documentation generation.
2020-04-11 18:10:01 -07:00
Alif Rachmawadi
f4209dc839 force minimist resolution 2020-03-17 09:38:25 +07:00
Alif Rachmawadi
cf2fb6cf42 update depedencies 2020-03-17 09:06:14 +07:00
Alif Rachmawadi
8828996b00 fix acorn vulnerabilities 2020-03-17 09:00:22 +07:00
9 changed files with 6515 additions and 1463 deletions

View File

@@ -70,6 +70,8 @@ jobs:
with:
flutter-version: '1.11.0'
channel: 'beta'
- run: dart --version
- run: flutter --version
- run: flutter pub get
- run: flutter test
- run: flutter build apk

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -27,15 +27,11 @@ describe('installer tests', () => {
beforeAll(async () => {
await io.rmRF(toolDir);
await io.rmRF(tempDir);
}, 300000);
}, 100000);
afterAll(async () => {
try {
await io.rmRF(toolDir);
await io.rmRF(tempDir);
} catch {
console.log('Failed to remove test directories');
}
afterEach(async () => {
await io.rmRF(toolDir);
await io.rmRF(tempDir);
}, 100000);
it('Downloads flutter', async () => {
@@ -44,15 +40,15 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000);
}, 300000);
it('Downloads flutter from beta channel', async () => {
await installer.getFlutter('1.8.3', 'beta');
const sdkDir = path.join(toolDir, 'flutter', '1.8.3-beta', 'x64');
it('Downloads flutter from dev channel', async () => {
await installer.getFlutter('1.17.0-dev.5.0', 'dev');
const sdkDir = path.join(toolDir, 'flutter', '1.17.0-dev.5.0-dev', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000);
}, 300000);
describe('get the latest release of a flutter version', () => {
beforeEach(() => {
@@ -69,16 +65,24 @@ describe('installer tests', () => {
it('Downloads latest flutter release from stable channel', async () => {
await installer.getFlutter('', 'stable');
const sdkDir = path.join(toolDir, 'flutter', '1.17.0-stable', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 300000);
it('Downloads latest flutter release from beta channel (using new release format)', async () => {
await installer.getFlutter('', 'beta');
const sdkDir = path.join(
toolDir,
'flutter',
'1.7.8-hotfix.4-stable',
'1.17.0-3.4.pre-beta',
'x64'
);
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
}, 300000);
it('Downloads latest flutter release of 1.7 when using version 1.7 from dev channel', async () => {
await installer.getFlutter('1.7', 'dev');
@@ -86,7 +90,7 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
}, 300000);
it('Downloads latest flutter release of 1.7 when using version 1.7.x from dev channel', async () => {
await installer.getFlutter('1.7.x', 'dev');
@@ -94,7 +98,15 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 200000);
}, 300000);
it('Downloads latest flutter release of 1.17 when using version 1.17.x from dev channel (using new release format)', async () => {
await installer.getFlutter('1.17.x', 'dev');
const sdkDir = path.join(toolDir, 'flutter', '1.17.0-dev.5.0-dev', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 300000);
});
it('Throws if no location contains correct flutter version', async () => {

837
dist/index.js vendored

File diff suppressed because it is too large Load Diff

3665
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "flutter-action",
"version": "1.2.0",
"version": "1.3.2",
"private": true,
"description": "Flutter environment for use in actions",
"main": "lib/index.js",
@@ -25,27 +25,29 @@
"author": "Alif Rachmawadi <arch@subosito.com>",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.2.3",
"@actions/exec": "^1.0.3",
"@actions/http-client": "^1.0.6",
"@actions/core": "^1.2.4",
"@actions/exec": "^1.0.4",
"@actions/http-client": "^1.0.8",
"@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.3.1",
"semver": "^7.1.3",
"uuid": "^7.0.1"
"@actions/tool-cache": "^1.3.4",
"semver": "^7.3.2",
"uuid": "^7.0.3"
},
"devDependencies": {
"@types/jest": "^25.1.3",
"@types/nock": "^10.0.3",
"@types/node": "^12.12.29",
"@types/jest": "^25.2.1",
"@types/node": "^12.12.38",
"@types/semver": "^7.1.0",
"@types/uuid": "^7.0.0",
"@zeit/ncc": "^0.21.1",
"jest": "^25.1.0",
"jest-circus": "^25.1.0",
"nock": "^10.0.6",
"@types/uuid": "^7.0.3",
"@zeit/ncc": "^0.22.1",
"jest": "^25.5.4",
"jest-circus": "^25.5.4",
"nock": "^12.0.3",
"npm-run-all": "^4.1.5",
"prettier": "^1.19.1",
"ts-jest": "^25.2.1",
"ts-jest": "^25.5.0",
"typescript": "^3.8.3"
},
"resolutions": {
"minimist": "^1.2.2"
}
}

View File

@@ -34,15 +34,21 @@ export async function getFlutter(
version: string,
channel: string
): Promise<void> {
const versionPart = version.split('.');
const versionPart = version.split('.').filter(Boolean);
if (versionPart[1] == null || versionPart[2] == null) {
if (
versionPart.length > 0 &&
(versionPart[1] == null || versionPart[2] == null)
) {
version = version.concat('.x');
}
version = await determineVersion(version, channel);
const {version: selected, rawVersion, downloadUrl} = await determineVersion(
version,
channel
);
let cleanver = `${version.replace('+', '-')}-${channel}`;
let cleanver = `${selected.replace('+', '-')}-${channel}`;
let toolPath = tc.find('flutter', cleanver);
if (toolPath) {
@@ -50,8 +56,7 @@ export async function getFlutter(
} else {
core.debug('Downloading Flutter from Google storage');
const downloadInfo = getDownloadInfo(version, channel);
const sdkFile = await tc.downloadTool(downloadInfo.url);
const sdkFile = await tc.downloadTool(downloadUrl);
let tempDir: string = generateTempDir();
const sdkDir = await extractDownload(sdkFile, tempDir);
@@ -62,6 +67,7 @@ export async function getFlutter(
core.exportVariable('FLUTTER_HOME', toolPath);
core.addPath(path.join(toolPath, 'bin'));
core.addPath(path.join(toolPath, 'bin', 'cache', 'dart-sdk', 'bin'));
}
function osName(): string {
@@ -77,20 +83,6 @@ function extName(): string {
return 'zip';
}
function getDownloadInfo(
version: string,
channel: string
): {version: string; url: string} {
const os = osName();
const ext = extName();
const url = `${storageUrl}/${channel}/${os}/flutter_${os}_v${version}-${channel}.${ext}`;
return {
version,
url
};
}
function generateTempDir(): string {
return path.join(
tempDirectory,
@@ -137,12 +129,12 @@ async function extractFile(file: string, destDir: string): Promise<void> {
async function determineVersion(
version: string,
channel: string
): Promise<string> {
): Promise<{version: string; rawVersion: string; downloadUrl: string}> {
if (version.endsWith('.x') || version === '') {
return await getLatestVersion(version, channel);
}
return version;
return await getSelectedVersion(version, channel);
}
interface IFlutterChannel {
@@ -156,6 +148,7 @@ interface IFlutterRelease {
hash: string;
channel: string;
version: string;
archive: string;
}
interface IFlutterStorage {
@@ -163,10 +156,7 @@ interface IFlutterStorage {
releases: IFlutterRelease[];
}
async function getLatestVersion(
version: string,
channel: string
): Promise<string> {
async function getReleases(): Promise<IFlutterStorage> {
const releasesUrl: string = `${storageUrl}/releases_${osName()}.json`;
const http: httpm.HttpClient = new httpm.HttpClient('flutter-action');
const storage: IFlutterStorage | null = (
@@ -174,38 +164,106 @@ async function getLatestVersion(
).result;
if (!storage) {
throw new Error('unable to get latest version');
throw new Error('unable to get flutter releases');
}
return storage;
}
async function getSelectedVersion(
version: string,
channel: string
): Promise<{version: string; rawVersion: string; downloadUrl: string}> {
const storage = await getReleases();
const release = storage.releases.find(release => {
if (release.channel != channel) return false;
return compare(version, release.version);
});
if (!release) {
throw new Error(`invalid flutter version ${version}, channel ${channel}`);
}
return {
version,
rawVersion: release.version,
downloadUrl: `${storageUrl}/${release.archive}`
};
}
async function getLatestVersion(
version: string,
channel: string
): Promise<{version: string; rawVersion: string; downloadUrl: string}> {
const storage = await getReleases();
if (version.endsWith('.x')) {
const sver = version.slice(0, version.length - 2);
const releases = storage.releases.filter(
release =>
release.version.startsWith(`v${sver}`) && release.channel === channel
);
const versions = releases.map(release =>
release.version.slice(1, release.version.length)
);
const releases = storage.releases.filter(release => {
if (release.channel != channel) return false;
return prefixCompare(sver, release.version);
});
const versions = releases
.map(release => release.version)
.map(version =>
version.startsWith('v') ? version.slice(1, version.length) : version
);
const sortedVersions = versions.sort(semver.rcompare);
let cver = sortedVersions[0];
let release = releases.find(release => compare(cver, release.version));
if (!release) {
throw new Error(`unable to find release for ${cver}`);
}
core.debug(
`latest version of ${version} from channel ${channel} is ${sortedVersions[0]}`
`latest version of ${version} from channel ${channel} is ${release.version}`
);
return sortedVersions[0];
return {
version: cver,
rawVersion: release.version,
downloadUrl: `${storageUrl}/${release.archive}`
};
}
const channelVersion = storage.releases.find(
release => release.hash === storage.current_release[channel]
);
const channelVersion = storage.releases.find(release => {
return (
release.hash === storage.current_release[channel] &&
release.channel == channel
);
});
if (!channelVersion) {
throw new Error(`unable to get latest version from channel ${channel}`);
}
let cver = channelVersion.version;
cver = cver.slice(1, cver.length);
let rver = channelVersion.version;
let cver = rver.startsWith('v') ? rver.slice(1, rver.length) : rver;
core.debug(`latest version from channel ${channel} is ${cver}`);
return cver;
core.debug(`latest version from channel ${channel} is ${rver}`);
return {
version: cver,
rawVersion: rver,
downloadUrl: `${storageUrl}/${channelVersion.archive}`
};
}
function compare(version: string, releaseVersion: string): boolean {
if (releaseVersion.startsWith('v')) {
return releaseVersion === `v${version}`;
}
return releaseVersion === version;
}
function prefixCompare(version: string, releaseVersion: string): boolean {
if (releaseVersion.startsWith('v')) {
return releaseVersion.startsWith(`v${version}`);
}
return releaseVersion.startsWith(version);
}