summaryrefslogtreecommitdiff
path: root/app/services/git/tag_push_service.rb
blob: 318dfd4f886de047762015a0ff22531dd5209e35 (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
# frozen_string_literal: true

module Git
  class TagPushService < BaseService
    attr_accessor :push_data

    def execute
      project.repository.after_create if project.empty_repo?
      project.repository.before_push_tag

      @push_data = build_push_data

      EventCreateService.new.push(project, current_user, push_data)
      Ci::CreatePipelineService.new(project, current_user, push_data).execute(:push, pipeline_options)

      SystemHooksService.new.execute_hooks(build_system_push_data, :tag_push_hooks)
      project.execute_hooks(push_data.dup, :tag_push_hooks)
      project.execute_services(push_data.dup, :tag_push_hooks)

      ProjectCacheWorker.perform_async(project.id, [], [:commit_count, :repository_size])

      true
    end

    private

    def build_push_data
      commits = []
      message = nil

      unless Gitlab::Git.blank_ref?(params[:newrev])
        tag_name = Gitlab::Git.ref_name(params[:ref])
        tag = project.repository.find_tag(tag_name)

        if tag && tag.target == params[:newrev]
          commit = project.commit(tag.dereferenced_target)
          commits = [commit].compact
          message = tag.message
        end
      end

      Gitlab::DataBuilder::Push.build(
        project,
        current_user,
        params[:oldrev],
        params[:newrev],
        params[:ref],
        commits,
        message,
        push_options: params[:push_options] || [])
    end

    def build_system_push_data
      Gitlab::DataBuilder::Push.build(
        project,
        current_user,
        params[:oldrev],
        params[:newrev],
        params[:ref],
        [],
        '')
    end

    def pipeline_options
      {} # to be overridden in EE
    end
  end
end