“1c07f1bf6e298f7c8b05eb5ec2344cc2c3fbba8b”上不存在“projects/kevin28520/imports.yml”
projects_controller.rb 5.7 KB
Newer Older
1
class ProjectsController < ApplicationController
2
  skip_before_filter :authenticate_user!, only: [:show]
3 4
  before_filter :project, except: [:new, :create]
  before_filter :repository, except: [:new, :create]
G
gitlabhq 已提交
5 6

  # Authorize
7
  before_filter :authorize_read_project!, except: [:index, :new, :create]
8
  before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive, :retry_import]
9
  before_filter :require_non_empty_project, only: [:blob, :tree, :graph]
G
gitlabhq 已提交
10

11
  layout 'navless', only: [:new, :create, :fork]
12
  before_filter :set_title, only: [:new, :create]
C
Cyril 已提交
13

G
gitlabhq 已提交
14 15 16 17 18
  def new
    @project = Project.new
  end

  def edit
19
    render 'edit', layout: "project_settings"
G
gitlabhq 已提交
20 21 22
  end

  def create
23
    @project = ::Projects::CreateService.new(current_user, params[:project]).execute
24
    flash[:notice] = 'Project was successfully created.' if @project.saved?
G
gitlabhq 已提交
25 26 27 28 29

    respond_to do |format|
      format.js
    end
  end
G
gitlabhq 已提交
30

G
gitlabhq 已提交
31
  def update
32
    status = ::Projects::UpdateService.new(@project, current_user, params).execute
33

G
gitlabhq 已提交
34
    respond_to do |format|
35
      if status
36
        flash[:notice] = 'Project was successfully updated.'
D
Dmitriy Zaporozhets 已提交
37
        format.html { redirect_to edit_project_path(@project), notice: 'Project was successfully updated.' }
N
Nihad Abbasov 已提交
38
        format.js
G
gitlabhq 已提交
39
      else
40
        format.html { render "edit", layout: "project_settings" }
N
Nihad Abbasov 已提交
41
        format.js
G
gitlabhq 已提交
42
      end
G
gitlabhq 已提交
43
    end
44
  end
45

46
  def transfer
47
    ::Projects::TransferService.new(project, current_user, params[:project]).execute
G
gitlabhq 已提交
48 49 50
  end

  def show
51 52 53 54 55
    if @project.import_in_progress?
      redirect_to import_project_path(@project)
      return
    end

56
    return authenticate_user! unless @project.public? || current_user
57

58
    limit = (params[:limit] || 20).to_i
59 60 61
    @events = @project.events.recent
    @events = event_filter.apply_filter(@events)
    @events = @events.limit(limit).offset(params[:offset] || 0)
D
Dmitriy Zaporozhets 已提交
62 63

    respond_to do |format|
N
Nihad Abbasov 已提交
64
      format.html do
65
        if @project.empty_repo?
66
          render "projects/empty", layout: user_layout
67
        else
68
          @last_push = current_user.recent_push(@project.id) if current_user
69
          render :show, layout: user_layout
70
        end
D
Dmitriy Zaporozhets 已提交
71
      end
72
      format.json { pager_json("events/_events", @events.count) }
D
Dmitriy Zaporozhets 已提交
73
    end
74 75
  end

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
  def import
    if project.import_finished?
      redirect_to @project
      return
    end
  end

  def retry_import
    unless @project.import_failed?
      redirect_to import_project_path(@project)
    end

    @project.import_url = params[:project][:import_url]

    if @project.save
      @project.reload
      @project.import_retry
    end

    redirect_to import_project_path(@project)
  end

G
gitlabhq 已提交
98
  def destroy
99 100
    return access_denied! unless can?(current_user, :remove_project, project)

D
Dmitriy Zaporozhets 已提交
101
    project.team.truncate
G
gitlabhq 已提交
102 103 104
    project.destroy

    respond_to do |format|
R
randx 已提交
105
      format.html { redirect_to root_path }
G
gitlabhq 已提交
106 107
    end
  end
108 109

  def fork
110
    @forked_project = ::Projects::ForkService.new(project, current_user).execute
111 112 113

    respond_to do |format|
      format.html do
114 115
        if @forked_project.saved? && @forked_project.forked?
          redirect_to(@forked_project, notice: 'Project was successfully forked.')
116
        else
117
          @title = 'Fork project'
118
          render "fork"
119 120 121 122 123
        end
      end
      format.js
    end
  end
124 125

  def autocomplete_sources
M
Marin Jankovski 已提交
126 127 128
    note_type = params['type']
    note_id = params['type_id']
    participating = if note_type && note_id
129 130 131 132
                      participants_in(note_type, note_id)
                    else
                      []
                    end
M
Marin Jankovski 已提交
133
    team_members = sorted(@project.team.members)
M
Marin Jankovski 已提交
134
    participants = team_members + participating
135
    @suggestions = {
136
      emojis: Emoji.names.map { |e| { name: e, path: view_context.image_url("emoji/#{e}.png") } },
137
      issues: @project.issues.select([:iid, :title, :description]),
138
      mergerequests: @project.merge_requests.select([:iid, :title, :description]),
M
Marin Jankovski 已提交
139
      members: participants.uniq
140 141 142 143 144 145
    }

    respond_to do |format|
      format.json { render :json => @suggestions }
    end
  end
146

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  def archive
    return access_denied! unless can?(current_user, :archive_project, project)
    project.archive!

    respond_to do |format|
      format.html { redirect_to @project }
    end
  end

  def unarchive
    return access_denied! unless can?(current_user, :archive_project, project)
    project.unarchive!

    respond_to do |format|
      format.html { redirect_to @project }
    end
  end

165
  def upload_image
M
Marin Jankovski 已提交
166
    link_to_image = ::Projects::ImageService.new(repository, params, root_url).execute
167

168
    respond_to do |format|
M
Marin Jankovski 已提交
169 170
      if link_to_image
        format.json { render json: { link: link_to_image } }
171 172 173
      else
        format.json { render json: "Invalid file.", status: :unprocessable_entity }
      end
174 175 176
    end
  end

177 178
  private

179 180 181 182 183 184 185 186 187
  def upload_path
    base_dir = FileUploader.generate_dir
    File.join(repository.path_with_namespace, base_dir)
  end

  def accepted_images
    %w(png jpg jpeg gif)
  end

188 189 190
  def set_title
    @title = 'New Project'
  end
191 192 193 194

  def user_layout
    current_user ? "projects" : "public_projects"
  end
M
Marin Jankovski 已提交
195 196

  def participants_in(type, id)
M
Marin Jankovski 已提交
197
    users = case type
198 199 200 201 202 203 204 205 206 207 208 209
            when "Issue"
              issue = @project.issues.find_by_iid(id)
              issue ? issue.participants : []
            when "MergeRequest"
              merge_request = @project.merge_requests.find_by_iid(id)
              merge_request ? merge_request.participants : []
            when "Commit"
              author_ids = Note.for_commit_id(id).pluck(:author_id).uniq
              User.where(id: author_ids)
            else
              []
            end
M
Marin Jankovski 已提交
210 211 212 213
    sorted(users)
  end

  def sorted(users)
214
    users.uniq.to_a.compact.sort_by(&:username).map { |user| { username: user.username, name: user.name } }
M
Marin Jankovski 已提交
215
  end
G
gitlabhq 已提交
216
end