diff --git a/app/graphql/resolvers/related_mr_resolver.rb b/app/graphql/resolvers/related_mr_resolver.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9142d81e9e466f7661d4fbf8247a3e2fcdc61be6
--- /dev/null
+++ b/app/graphql/resolvers/related_mr_resolver.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Resolvers
+ # rubocop:disable Gitlab/BoundedContexts -- for poc
+ class RelatedMrResolver < BaseResolver
+ type ::Types::MergeRequestType.connection_type, null: true
+
+ argument :target_branch, GraphQL::Types::String,
+ required: true,
+ description: 'Name of branch which results are targeting.'
+
+ alias_method :blob, :object
+
+ def resolve(target_branch:)
+ MergeRequest.open_mrs_for_blob(blob.path, blob.project, target_branch)
+ end
+ end
+ # rubocop:enable Gitlab/BoundedContexts
+end
diff --git a/app/graphql/types/repository/blob_type.rb b/app/graphql/types/repository/blob_type.rb
index 300dab726d4962c2360beee42741cf71cac1b2f5..dac2afc18db155983a3a34b2663370239f1b8f27 100644
--- a/app/graphql/types/repository/blob_type.rb
+++ b/app/graphql/types/repository/blob_type.rb
@@ -148,6 +148,9 @@ class BlobType < BaseObject
field :project_blob_path_root, GraphQL::Types::String, null: true,
description: 'Web path for the root of the blob.'
+ field :open_mrs_for_blob, [Types::MergeRequestType], null: true,
+ description: 'Open merge requests for the blob.', resolver: Resolvers::RelatedMrResolver
+
def raw_text_blob
object.data unless object.binary?
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1c366c3b112b29b8afc81b32dc4051770202dc1b..860f2c656e555f95f542a844745753081d396399 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -480,6 +480,13 @@ def public_merge_status
.merge(ResourceStateEvent.merged_with_no_event_source)
}
+ scope :open_mrs_for_blob, ->(path, project, target_branch) do
+ MergeRequest.where(target_branch: target_branch, project: project, state_id: 1)
+ .joins("INNER JOIN merge_request_diffs ON merge_request_diffs.id = latest_merge_request_diff_id")
+ .joins(merge_request_diff: :merge_request_diff_files).where(merge_request_diff_files: { old_path: path })
+ .distinct.page(1).per(5)
+ end
+
def self.total_time_to_merge
join_metrics
.where(
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index e974a8d7ba8ee58595485759c164977b05f3f372..58f744a71f419c4af8e4c9ded67e55f1dd2e0795 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -30833,6 +30833,18 @@ Returns [`Blame`](#blame).
| `fromLine` | [`Int`](#int) | Range starting from the line. Cannot be less than 1 or greater than `to_line`. |
| `toLine` | [`Int`](#int) | Range ending on the line. Cannot be smaller than `from_line` or greater than `from_line` + 100. |
+##### `RepositoryBlob.openMrsForBlob`
+
+Open merge requests for the blob.
+
+Returns [`[MergeRequest!]`](#mergerequest).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| `targetBranch` | [`String!`](#string) | Name of branch which results are targeting. |
+
### `RepositoryCodeownerError`
#### Fields