blob: 8726e131f22474b2dda1c4791f30959c5d8086e8 [file] [log] [blame] [edit]
// 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'])
library;
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 (final 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
''';
}