diff --git a/app/graphql/resolvers/merge_requests_resolver.rb b/app/graphql/resolvers/merge_requests_resolver.rb
index 4761be1cf92f31b10d0310b7e8c29224001f1b3d..ebbb68611b3d0b609fc996b495208c69e214ce86 100644
--- a/app/graphql/resolvers/merge_requests_resolver.rb
+++ b/app/graphql/resolvers/merge_requests_resolver.rb
@@ -176,6 +176,13 @@ def self.accept_reviewer
argument :reviewer_username, GraphQL::Types::String,
required: false,
description: 'Username of the reviewer to exclude.'
+ argument :source_branches, [GraphQL::Types::String],
+ required: false,
+ as: :source_branch,
+ description: <<~DESC
+ Array of source branch names.
+ No resolved merge requests will have one of these branches as their source.
+ DESC
end
validates mutually_exclusive: [:assignee_username, :assignee_wildcard_id]
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 94e1306c5de7eca1c8305f1aa7d24b7789518240..32adfbd7065cc06d31a29c3a33239d4e8165b763 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -42906,6 +42906,7 @@ Defines which user roles, users, or groups can merge into a protected branch.
| `myReactionEmoji` | [`String`](#string) | Filter by reaction emoji to exclude. |
| `releaseTag` | [`String`](#string) | Filter by release tag to exclude. |
| `reviewerUsername` | [`String`](#string) | Username of the reviewer to exclude. |
+| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. No resolved merge requests will have one of these branches as their source. |
### `MonthSelectionInput`
diff --git a/spec/graphql/resolvers/merge_requests_resolver_spec.rb b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
index b586e8c4f5b97e155ed2d6f78a85061fe66516f3..15f3ca47becd579d307825e3c38cb7b3ea5cf719 100644
--- a/spec/graphql/resolvers/merge_requests_resolver_spec.rb
+++ b/spec/graphql/resolvers/merge_requests_resolver_spec.rb
@@ -149,6 +149,16 @@
end
end
+ context 'with negated source branches argument' do
+ it 'excludes merge requests with given source branches from selection' do
+ mrs = [merge_request_3, merge_request_4]
+ branches = mrs.map(&:source_branch)
+ result = resolve_mr(project, not: { source_branches: branches })
+
+ expect(result).not_to include(merge_request_3, merge_request_4)
+ end
+ end
+
context 'with target branches argument' do
it 'takes one argument' do
result = resolve_mr(project, target_branches: [merge_request_3.target_branch])