Atom feeds for events
[gitorious:yousource.git] / app / controllers / repositories_controller.rb
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     @repositories = @project.repositories.find(:all, :include => [:user, :events, :project])
10   end
11     
12   def show
13     @repository = @project.repositories.find_by_name!(params[:id])
14     @events = @repository.events.paginate(:all, :page => params[:page], 
15       :order => "created_at desc")
16     
17     @atom_auto_discovery_url = formatted_project_repository_path(@project, @repository, :atom)
18     respond_to do |format|
19       format.html
20       format.xml  { render :xml => @repository }
21       format.atom {  }
22     end
23   end
24   
25   # note the #new+#create actions are members in the routes, hence they require
26   # an id (of the repos to clone).
27   def new
28     @repository_to_clone = @project.repositories.find_by_name!(params[:id])
29     unless @repository_to_clone.has_commits?
30       flash[:error] = "Sorry, can't clone an empty repository"
31       redirect_to project_repository_path(@project, @repository_to_clone)
32       return
33     end
34     @repository = Repository.new_by_cloning(@repository_to_clone, current_user.login)
35   end
36   
37   def create
38     @repository_to_clone = @project.repositories.find_by_name!(params[:id])
39     unless @repository_to_clone.has_commits?
40       target_path = project_repository_path(@project, @repository_to_clone)
41       respond_to do |format|
42         format.html do
43           flash[:error] = "Sorry, can't clone an empty repository"
44           redirect_to target_path
45         end
46         format.xml do 
47           render :text => "Sorry, can't clone an empty repository", 
48             :location => target_path, :status => :unprocessable_entity
49         end
50       end
51       return
52     end
53     @repository = Repository.new_by_cloning(@repository_to_clone)
54     @repository.name = params[:repository][:name]
55     @repository.user = current_user
56     
57     respond_to do |format|
58       if @repository.save
59         @project.create_event(Action::CLONE_REPOSITORY, @repository, current_user, @repository_to_clone.id)
60         
61         location = project_repository_path(@project, @repository)
62         format.html { redirect_to location }
63         format.xml  { render :xml => @repository, :status => :created, :location => location }        
64       else
65         format.html { render :action => "new" }
66         format.xml  { render :xml => @repository.errors, :status => :unprocessable_entity }
67       end
68     end
69   end
70   
71   # Used internally to check write permissions by gitorious
72   def writable_by
73     @repository = @project.repositories.find_by_name!(params[:id])
74     user = User.find_by_login(params[:username])
75     if user && user.can_write_to?(@repository)
76       render :text => "true"
77     else
78       render :text => "false"
79     end
80   end
81   
82   def confirm_delete
83     @repository = @project.repositories.find_by_name!(params[:id])
84   end
85   
86   def destroy
87     @repository = @project.repositories.find_by_name!(params[:id])
88     if @repository.can_be_deleted_by?(current_user)
89       repo_name = @repository.name
90       flash[:notice] = "The repository was deleted"
91       @repository.destroy
92       @project.create_event(Action::DELETE_REPOSITORY, @project, current_user, repo_name)
93     else
94       flash[:error] = "You're not the owner of this repository"
95     end
96     redirect_to project_path(@project)
97   end
98   
99   private    
100     def require_adminship
101       unless @project.admin?(current_user)
102         respond_to do |format|
103           flash[:error] = "Sorry, only project admins are allowed to do that"
104           format.html { redirect_to(project_path(@project)) }
105           format.xml  { render :text => "Sorry, only project admins are allowed to do that", :status => :forbidden }
106         end
107         return
108       end
109     end
110 end