summaryrefslogtreecommitdiff
path: root/lib/github/representation/pull_request.rb
blob: 0171179bb0fd5280ad5618b35eecb112178ab74b (plain)
1
2
3
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
module Github
  module Representation
    class PullRequest < Representation::Issuable
      delegate :sha, to: :source_branch, prefix: true
      delegate :sha, to: :target_branch, prefix: true

      def source_project
        project
      end

      def source_branch_name
        # Mimic the "user:branch" displayed in the MR widget,
        # i.e. "Request to merge rymai:add-external-mounts into master"
        cross_project? ? "#{source_branch.user}:#{source_branch.ref}" : source_branch.ref
      end

      def target_project
        project
      end

      def target_branch_name
        target_branch.ref
      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

      def assigned?
        raw['assignee'].present?
      end

      def assignee
        return unless assigned?

        @assignee ||= Github::Representation::User.new(raw['assignee'], options)
      end

      private

      def project
        @project ||= options.fetch(:project)
      end

      def source_branch
        @source_branch ||= Representation::Branch.new(raw['head'], repository: project.repository)
      end

      def target_branch
        @target_branch ||= Representation::Branch.new(raw['base'], repository: project.repository)
      end

      def cross_project?
        return true unless source_branch.repo?

        source_branch.repo.id != target_branch.repo.id
      end
    end
  end
end