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