summaryrefslogtreecommitdiff
path: root/lib/gitlab/github_import/pull_request_formatter.rb
blob: 9f8182f643e69e34c4b5e93c308f8a2a625c2a6c (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
module Gitlab
  module GithubImport
    class PullRequestFormatter < BaseFormatter
      def attributes
        {
          iid: number,
          title: raw_data.title,
          description: description,
          source_project: source_project,
          source_branch: source_branch,
          head_source_sha: source_sha,
          target_project: target_project,
          target_branch: target_branch,
          base_target_sha: target_sha,
          state: state,
          milestone: milestone,
          author_id: author_id,
          assignee_id: assignee_id,
          created_at: raw_data.created_at,
          updated_at: updated_at
        }
      end

      def number
        raw_data.number
      end

      def valid?
        !cross_project?
      end

      def source_branch_exists?
        source_project.repository.branch_exists?(source_ref)
      end

      def source_branch
        @source_branch ||= if source_branch_exists?
                             source_ref
                           else
                             "#{source_ref}-#{short_id(source_sha)}"
                           end
      end

      def short_id(sha, length = 7)
        sha.to_s[0..length]
      end

      def source_sha
        raw_data.head.sha
      end

      def target_branch_exists?
        target_project.repository.branch_exists?(target_ref)
      end

      def target_branch
        @target_branch ||= if target_branch_exists?
                             target_ref
                           else
                             "#{target_ref}-#{short_id(target_sha)}"
                           end
      end

      def target_sha
        raw_data.base.sha
      end

      private

      def assigned?
        raw_data.assignee.present?
      end

      def assignee_id
        if assigned?
          gl_user_id(raw_data.assignee.id)
        end
      end

      def author
        raw_data.user.login
      end

      def author_id
        gl_user_id(raw_data.user.id) || project.creator_id
      end

      def body
        raw_data.body || ""
      end

      def cross_project?
        source_repo.present? && target_repo.present? && source_repo.id != target_repo.id
      end

      def description
        formatter.author_line(author) + body
      end

      def milestone
        if raw_data.milestone.present?
          project.milestones.find_by(iid: raw_data.milestone.number)
        end
      end

      def source_project
        project
      end

      def source_repo
        raw_data.head.repo
      end

      def source_ref
        raw_data.head.ref
      end

      def target_project
        project
      end

      def target_repo
        raw_data.base.repo
      end

      def target_ref
        raw_data.base.ref
      end

      def state
        @state ||= case true
                   when raw_data.state == 'closed' && raw_data.merged_at.present?
                     'merged'
                   when raw_data.state == 'closed'
                     'closed'
                   else
                     'opened'
                   end
      end

      def updated_at
        case state
        when 'merged' then raw_data.merged_at
        when 'closed' then raw_data.closed_at
        else
          raw_data.updated_at
        end
      end
    end
  end
end