diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index a0f00ddc3c6665438c4fbac2bb089663e0a059d3..8ad313758e54cf4977e10345f01573b2a34f21f3 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -96,7 +96,7 @@ class MergeRequestType < BaseObject description: 'Rebase commit SHA of the merge request.' field :rebase_in_progress, GraphQL::Types::Boolean, method: :rebase_in_progress?, null: false, calls_gitaly: true, description: 'Indicates if there is a rebase currently in progress for the merge request.' - field :default_merge_commit_message, GraphQL::Types::String, null: true, + field :default_merge_commit_message, GraphQL::Types::String, null: true, calls_gitaly: true, description: 'Default merge commit message of the merge request.' field :default_merge_commit_message_with_description, GraphQL::Types::String, null: true, description: 'Default merge commit message of the merge request with description. Will have the same value as `defaultMergeCommitMessage` when project has `mergeCommitTemplate` set.', diff --git a/doc/user/project/merge_requests/commit_templates.md b/doc/user/project/merge_requests/commit_templates.md index abe17f032887dbeb0bf625b900872a692d074765..bffb66755e01ca3fd525d88843e9e3974b273cfb 100644 --- a/doc/user/project/merge_requests/commit_templates.md +++ b/doc/user/project/merge_requests/commit_templates.md @@ -65,6 +65,9 @@ GitLab creates a squash commit message with this template: ## Supported variables in commit templates +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20263) in GitLab 14.5. +> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/346805) `first_commit` and `first_multiline_commit` variables in GitLab 14.6. + Commit message templates support these variables: | Variable | Description | Output example | @@ -73,8 +76,10 @@ Commit message templates support these variables: | `%{target_branch}` | The name of the branch that the changes are applied to. | `main` | | `%{title}` | Title of the merge request. | `Fix tests and translations` | | `%{issues}` | String with phrase `Closes `. Contains all issues mentioned in the merge request description that match [issue closing patterns](../issues/managing_issues.md#closing-issues-automatically). Empty if no issues are mentioned. | `Closes #465, #190 and #400` | -| `%{description}` | Description of the merge request. | `Merge request description.
Can be multiline.` | +| `%{description}` | Description of the merge request. | `Merge request description.`
`Can be multiline.` | | `%{reference}` | Reference to the merge request. | `group-name/project-name!72359` | +| `%{first_commit}` | Full message of the first commit in merge request diff. | `Update README.md` | +| `%{first_multiline_commit}` | Full message of the first commit that's not a merge commit and has more than one line in message body. Merge Request title if all commits aren't multiline. | `Update README.md`

`Improved project description in readme file.` | Empty variables that are the only word in a line are removed, along with all newline characters preceding it. diff --git a/lib/gitlab/merge_requests/commit_message_generator.rb b/lib/gitlab/merge_requests/commit_message_generator.rb index c420385b7c1ba23270754e5d9667e035cca57696..0e9ec6f5cb34fc4cda8e447876b9a9028027d268 100644 --- a/lib/gitlab/merge_requests/commit_message_generator.rb +++ b/lib/gitlab/merge_requests/commit_message_generator.rb @@ -35,7 +35,9 @@ def squash_message "Closes #{closes_issues_references.to_sentence}" end, 'description' => ->(merge_request) { merge_request.description.presence || '' }, - 'reference' => ->(merge_request) { merge_request.to_reference(full: true) } + 'reference' => ->(merge_request) { merge_request.to_reference(full: true) }, + 'first_commit' => -> (merge_request) { merge_request.first_commit&.safe_message&.strip.presence || '' }, + 'first_multiline_commit' => -> (merge_request) { merge_request.first_multiline_commit&.safe_message&.strip.presence || merge_request.title } }.freeze PLACEHOLDERS_REGEX = Regexp.union(PLACEHOLDERS.keys.map do |key| diff --git a/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb b/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb index 4de5c9b9c82ae09140d3973fedb3f15dbac1f17b..65c76aac10c628f42f36400a81684d75bad493c6 100644 --- a/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb +++ b/spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb @@ -16,6 +16,7 @@ end let(:user) { project.creator } + let(:source_branch) { 'feature' } let(:merge_request_description) { "Merge Request Description\nNext line" } let(:merge_request_title) { 'Bugfix' } let(:merge_request) do @@ -24,6 +25,8 @@ :simple, source_project: project, target_project: project, + target_branch: 'master', + source_branch: source_branch, author: user, description: merge_request_description, title: merge_request_title @@ -226,6 +229,50 @@ MSG end end + + context 'when project has merge commit template with first_commit' do + let(message_template_name) { <<~MSG.rstrip } + Message: %{first_commit} + MSG + + it 'uses first commit' do + expect(result_message).to eq <<~MSG.rstrip + Message: Feature added + + Signed-off-by: Dmitriy Zaporozhets + MSG + end + + context 'when branch has no unmerged commits' do + let(:source_branch) { 'v1.1.0' } + + it 'is an empty string' do + expect(result_message).to eq 'Message: ' + end + end + end + + context 'when project has merge commit template with first_multiline_commit' do + let(message_template_name) { <<~MSG.rstrip } + Message: %{first_multiline_commit} + MSG + + it 'uses first multiline commit' do + expect(result_message).to eq <<~MSG.rstrip + Message: Feature added + + Signed-off-by: Dmitriy Zaporozhets + MSG + end + + context 'when branch has no multiline commits' do + let(:source_branch) { 'spooky-stuff' } + + it 'is mr title' do + expect(result_message).to eq 'Message: Bugfix' + end + end + end end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 102800bcca28a485d8cef1b2e085c499ed4697a2..0ab8ecb4c444024b327ad270f86c21a29506b534 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1648,6 +1648,9 @@ def set_compare(merge_request) it 'uses template from target project' do request = build(:merge_request, title: 'Fix everything') + request.compare_commits = [ + double(safe_message: 'Commit message', gitaly_commit?: true, merge_commit?: false, description?: false) + ] subject.target_project.merge_commit_template = '%{title}' expect(request.default_merge_commit_message)