BigW Consortium Gitlab

repository_push.rb 3.88 KB
Newer Older
1 2 3 4
module Gitlab
  module Email
    module Message
      class RepositoryPush
5
        attr_reader :author_id, :ref, :action
6

7
        include Gitlab::Routing.url_helpers
8
        include DiffHelper
9

10 11
        delegate :namespace, :name_with_namespace, to: :project, prefix: :project
        delegate :name, to: :author, prefix: :author
12
        delegate :username, to: :author, prefix: :author
13

14
        def initialize(notify, project_id, opts = {})
15
          raise ArgumentError, 'Missing options: author_id, ref, action' unless
16 17 18 19
            opts[:author_id] && opts[:ref] && opts[:action]

          @notify = notify
          @project_id = project_id
20
          @opts = opts.dup
21

22 23 24
          @author_id = @opts.delete(:author_id)
          @ref = @opts.delete(:ref)
          @action = @opts.delete(:action)
25 26 27
        end

        def project
28
          @project ||= Project.find(@project_id)
29 30 31
        end

        def author
32
          @author ||= User.find(@author_id)
33 34 35
        end

        def commits
36
          @commits ||= (Commit.decorate(compare.commits, project) if compare)
37 38 39
        end

        def diffs
40
          @diffs ||= (safe_diff_files(compare.diffs, diff_refs) if compare)
41 42
        end

43 44 45 46
        def diffs_count
          diffs.count if diffs
        end

47 48
        def compare
          @opts[:compare]
49 50
        end

51 52 53 54
        def diff_refs
          @opts[:diff_refs]
        end

55
        def compare_timeout
56
          diffs.overflow? if diffs
57 58
        end

59 60 61
        def reverse_compare?
          @opts[:reverse_compare] || false
        end
62

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
        def disable_diffs?
          @opts[:disable_diffs] || false
        end

        def send_from_committer_email?
          @opts[:send_from_committer_email] || false
        end

        def action_name
          @action_name ||=
            case @action
            when :create
              'pushed new'
            when :delete
              'deleted'
78
            else
79
              'pushed to'
80 81 82 83
            end
        end

        def ref_name
84
          @ref_name ||= Gitlab::Git.ref_name(@ref)
85 86 87
        end

        def ref_type
88
          @ref_type ||= Gitlab::Git.tag_ref?(@ref) ? 'tag' : 'branch'
89 90 91
        end

        def target_url
92 93
          if @action == :push && commits
            if commits.length > 1
94 95 96 97
              namespace_project_compare_url(project_namespace,
                                            project,
                                            from: Commit.new(compare.base, project),
                                            to:   Commit.new(compare.head, project))
98
            else
99 100
              namespace_project_commit_url(project_namespace,
                                           project, commits.first)
101 102 103
            end
          else
            unless @action == :delete
104 105
              namespace_project_tree_url(project_namespace,
                                         project, ref_name)
106 107 108 109 110
            end
          end
        end

        def reply_to
111 112
          if send_from_committer_email? && @notify.can_send_from_user_email?(author)
            author.email
113 114 115 116
          else
            Gitlab.config.gitlab.email_reply_to
          end
        end
117 118 119 120 121 122 123

        def subject
          subject_text = '[Git]'
          subject_text << "[#{project.path_with_namespace}]"
          subject_text << "[#{ref_name}]" if @action == :push
          subject_text << ' '

124
          if @action == :push && commits
125 126 127 128 129 130 131 132 133 134 135 136 137
            if commits.length > 1
              subject_text << "Deleted " if reverse_compare?
              subject_text << "#{commits.length} commits: #{commits.first.title}"
            else
              subject_text << "Deleted 1 commit: " if reverse_compare?
              subject_text << commits.first.title
            end
          else
            subject_action = action_name.dup
            subject_action[0] = subject_action[0].capitalize
            subject_text << "#{subject_action} #{ref_type} #{ref_name}"
          end
        end
138 139 140 141
      end
    end
  end
end