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

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