Blob of app/controllers/repositories_controller.rb (raw blob data)

1 class RepositoriesController < ApplicationController
2
3 before_filter :login_required, :except => [:index, :show, :writable_by]
4 before_filter :find_project
5 before_filter :require_adminship, :only => [:edit, :update]
6 before_filter :require_user_has_ssh_keys, :only => [:new, :create]
7 session :off, :only => [:writable_by]
8
9 def index
10 if @project
11 @repositories = @project.repositories.find(:all)
12 @title, @url_suffix = Project.tab_settings(PRJ_TAB_GIT)
13 render :action => "ac_index"
14 else
15 flash[:error] = "Project not found."
16 redirect_to projects_path
17 end
18 end
19
20 def show
21 @repository = @project.repositories.find_by_name!(params[:id])
22 @comment_count = @repository.comments.count
23 @merge_request_count = @repository.merge_requests.count_open
24 if @repository.has_commits?
25 @commits = @repository.paginated_commits(@repository.head_candidate.name, page=1)
26 else
27 @commits = []
28 end
29 @title = "Repo: &lsquo;" << @repository.name << "&rsquo;"
30 render :action => "ac_show"
31 end
32
33 # note the #new+#create actions are members in the routes, hence they require
34 # an id (of the repos to clone).
35 def new
36 @repository_to_clone = @project.repositories.find_by_name!(params[:id])
37 unless @repository_to_clone.has_commits?
38 flash[:error] = "Sorry, can't clone an empty repository"
39 redirect_to project_repository_path(@project, @repository_to_clone)
40 return
41 end
42 @repository = Repository.new_by_cloning(@repository_to_clone, current_user.login)
43 end
44
45 def create
46 @repository_to_clone = @project.repositories.find_by_name!(params[:id])
47 unless @repository_to_clone.has_commits?
48 target_path = project_repository_path(@project, @repository_to_clone)
49 respond_to do |format|
50 format.html do
51 flash[:error] = "Sorry, can't clone an empty repository"
52 redirect_to target_path
53 end
54 format.xml do
55 render :text => "Sorry, can't clone an empty repository",
56 :location => target_path, :status => :unprocessable_entity
57 end
58 end
59 return
60 end
61 @repository = Repository.new_by_cloning(@repository_to_clone)
62 @repository.name = params[:repository][:name]
63 @repository.user = current_user
64
65 respond_to do |format|
66 if @repository.save
67 location = project_repository_path(@project, @repository)
68 format.html { redirect_to location }
69 format.xml { render :xml => @repository, :status => :created, :location => location }
70 else
71 format.html { render :action => "new" }
72 format.xml { render :xml => @repository.errors, :status => :unprocessable_entity }
73 end
74 end
75 end
76
77 # Used internally to check write permissions by gitorious
78 def writable_by
79 @repository = @project.repositories.find_by_name!(params[:id])
80 user = User.find_by_login(params[:username])
81 if user && user.can_write_to?(@repository)
82 render :text => "true"
83 else
84 render :text => "false"
85 end
86 end
87
88 def confirm_delete
89 @repository = @project.repositories.find_by_name!(params[:id])
90 end
91
92 def destroy
93 @repository = @project.repositories.find_by_name!(params[:id])
94 if @repository.can_be_deleted_by?(current_user)
95 flash[:notice] = "The repository was deleted"
96 @repository.destroy
97 else
98 flash[:error] = "You're not the owner of this repository"
99 end
100 redirect_to project_path(@project)
101 end
102
103 private
104
105 def require_adminship
106 unless @project.admin?(current_user)
107 respond_to do |format|
108 flash[:error] = "Sorry, only project admins are allowed to do that"
109 format.html { redirect_to(project_path(@project)) }
110 format.xml { render :text => "Sorry, only project admins are allowed to do that", :status => :forbidden }
111 end
112 return
113 end
114 end
115 end