Skip to content

Commit

Permalink
Merge pull request #1100 from delboy1978uk/feature/skip-merge-commit-…
Browse files Browse the repository at this point in the history
…checks

skip additional checks if a merge commit
  • Loading branch information
veewee authored Jul 20, 2023
2 parents d0e23de + 30e5e2c commit bbb82b4
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 7 deletions.
8 changes: 8 additions & 0 deletions doc/tasks/git_commit_message.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ grumphp:
enforce_no_subject_trailing_period: true
enforce_single_lined_subject: true
type_scope_conventions: []
skip_on_merge_commit: true
max_body_width: 72
max_subject_width: 60
matchers:
Expand Down Expand Up @@ -90,6 +91,13 @@ Mark the matchers as case-sensitive.
Mark the matchers as multiline.
**skip_on_merge_commit**
*Default:true*
Skips checking the commit message when the commit is a merge.
**additional_modifiers**
*Default: ''*
Expand Down
23 changes: 17 additions & 6 deletions src/Task/Git/CommitMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

class CommitMessage implements TaskInterface
{
const MERGE_COMMIT_REGEX =
'(Merge branch|tag \'.+\'(?:\s.+)?|Merge remote-tracking branch \'.+\'|Merge pull request #\d+\s.+)';

/**
* @var TaskConfigInterface
*/
Expand All @@ -44,6 +47,7 @@ public static function getConfigurableOptions(): ConfigOptionsResolver
'case_insensitive' => true,
'multiline' => true,
'type_scope_conventions' => [],
'skip_on_merge_commit' => true,
'matchers' => [],
'additional_modifiers' => '',
]);
Expand All @@ -57,6 +61,7 @@ public static function getConfigurableOptions(): ConfigOptionsResolver
$resolver->addAllowedTypes('max_body_width', ['int']);
$resolver->addAllowedTypes('max_subject_width', ['int']);
$resolver->addAllowedTypes('case_insensitive', ['bool']);
$resolver->addAllowedTypes('skip_on_merge_commit', ['bool']);
$resolver->addAllowedTypes('multiline', ['bool']);
$resolver->addAllowedTypes('matchers', ['array']);
$resolver->addAllowedTypes('additional_modifiers', ['string']);
Expand Down Expand Up @@ -95,6 +100,11 @@ public function run(ContextInterface $context): TaskResultInterface
$config = $this->getConfig()->getOptions();
$commitMessage = $context->getCommitMessage();
$exceptions = [];
$isMergeCommit = $this->isMergeCommit($commitMessage);

if ($isMergeCommit && $config['skip_on_merge_commit']) {
return TaskResult::createSkipped($this, $context);
}

if (!(bool) $config['allow_empty_message'] && '' === trim($commitMessage)) {
return TaskResult::createFailed(
Expand Down Expand Up @@ -136,8 +146,7 @@ public function run(ContextInterface $context): TaskResultInterface
);
}


if ($this->enforceTypeScopeConventions()) {
if (!$isMergeCommit && $this->enforceTypeScopeConventions()) {
try {
$this->checkTypeScopeConventions($context);
} catch (RuntimeException $e) {
Expand Down Expand Up @@ -363,9 +372,6 @@ private function checkTypeScopeConventions(GitCommitMsgContext $context): void
? $config['type_scope_conventions']['subject_pattern']
: '([a-zA-Z0-9-_ #@\'\/\\"]+)';

$mergePattern =
'(Merge branch|tag \'.+\'(?:\s.+)?|Merge remote-tracking branch \'.+\'|Merge pull request #\d+\s.+)';

if (count($types) > 0) {
$types = implode('|', $types);
$typesPattern = '(' . $types . ')';
Expand All @@ -376,14 +382,19 @@ private function checkTypeScopeConventions(GitCommitMsgContext $context): void
$scopesPattern = '(:\s|(\((?:' . $scopes . ')\)?:\s))';
}

$rule = '/^' . $specialPrefix . $typesPattern . $scopesPattern . $subjectPattern . '|' . $mergePattern . '/';
$rule = '/^' . $specialPrefix . $typesPattern . $scopesPattern . $subjectPattern . '/';
try {
$this->runMatcher($config, $subjectLine, $rule, 'Invalid Type/Scope Format');
} catch (RuntimeException $e) {
throw $e;
}
}

private function isMergeCommit(string $commitMessage): bool
{
return (bool) \preg_match(self::MERGE_COMMIT_REGEX, $commitMessage);
}

/**
* Gets a clean subject line from the commit message
*
Expand Down
24 changes: 23 additions & 1 deletion test/Unit/Task/Git/CommitMessageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public function provideConfigurableOptions(): iterable
'case_insensitive' => true,
'multiline' => true,
'type_scope_conventions' => [],
'skip_on_merge_commit' => true,
'matchers' => [],
'additional_modifiers' => '',
]
Expand Down Expand Up @@ -670,6 +671,7 @@ function () {
yield 'skip_type_scope_conventions_on_merge' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand All @@ -683,6 +685,7 @@ function () {
yield 'skip_type_scope_conventions_on_merge_branch_gitflow' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand All @@ -696,6 +699,7 @@ function () {
yield 'skip_type_scope_conventions_on_merge_tag_gitflow' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand All @@ -709,6 +713,7 @@ function () {
yield 'skip_type_scope_conventions_on_merge_remote' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand All @@ -722,6 +727,7 @@ function () {
yield 'skip_type_scope_conventions_on_merge_PR' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand All @@ -735,6 +741,7 @@ function () {
yield 'fixup_skip_type_scope_conventions_on_merge' => [
[
'enforce_capitalized_subject' => false,
'skip_on_merge_commit' => false,
'type_scope_conventions' => [
'types' => [
'fix'
Expand Down Expand Up @@ -827,11 +834,26 @@ function () {
function () {
},
];
yield 'dont_skip_on_merge_commit' => [
[
'skip_on_merge_commit' => false,
],
$this->mockCommitMsgContext($this->fixup('Merge branch \'x\' into')),
function () {
},
];
}

public function provideSkipsOnStuff(): iterable
{
return [];
yield 'skip_on_merge_commit' => [
[
'skip_on_merge_commit' => true,
],
$this->mockCommitMsgContext($this->fixup('Merge branch \'x\' into')),
function () {
},
];
}

private function mockCommitMsgContext(string $message): ContextInterface
Expand Down

0 comments on commit bbb82b4

Please sign in to comment.