From 75a6fda09e2afdcea07d091e6cb48a2cbd2b7fac Mon Sep 17 00:00:00 2001 From: Gabriel Terwesten Date: Fri, 2 Sep 2022 14:35:33 +0200 Subject: [PATCH] refactor(melos): move over versioning logic from `conventional_commit` --- .../melos/lib/src/command_runner/version.dart | 1 - packages/melos/lib/src/commands/runner.dart | 2 +- packages/melos/lib/src/common/changelog.dart | 1 + .../src/common/pending_package_update.dart | 2 +- packages/melos/lib/src/common/versioning.dart | 44 +++++++++++++++ .../melos/test/common/versioning_test.dart | 56 +++++++++++++++++++ packages/melos/test/melos_test.dart | 1 - 7 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 packages/melos/test/common/versioning_test.dart diff --git a/packages/melos/lib/src/command_runner/version.dart b/packages/melos/lib/src/command_runner/version.dart index 0b24c15e..0b4ecf2f 100644 --- a/packages/melos/lib/src/command_runner/version.dart +++ b/packages/melos/lib/src/command_runner/version.dart @@ -19,7 +19,6 @@ import 'dart:io'; import 'package:ansi_styles/ansi_styles.dart'; import 'package:collection/collection.dart'; -import 'package:conventional_commit/conventional_commit.dart'; import 'package:glob/glob.dart'; import 'package:pub_semver/pub_semver.dart'; diff --git a/packages/melos/lib/src/commands/runner.dart b/packages/melos/lib/src/commands/runner.dart index d7f4688d..406a5368 100644 --- a/packages/melos/lib/src/commands/runner.dart +++ b/packages/melos/lib/src/commands/runner.dart @@ -6,7 +6,6 @@ import 'dart:math'; import 'package:ansi_styles/ansi_styles.dart'; import 'package:cli_util/cli_logging.dart'; import 'package:collection/collection.dart'; -import 'package:conventional_commit/conventional_commit.dart'; import 'package:file/local.dart'; import 'package:meta/meta.dart'; import 'package:mustache_template/mustache.dart'; @@ -30,6 +29,7 @@ import '../common/platform.dart'; import '../common/utils.dart'; import '../common/utils.dart' as utils; import '../common/versioning.dart' as versioning; +import '../common/versioning.dart'; import '../common/workspace_changelog.dart'; import '../global_options.dart'; import '../logging.dart'; diff --git a/packages/melos/lib/src/common/changelog.dart b/packages/melos/lib/src/common/changelog.dart index 46f20f9a..4286f69e 100644 --- a/packages/melos/lib/src/common/changelog.dart +++ b/packages/melos/lib/src/common/changelog.dart @@ -24,6 +24,7 @@ import 'git_commit.dart'; import 'git_repository.dart'; import 'io.dart'; import 'pending_package_update.dart'; +import 'versioning.dart'; class Changelog { Changelog(this.package, this.version, this.logger); diff --git a/packages/melos/lib/src/common/pending_package_update.dart b/packages/melos/lib/src/common/pending_package_update.dart index ea4eb39b..08cbfbd7 100644 --- a/packages/melos/lib/src/common/pending_package_update.dart +++ b/packages/melos/lib/src/common/pending_package_update.dart @@ -17,7 +17,6 @@ import 'dart:math' as math; -import 'package:conventional_commit/conventional_commit.dart'; import 'package:meta/meta.dart'; import 'package:pub_semver/pub_semver.dart'; @@ -27,6 +26,7 @@ import '../workspace.dart'; import 'changelog.dart'; import 'git_commit.dart'; import 'versioning.dart' as versioning; +import 'versioning.dart'; /// Enum representing why the version has been changed when running 'version' /// command. diff --git a/packages/melos/lib/src/common/versioning.dart b/packages/melos/lib/src/common/versioning.dart index 3d28176e..6027439b 100644 --- a/packages/melos/lib/src/common/versioning.dart +++ b/packages/melos/lib/src/common/versioning.dart @@ -18,6 +18,50 @@ import 'package:conventional_commit/conventional_commit.dart'; import 'package:pub_semver/pub_semver.dart'; +/// Indicates the semver release type this commit message creates. +enum SemverReleaseType { + /// A patch release indicates non-breaking changes (e.g. bug fixes). + patch, + + /// Indicates new API changes have been made (e.g. new features). + minor, + + /// A major release is when the breaking changes have been introduced. + major, +} + +extension ConventionalCommitVersioningExtension on ConventionalCommit { + /// Whether this commit should trigger a version bump in it's residing + /// package. + bool get isVersionableCommit { + if (isMergeCommit) return false; + return isBreakingChange || + [ + 'docs', + 'feat', + 'fix', + 'bug', + 'perf', + 'refactor', + 'revert', + ].contains(type); + } + + /// Returns the [SemverReleaseType] for this commit, e.g. + /// [SemverReleaseType.major]. + SemverReleaseType get semverReleaseType { + if (isBreakingChange) { + return SemverReleaseType.major; + } + + if (isFeature) { + return SemverReleaseType.minor; + } + + return SemverReleaseType.patch; + } +} + bool isValidVersion(String version) { try { Version.parse(version); diff --git a/packages/melos/test/common/versioning_test.dart b/packages/melos/test/common/versioning_test.dart new file mode 100644 index 00000000..9297bc0f --- /dev/null +++ b/packages/melos/test/common/versioning_test.dart @@ -0,0 +1,56 @@ +import 'package:conventional_commit/conventional_commit.dart'; +import 'package:melos/src/common/versioning.dart'; +import 'package:test/test.dart'; + +void main() { + test('isVersionableCommit', () { + expect( + ConventionalCommit.tryParse('chore!: foo bar')!.isVersionableCommit, + isTrue, + ); + expect( + ConventionalCommit.tryParse('docs: foo bar')!.isVersionableCommit, + isTrue, + ); + expect( + ConventionalCommit.tryParse('refactor(scope): foo bar')! + .isVersionableCommit, + isTrue, + ); + expect( + ConventionalCommit.tryParse('revert(scope,dope)!: foo bar')! + .isVersionableCommit, + isTrue, + ); + expect( + ConventionalCommit.tryParse('feat(*): foo bar')!.isVersionableCommit, + isTrue, + ); + expect( + ConventionalCommit.tryParse('ci(scope,dope): foo bar')! + .isVersionableCommit, + isFalse, + ); + }); + + test('semverReleaseType', () { + expect( + ConventionalCommit.tryParse('chore!: foo bar')!.semverReleaseType, + equals(SemverReleaseType.major), + ); + expect( + ConventionalCommit.tryParse('docs: foo bar')!.semverReleaseType, + equals(SemverReleaseType.patch), + ); + expect( + ConventionalCommit.tryParse('refactor(scope): foo bar')! + .semverReleaseType, + equals(SemverReleaseType.patch), + ); + expect( + ConventionalCommit.tryParse('feat(scope,dope): foo bar')! + .semverReleaseType, + equals(SemverReleaseType.minor), + ); + }); +} diff --git a/packages/melos/test/melos_test.dart b/packages/melos/test/melos_test.dart index e11ae729..d37798cf 100644 --- a/packages/melos/test/melos_test.dart +++ b/packages/melos/test/melos_test.dart @@ -15,7 +15,6 @@ * */ -import 'package:conventional_commit/conventional_commit.dart'; import 'package:melos/src/common/versioning.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:test/test.dart';