BigW Consortium Gitlab

pull_request.rb 1.91 KB
Newer Older
1 2
module Github
  module Representation
3
    class PullRequest < Representation::Issuable
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
      attr_reader :project

      delegate :user, :repo, :ref, :sha, to: :source_branch, prefix: true
      delegate :user, :exists?, :repo, :ref, :sha, :short_sha, to: :target_branch, prefix: true

      def source_project
        project
      end

      def source_branch_exists?
        !cross_project? && source_branch.exists?
      end

      def source_branch_name
        @source_branch_name ||=
          if cross_project? || !source_branch_exists?
            source_branch_name_prefixed
          else
            source_branch_ref
          end
      end

      def target_project
        project
      end

      def target_branch_name
        @target_branch_name ||= target_branch_exists? ? target_branch_ref : target_branch_name_prefixed
      end

      def state
        return 'merged' if raw['state'] == 'closed' && raw['merged_at'].present?
        return 'closed' if raw['state'] == 'closed'

        'opened'
      end

      def opened?
        state == 'opened'
      end

      def valid?
        source_branch.valid? && target_branch.valid?
      end

      private

51 52 53 54
      def project
        @project ||= options.fetch(:project)
      end

55
      def source_branch
56
        @source_branch ||= Representation::Branch.new(raw['head'], repository: project.repository)
57 58 59 60 61 62 63
      end

      def source_branch_name_prefixed
        "gh-#{target_branch_short_sha}/#{iid}/#{source_branch_user}/#{source_branch_ref}"
      end

      def target_branch
64
        @target_branch ||= Representation::Branch.new(raw['base'], repository: project.repository)
65 66 67 68 69 70 71 72 73 74 75 76 77 78
      end

      def target_branch_name_prefixed
        "gl-#{target_branch_short_sha}/#{iid}/#{target_branch_user}/#{target_branch_ref}"
      end

      def cross_project?
        return true if source_branch_repo.nil?

        source_branch_repo.id != target_branch_repo.id
      end
    end
  end
end