Compare commits

...
30 Commits
Author SHA1 Message Date
Alif Rachmawadi 40bc2f6940 bump version 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 2020-04-30 09:48:20 +07:00
Alif Rachmawadi 2dd537cc3f update dist 2020-04-30 09:47:38 +07:00
Alif RachmawadiandGitHub 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]andGitHub 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 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 RachmawadiandGitHub 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 ZhouandGitHub 9d3762c82e fix: use join to comply with other os 2020-04-13 14:41:49 -07:00
Tianhao ZhouandGitHub 6ebddd1b83 fix: add the missing bin directory in dart sdk 2020-04-11 18:23:34 -07:00
Tianhao ZhouandGitHub 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
+2
View File
@@ -70,6 +70,8 @@ jobs:
with: with:
flutter-version: '1.11.0' flutter-version: '1.11.0'
channel: 'beta' channel: 'beta'
- run: dart --version
- run: flutter --version
- run: flutter pub get - run: flutter pub get
- run: flutter test - run: flutter test
- run: flutter build apk - 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
+29 -17
View File
@@ -27,15 +27,11 @@ describe('installer tests', () => {
beforeAll(async () => { beforeAll(async () => {
await io.rmRF(toolDir); await io.rmRF(toolDir);
await io.rmRF(tempDir); await io.rmRF(tempDir);
}, 300000); }, 100000);
afterAll(async () => { afterEach(async () => {
try { await io.rmRF(toolDir);
await io.rmRF(toolDir); await io.rmRF(tempDir);
await io.rmRF(tempDir);
} catch {
console.log('Failed to remove test directories');
}
}, 100000); }, 100000);
it('Downloads flutter', async () => { it('Downloads flutter', async () => {
@@ -44,15 +40,15 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true); expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true); expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000); }, 300000);
it('Downloads flutter from beta channel', async () => { it('Downloads flutter from dev channel', async () => {
await installer.getFlutter('1.8.3', 'beta'); await installer.getFlutter('1.17.0-dev.5.0', 'dev');
const sdkDir = path.join(toolDir, 'flutter', '1.8.3-beta', 'x64'); const sdkDir = path.join(toolDir, 'flutter', '1.17.0-dev.5.0-dev', 'x64');
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true); expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true); expect(fs.existsSync(path.join(sdkDir, 'bin'))).toBe(true);
}, 100000); }, 300000);
describe('get the latest release of a flutter version', () => { describe('get the latest release of a flutter version', () => {
beforeEach(() => { beforeEach(() => {
@@ -69,16 +65,24 @@ describe('installer tests', () => {
it('Downloads latest flutter release from stable channel', async () => { it('Downloads latest flutter release from stable channel', async () => {
await installer.getFlutter('', 'stable'); 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( const sdkDir = path.join(
toolDir, toolDir,
'flutter', 'flutter',
'1.7.8-hotfix.4-stable', '1.17.0-3.4.pre-beta',
'x64' 'x64'
); );
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true); expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).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 () => { it('Downloads latest flutter release of 1.7 when using version 1.7 from dev channel', async () => {
await installer.getFlutter('1.7', 'dev'); await installer.getFlutter('1.7', 'dev');
@@ -86,7 +90,7 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true); expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).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 () => { 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'); await installer.getFlutter('1.7.x', 'dev');
@@ -94,7 +98,15 @@ describe('installer tests', () => {
expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true); expect(fs.existsSync(`${sdkDir}.complete`)).toBe(true);
expect(fs.existsSync(path.join(sdkDir, 'bin'))).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 () => { it('Throws if no location contains correct flutter version', async () => {
+654 -183
View File
File diff suppressed because it is too large Load Diff
+2470 -1195
View File
File diff suppressed because it is too large Load Diff
+18 -16
View File
@@ -1,6 +1,6 @@
{ {
"name": "flutter-action", "name": "flutter-action",
"version": "1.2.0", "version": "1.3.2",
"private": true, "private": true,
"description": "Flutter environment for use in actions", "description": "Flutter environment for use in actions",
"main": "lib/index.js", "main": "lib/index.js",
@@ -25,27 +25,29 @@
"author": "Alif Rachmawadi <arch@subosito.com>", "author": "Alif Rachmawadi <arch@subosito.com>",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.2.3", "@actions/core": "^1.2.4",
"@actions/exec": "^1.0.3", "@actions/exec": "^1.0.4",
"@actions/http-client": "^1.0.6", "@actions/http-client": "^1.0.8",
"@actions/io": "^1.0.2", "@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.3.1", "@actions/tool-cache": "^1.3.4",
"semver": "^7.1.3", "semver": "^7.3.2",
"uuid": "^7.0.1" "uuid": "^7.0.3"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^25.1.3", "@types/jest": "^25.2.1",
"@types/nock": "^10.0.3", "@types/node": "^12.12.38",
"@types/node": "^12.12.29",
"@types/semver": "^7.1.0", "@types/semver": "^7.1.0",
"@types/uuid": "^7.0.0", "@types/uuid": "^7.0.3",
"@zeit/ncc": "^0.21.1", "@zeit/ncc": "^0.22.1",
"jest": "^25.1.0", "jest": "^25.5.4",
"jest-circus": "^25.1.0", "jest-circus": "^25.5.4",
"nock": "^10.0.6", "nock": "^12.0.3",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prettier": "^1.19.1", "prettier": "^1.19.1",
"ts-jest": "^25.2.1", "ts-jest": "^25.5.0",
"typescript": "^3.8.3" "typescript": "^3.8.3"
},
"resolutions": {
"minimist": "^1.2.2"
} }
} }
+101 -43
View File
@@ -34,15 +34,21 @@ export async function getFlutter(
version: string, version: string,
channel: string channel: string
): Promise<void> { ): 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 = 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); let toolPath = tc.find('flutter', cleanver);
if (toolPath) { if (toolPath) {
@@ -50,8 +56,7 @@ export async function getFlutter(
} else { } else {
core.debug('Downloading Flutter from Google storage'); core.debug('Downloading Flutter from Google storage');
const downloadInfo = getDownloadInfo(version, channel); const sdkFile = await tc.downloadTool(downloadUrl);
const sdkFile = await tc.downloadTool(downloadInfo.url);
let tempDir: string = generateTempDir(); let tempDir: string = generateTempDir();
const sdkDir = await extractDownload(sdkFile, tempDir); const sdkDir = await extractDownload(sdkFile, tempDir);
@@ -62,6 +67,7 @@ export async function getFlutter(
core.exportVariable('FLUTTER_HOME', toolPath); core.exportVariable('FLUTTER_HOME', toolPath);
core.addPath(path.join(toolPath, 'bin')); core.addPath(path.join(toolPath, 'bin'));
core.addPath(path.join(toolPath, 'bin', 'cache', 'dart-sdk', 'bin'));
} }
function osName(): string { function osName(): string {
@@ -77,20 +83,6 @@ function extName(): string {
return 'zip'; 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 { function generateTempDir(): string {
return path.join( return path.join(
tempDirectory, tempDirectory,
@@ -137,12 +129,12 @@ async function extractFile(file: string, destDir: string): Promise<void> {
async function determineVersion( async function determineVersion(
version: string, version: string,
channel: string channel: string
): Promise<string> { ): Promise<{version: string; rawVersion: string; downloadUrl: string}> {
if (version.endsWith('.x') || version === '') { if (version.endsWith('.x') || version === '') {
return await getLatestVersion(version, channel); return await getLatestVersion(version, channel);
} }
return version; return await getSelectedVersion(version, channel);
} }
interface IFlutterChannel { interface IFlutterChannel {
@@ -156,6 +148,7 @@ interface IFlutterRelease {
hash: string; hash: string;
channel: string; channel: string;
version: string; version: string;
archive: string;
} }
interface IFlutterStorage { interface IFlutterStorage {
@@ -163,10 +156,7 @@ interface IFlutterStorage {
releases: IFlutterRelease[]; releases: IFlutterRelease[];
} }
async function getLatestVersion( async function getReleases(): Promise<IFlutterStorage> {
version: string,
channel: string
): Promise<string> {
const releasesUrl: string = `${storageUrl}/releases_${osName()}.json`; const releasesUrl: string = `${storageUrl}/releases_${osName()}.json`;
const http: httpm.HttpClient = new httpm.HttpClient('flutter-action'); const http: httpm.HttpClient = new httpm.HttpClient('flutter-action');
const storage: IFlutterStorage | null = ( const storage: IFlutterStorage | null = (
@@ -174,38 +164,106 @@ async function getLatestVersion(
).result; ).result;
if (!storage) { 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')) { if (version.endsWith('.x')) {
const sver = version.slice(0, version.length - 2); const sver = version.slice(0, version.length - 2);
const releases = storage.releases.filter( const releases = storage.releases.filter(release => {
release => if (release.channel != channel) return false;
release.version.startsWith(`v${sver}`) && release.channel === channel return prefixCompare(sver, release.version);
); });
const versions = releases.map(release =>
release.version.slice(1, release.version.length) const versions = releases
); .map(release => release.version)
.map(version =>
version.startsWith('v') ? version.slice(1, version.length) : version
);
const sortedVersions = versions.sort(semver.rcompare); 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( 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( const channelVersion = storage.releases.find(release => {
release => release.hash === storage.current_release[channel] return (
); release.hash === storage.current_release[channel] &&
release.channel == channel
);
});
if (!channelVersion) { if (!channelVersion) {
throw new Error(`unable to get latest version from channel ${channel}`); throw new Error(`unable to get latest version from channel ${channel}`);
} }
let cver = channelVersion.version; let rver = channelVersion.version;
cver = cver.slice(1, cver.length); let cver = rver.startsWith('v') ? rver.slice(1, rver.length) : rver;
core.debug(`latest version from channel ${channel} is ${cver}`); core.debug(`latest version from channel ${channel} is ${rver}`);
return cver; 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);
} }