| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| @TestOn('vm') |
| @Tags(['release']) |
| import 'dart:io'; |
| |
| import 'package:path/path.dart' as p; |
| import 'package:pub_semver/pub_semver.dart'; |
| import 'package:pubspec_parse/pubspec_parse.dart'; |
| import 'package:test/test.dart'; |
| import 'package:test_common/utilities.dart'; |
| |
| void main() { |
| for (var package in ['dwds', 'webdev']) { |
| test('$package is following proper release procedure', () async { |
| final pubspecPath = |
| absolutePath(pathFromWebdev: p.join(package, 'pubspec.yaml')); |
| final pubspec = Pubspec.parse(File(pubspecPath).readAsStringSync()); |
| final version = pubspec.version!; |
| final isWip = version.toString().contains('wip'); |
| if (!isWip) { |
| final wasReleased = |
| await _versionWasReleased(package, version: version); |
| expect(wasReleased, isTrue, |
| reason: _versionNotReleasedReason(package, version: version)); |
| } |
| expect(isWip, isTrue, |
| reason: _noWipVersionReason(package, version: version)); |
| }); |
| } |
| } |
| |
| String _releaseTagName(String package, {required Version version}) => |
| '$package-v$version'; |
| |
| Future<bool> _versionWasReleased(String package, |
| {required Version version}) async { |
| final releaseTagName = _releaseTagName(package, version: version); |
| final gitProcess = await Process.run( |
| 'git', |
| ['tag', '-l', '|', 'grep', releaseTagName], |
| ); |
| final stdout = gitProcess.stdout as String; |
| return stdout.contains(releaseTagName); |
| } |
| |
| String _versionNotReleasedReason(String package, {required Version version}) { |
| final releaseTagName = _releaseTagName(package, version: version); |
| return ''' |
| NOTE: If this PR is to prepare a release, please add the "prepare-release" |
| label to skip this test. |
| |
| The current $package version has not been released. Please create a new |
| release with name $releaseTagName. |
| '''; |
| } |
| |
| String _noWipVersionReason(String package, {required Version? version}) { |
| final nextPatch = version?.nextPatch; |
| final nextWipVersion = nextPatch != null ? '$nextPatch-wip' : '[wip version]'; |
| return ''' |
| NOTE: If this PR is to prepare a release, please add the "prepare-release" |
| label to skip this test. |
| |
| $package uses a wip version for development. Current version is $version. |
| If $package was just published, please open a new PR to reset it with: |
| dart run release.dart --reset -p $package -v $nextWipVersion |
| '''; |
| } |