tags_controller.rb 3.2 KB
Newer Older
1 2
# frozen_string_literal: true

3
class Projects::TagsController < Projects::ApplicationController
T
tiagonbotelho 已提交
4
  include SortingHelper
T
tiagonbotelho 已提交
5

6 7
  prepend_before_action(only: [:index]) { authenticate_sessionless_user!(:rss) }

8
  # Authorize
9 10
  before_action :require_non_empty_project
  before_action :authorize_download_code!
M
Manoj MJ 已提交
11
  before_action :authorize_admin_tag!, only: [:new, :create, :destroy]
12

13
  # rubocop: disable CodeReuse/ActiveRecord
14
  def index
15
    params[:sort] = params[:sort].presence || sort_value_recently_updated
T
tiagonbotelho 已提交
16 17

    @sort = params[:sort]
T
tiagonbotelho 已提交
18
    @tags = TagsFinder.new(@repository, params).execute
19 20
    @tags = Kaminari.paginate_array(@tags).page(params[:page])

21
    tag_names = @tags.map(&:name)
22
    @tags_pipelines = @project.ci_pipelines.latest_successful_for_refs(tag_names)
23
    @releases = project.releases.where(tag: tag_names)
24 25 26 27 28

    respond_to do |format|
      format.html
      format.atom { render layout: 'xml.atom' }
    end
29
  end
30
  # rubocop: enable CodeReuse/ActiveRecord
31

32
  # rubocop: disable CodeReuse/ActiveRecord
33 34
  def show
    @tag = @repository.find_tag(params[:id])
S
Sean McGivern 已提交
35

36
    return render_404 unless @tag
37

38
    @release = @project.releases.find_or_initialize_by(tag: @tag.name)
39
    @commit = @repository.commit(@tag.dereferenced_target)
40
  end
41
  # rubocop: enable CodeReuse/ActiveRecord
42 43

  def create
44 45 46
    # TODO: remove this with the release creation moved to it's own form https://gitlab.com/gitlab-org/gitlab/-/issues/214245
    evidence_pipeline = find_evidence_pipeline

47
    result = ::Tags::CreateService.new(@project, current_user)
A
Alessio Caiazza 已提交
48
      .execute(params[:tag_name], params[:ref], params[:message])
49

50
    if result[:status] == :success
51
      # TODO: remove this with the release creation moved to it's own form https://gitlab.com/gitlab-org/gitlab/-/issues/214245
A
Alessio Caiazza 已提交
52
      if params[:release_description].present?
S
Shinya Maeda 已提交
53 54 55
        release_params = {
          tag: params[:tag_name],
          name: params[:tag_name],
56 57
          description: params[:release_description],
          evidence_pipeline: evidence_pipeline
S
Shinya Maeda 已提交
58 59 60 61 62
        }

        Releases::CreateService
          .new(@project, current_user, release_params)
          .execute
A
Alessio Caiazza 已提交
63 64
      end

65
      @tag = result[:tag]
66

67
      redirect_to project_tag_path(@project, @tag.name)
68 69
    else
      @error = result[:message]
70 71
      @message = params[:message]
      @release_description = params[:release_description]
72 73
      render action: 'new'
    end
74 75 76
  end

  def destroy
77
    result = ::Tags::DestroyService.new(project, current_user).execute(params[:id])
78

79
    respond_to do |format|
80 81
      if result[:status] == :success
        format.html do
L
Lin Jen-Shin 已提交
82
          redirect_to project_tags_path(@project), status: :see_other
83 84 85 86 87 88 89
        end

        format.js
      else
        @error = result[:message]

        format.html do
90
          redirect_to project_tags_path(@project),
91
            alert: @error, status: :see_other
92 93 94
        end

        format.js do
95
          render status: :ok
96
        end
97 98
      end
    end
99
  end
100 101 102 103 104 105 106 107 108 109

  private

  # TODO: remove this with the release creation moved to it's own form https://gitlab.com/gitlab-org/gitlab/-/issues/214245
  def find_evidence_pipeline
    evidence_pipeline_sha = @project.repository.commit(params[:ref])&.sha
    return unless evidence_pipeline_sha

    @project.ci_pipelines.for_sha(evidence_pipeline_sha).last
  end
110
end