Skip to content

Commit

Permalink
feat:
Browse files Browse the repository at this point in the history
1. Skip release when version exists.
2. Use pub version
  • Loading branch information
CaiJingLong committed Jun 6, 2023
1 parent 8fc7938 commit 27dc073
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 12 deletions.
11 changes: 8 additions & 3 deletions bin/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,17 @@ FutureOr<void> handlePackage(Pkg pkg) async {
pkgCommiter.commit();

await publishPkg(pkg, dryRun: true);
if (doPublish) {
await publishPkg(pkg, dryRun: false);
}

if (doRelease) {
pkgCommiter.push();
await pkgCommiter.release();
} else {
info('Because the input DO_RELEASE is false, skip release.');
}

if (doPublish) {
await publishPkg(pkg, dryRun: false);
} else {
info('Because the input DO_PUBLISH is false, skip publish.');
}
}
20 changes: 17 additions & 3 deletions lib/src/commiter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class PkgCommiter {
}
}

Future<void> commit() async {
void commit() {
setCommiter();
final cmd = 'git add . && git commit -m "$commitMsg"';
final result = execCmdResultSync(cmd);
Expand All @@ -92,7 +92,7 @@ class PkgCommiter {
}
}

Future<void> push() async {
void push() {
injectGh();

final result = execCmdResultSync('git push origin main');
Expand All @@ -106,12 +106,26 @@ class PkgCommiter {
final tagName = '${pkg.name}_v${pkg.version}';
final releaseName = '${pkg.name} ${pkg.version}';

// 1. Query release name exists in github
final haveRelease = await releaseExists(
owner: context.repo.owner,
repo: context.repo.repo,
releaseName: releaseName,
);

if (haveRelease) {
info('Release $releaseName exists, skip release.');
return;
}

// 2. Create github release

final body = '''
## What's new
$currentVersionChangeLog
''';

final result = await releasePkg(
final result = await createRelease(
owner: context.repo.owner,
repo: context.repo.repo,
tag: tagName,
Expand Down
17 changes: 15 additions & 2 deletions lib/src/github.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@ Future<bool> checkUserPermission({
}
}

Future<Release> releasePkg({
Future<Release> createRelease({
required String owner,
required String repo,
required String tag,
required String name,
required String body,
}) {
final createRelease = CreateRelease.from(
tagName: tag,
name: name,
tagName: tag,
targetCommitish: 'main',
isDraft: false,
isPrerelease: false,
Expand All @@ -52,3 +52,16 @@ Future<Release> releasePkg({
createRelease,
);
}

Future<bool> releaseExists({
required String owner,
required String repo,
required String releaseName,
}) {
return github.repositories
.listReleases(RepositorySlug(owner, repo))
.toList()
.then((releases) {
return releases.any((release) => release.name == releaseName);
});
}
14 changes: 10 additions & 4 deletions lib/src/pkg.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:io';
import 'package:pub_semver/pub_semver.dart';
import 'package:yaml/yaml.dart' as yaml;

import 'package:github_action_core/github_action_core.dart';
Expand Down Expand Up @@ -48,7 +49,7 @@ class Pkg {
throw ArgumentError.value(text, 'text', 'Invalid format.');
}
final name = parts[0].trim();
final version = parts[1].trim();
var version = parts[1].trim();

if (name.trim().isEmpty) {
throw ArgumentError.value(text, 'text', 'The name is empty.');
Expand All @@ -58,9 +59,14 @@ class Pkg {
throw ArgumentError.value(text, 'text', 'The version is empty.');
}

// Version is a x.y.z or vx.y.z
final versionRegex = RegExp(r'^v?\d+\.\d+\.\d+$');
if (!versionRegex.hasMatch(version)) {
try {
if (version.startsWith('v')) {
version = version.substring(1);
Version.parse(version);
} else {
Version.parse(version);
}
} on FormatException {
throw ArgumentError.value(text, 'text', 'The version is invalid.');
}

Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ dependencies:
github_action_context: ^0.2.1
github_action_core: ^0.2.0
http: ^0.13.6
pub_semver: ^2.1.4
yaml: ^3.1.2

dev_dependencies:
Expand Down
8 changes: 8 additions & 0 deletions test/dart_action_template_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ void main() {
convertPkgList('dio: v1.0.0 \ncookie_manager : v1.0.0').length,
2,
);

// Test other version
expect(convertPkgList('dio: 1.0.0+1').length, 1);
expect(convertPkgList('dio: 1.0').length, 0);
expect(convertPkgList('dio: 1.3.0+build.1').length, 1);
expect(convertPkgList('dio: 1.3.0+1').length, 1);
expect(convertPkgList('dio: 1.3.0-dev.1').length, 1);
expect(convertPkgList('dio: 1.3.0+dev.1').length, 1);
});

group('Test permission:', () {
Expand Down
30 changes: 30 additions & 0 deletions test/github_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import 'dart:io';

import 'package:action_dio_release/action_dio_release.dart';
import 'package:github/github.dart';
import 'package:test/test.dart';

void main() {
github = GitHub(
auth: Authentication.withToken(Platform.environment['GITHUB_TOKEN']!),
);

test('releaseExists', () async {
const owner = 'fluttercandies';
const repo = 'flutter_photo_manager';
expect(
await releaseExists(owner: owner, repo: repo, releaseName: '2.6.0'),
isTrue,
);

expect(
await releaseExists(owner: owner, repo: repo, releaseName: '0.1.1'),
isTrue,
);

expect(
await releaseExists(owner: owner, repo: repo, releaseName: '0.0.0'),
isFalse,
);
});
}
39 changes: 39 additions & 0 deletions test/version_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'package:pub_semver/pub_semver.dart';
import 'package:test/expect.dart';
import 'package:test/scaffolding.dart';

void main() {
const versionList = <String>[
'1.0.0',
'2.0.0',
'0.0.1-build',
'0.0.2+1',
'0.0.2-build.1',
'0.0.2-dev.2',
'0.0.2-nullsafety',
];

const unvalidVersionList = <String>[
'1.0',
'3',
'1.0.3.0',
'v3.0.0',
];

group('Test support versions', () {
for (final version in versionList) {
test('Test version $version', () {
final v = Version.parse(version);
print(v);
});
}
});

group('Test unvalid versions', () {
for (final version in unvalidVersionList) {
test('Test version $version', () {
expect(() => Version.parse(version), throwsA(isA<FormatException>()));
});
}
});
}

0 comments on commit 27dc073

Please sign in to comment.