Commit 5c5947ba3940e472af0acde870470633eb84f178

refactoring to use polymorphic associations (USER does ACTION on X)

Signed-off-by: David A. Cuadrado <krawek@gmail.com>

Commit diff

app/controllers/comments_controller.rb

 
2929 @comment.project = @project
3030 respond_to do |format|
3131 if @comment.save
32 Event.from_action_name("comment", current_user, @repository, @comment.id)
32 current_user.create_event("comment", @comment)
3333 format.html do
3434 flash[:success] = "Your comment was added"
3535 redirect_to project_repository_comments_path(@project, @repository)
toggle raw diff

app/controllers/committers_controller.rb

 
2121
2222 respond_to do |format|
2323 if @repository.add_committer(@committer)
24 Event.from_action_name("add committer", current_user, @repository, @committer.id)
24 @committership = @repository.committerships.find_by_user_id(@committer.id)
25 current_user.create_event("add committer", @committership)
2526 format.html { redirect_to([@repository.project, @repository]) }
2627 format.xml do
2728 render :xml => @committer
3939 @committership = @repository.committerships.find_by_user_id(params[:id])
4040
4141 respond_to do |format|
42 commiter = User.find_by_id(params[:id])
4342 if @committership.destroy
44 Event.from_action_name("remove committer", current_user, @repository, commiter.id)
43 current_user.create_event("remove committer", @repository, params[:id])
4544 flash[:success] = "User removed from repository"
4645 format.html { redirect_to [@repository.project, @repository] }
4746 format.xml { render :nothing, :status => :ok }
toggle raw diff

app/controllers/events_controller.rb

 
11class EventsController < ApplicationController
22 def index
33 @events = Event.paginate(:all, :order => "events.date asc",
4 :page => params[:page], :include => [:action, :user, {:repository => :project}])
4 :page => params[:page], :include => [:action, :user, :target])
55 end
66
77end
toggle raw diff

app/controllers/merge_requests_controller.rb

 
2828 @merge_request.user = current_user
2929 respond_to do |format|
3030 if @merge_request.save
31 Event.from_action_name("request merge", current_user, @repository, @merge_request.id)
31 current_user.create_event("request merge", @merge_request)
3232 format.html {
3333 flash[:success] = %Q{You sent a merge request to "#{@merge_request.target_repository.name}"}
3434 redirect_to project_repository_path(@project, @repository) and return
4848 # TODO: put to change status
4949 @merge_request.status = params[:merge_request][:status]
5050 if @merge_request.save
51 Event.from_action_name("resolve merge request", current_user, @repository, @merge_request.id)
51 current_user.create_event("resolve merge request", @merge_request)
5252 flash[:notice] = "The merge request was marked as #{@merge_request.status_string}"
5353 end
5454 redirect_to [@project, @repository, @merge_request]
6161 def update
6262 @merge_request.attributes = params[:merge_request]
6363 if @merge_request.save
64 Event.from_action_name("update merge request", current_user, @repository, @merge_request.id)
64 current_user.create_event("update merge request", @merge_request)
6565 flash[:success] = "Merge request was updated"
6666 redirect_to [@project, @repository, @merge_request]
6767 else
7272
7373 def destroy
7474 @merge_request.destroy
75 Event.from_action_name("delete merge request", current_user, @repository)
75 current_user.create_event("delete merge request", @repository)
7676 flash[:success] = "Merge request was retracted"
7777 redirect_to project_repository_path(@project, @repository)
7878 end
toggle raw diff

app/controllers/projects_controller.rb

 
4646 @project = Project.new(params[:project])
4747 @project.user = current_user
4848 if @project.save
49 Event.from_action_name("create project", current_user, @project.mainline_repository)
49 current_user.create_event("create project", @project)
5050 redirect_to projects_path
5151 else
5252 render :action => 'new'
6565 end
6666 @project.attributes = params[:project]
6767 if @project.save
68 Event.from_action_name("update project", current_user, @project.mainline_repository)
68 current_user.create_event("update project", @project)
6969 redirect_to project_path(@project)
7070 else
7171 render :action => 'new'
8181 if @project.can_be_deleted_by?(current_user)
8282 project_title = @project.title
8383 @project.destroy
84 Event.from_action_name("delete project", current_user, nil, project_title)
84 current_user.create_event("delete project", nil, project_title)
8585 else
8686 flash[:error] = "You're not the owner of this project, or the project has clones"
8787 end
toggle raw diff

app/controllers/repositories_controller.rb

 
6161
6262 respond_to do |format|
6363 if @repository.save
64 Event.from_action_name("fork project", current_user, @repository, @repository_to_clone.id)
64 current_user.create_event("clone repository", @repository, @repository_to_clone.id)
6565
6666 location = project_repository_path(@project, @repository)
6767 format.html { redirect_to location }
9191 def destroy
9292 @repository = @project.repositories.find_by_name!(params[:id])
9393 if @repository.can_be_deleted_by?(current_user)
94 repo_name = @repository.name
9495 flash[:notice] = "The repository was deleted"
9596 @repository.destroy
97 current_user.create_event("delete repository", @project, repo_name)
9698 else
9799 flash[:error] = "You're not the owner of this repository"
98100 end
toggle raw diff

app/controllers/users_controller.rb

 
77 @user = User.find_by_login!(params[:id])
88 @projects = @user.projects.find(:all, :include => [:tags, { :repositories => :project }])
99 @repositories = @user.repositories.find(:all, :conditions => ["mainline = ?", false])
10 @events = @user.events.find(:all, :order => "events.date asc", :include => [:action, :user, {:repository => :project}])
10 @events = @user.events.find(:all, :order => "events.date asc", :include => [:action, :user, :target])
1111
1212 @commits_last_week = 0
1313 @projects.map{|p| p.repositories.first }.concat(@repositories).each do |repo|
toggle raw diff

app/helpers/application_helper.rb

 
101101 image_tag("graphs/#{filename}")
102102 end
103103 end
104
105 def action_and_body_for_event(event)
106 target = event.target
107 action = ""
108 body = ""
109 case event.action.name
110 when "create project"
111 action = "<b>created project</b> #{link_to h(target.title), project_path(target)}"
112 body = truncate(target.stripped_description, 100)
113 when "delete project"
114 action = "<b>deleted project</b> #{h(event.data)}"
115 when "update project"
116 action = "<b>updated project</b> #{link_to h(target.title), project_path(target)}"
117 when "clone repository"
118 original_repo = Repository.find_by_id(event.data.to_i)
119 next if original_repo.nil?
120
121 project = target.project
122
123 action = "<b>forked</b> #{link_to h(project.title), project_path(project)}/#{link_to h(original_repo.name), project_repository_url(project, original_repo)} in #{link_to h(target.name), project_repository_url(project, target)}"
124 when "delete repository"
125 action = "<b>deleted repository</b> #{link_to h(target.title), project_path(target)}/#{event.data}"
126 when "commit"
127 project = target.project
128 action = "<b>commited to</b> #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
129 body = "#{link_to event.data, project_repository_commit_path(project, target, event.data)}<br/>#{event.body}"
130 when "create branch"
131 project = target.project
132 if event.data == "master"
133 action = "<b>started development</b> of #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
134 body = event.body
135 else
136 action = "<b>created branch</b> #{link_to h(event.data), project_repository_tree_path(project, target, event.data)} on #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
137 end
138 when "delete branch"
139 project = target.project
140 action = "<b>deleted branch</b> #{event.data} on #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
141 when "create tag"
142 project = target.project
143 action = "<b>tagged</b> #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
144 body = "#{link_to event.data, project_repository_commit_path(project, target, event.data)}<br/>#{event.body}"
145 when "delete tag"
146 project = target.project
147 action = "<b>deleted tag</b> #{event.data} on #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
148 when "add committer"
149 user = target.user
150 repo = target.repository
151
152 action = "<b>added committer</b> #{link_to user.login, user_path(user)} to #{link_to h(repo.project.title), project_path(repo.project)}/#{link_to h(repo.name), project_repository_url(repo.project, repo)}"
153 when "remove committer"
154 user = User.find_by_id(event.data.to_i)
155 next unless user
156
157 project = target.project
158 action = "<b>removed committer</b> #{link_to user.login, user_path(user)} from #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
159 when "comment"
160 project = target.project
161 repo = target.repository
162
163 action = "<b>commented</b> on #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
164 body = truncate(h(target.body), 100)
165 when "request merge"
166 source_repository = target.source_repository
167 project = source_repository.project
168 target_repository = target.target_repository
169
170 action = "<b>requested merge</b> #{link_to h(project.title), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)} to #{link_to h(project.title), project_path(project)}/#{link_to h(target_repository.name)}"
171 body = "#{link_to "review", [project, target_repository, target]}<br/>#{truncate(h(target.proposal), 100)}"
172 when "resolve merge request"
173 source_repository = target.source_repository
174 project = source_repository.project
175 target_repository = target.target_repository
176
177 action = "<b>resolved merge request </b>to [#{target.status_string}] from #{link_to h(project.title), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)}"
178 when "update merge request"
179 source_repository = target.source_repository
180 project = source_repository.project
181 target_repository = target.target_repository
182
183 action = "<b>updated merge request</b> from #{link_to h(project.title), project_path(project)}/#{link_to h(source_repository.name), project_repository_url(project, source_repository)}"
184 when "delete merge request"
185 project = target.project
186
187 action = "<b>deleted merge request</b> from #{link_to h(project.title), project_path(project)}/#{link_to h(target.name), project_repository_url(project, target)}"
188 end
189
190 [action, body]
191 end
104192end
toggle raw diff

app/models/comment.rb

 
22 belongs_to :user
33 belongs_to :repository
44 belongs_to :project
5 has_many :events, :as => :target, :dependent => :destroy
56
67 is_indexed :fields => ["body"], :include => [{
78 :association_name => "user",
toggle raw diff

app/models/committership.rb

 
11class Committership < ActiveRecord::Base
22 belongs_to :user
33 belongs_to :repository
4 has_many :events, :as => :target, :dependent => :destroy
45
56 KIND_ACCESS_NONE = 0
67 KIND_ACCESS_READ = 1
toggle raw diff

app/models/event.rb

 
11class Event < ActiveRecord::Base
22 belongs_to :action
33 belongs_to :user
4 belongs_to :repository
5
6 def self.from_action_name(action_name, user, repository, ref = nil, body = nil)
7 action = Action.find_by_name(action_name)
8 return nil if action.nil?
9
10 repo_id = nil
11 if repository
12 repo_id = repository.id
13 end
14
15 return Event.create(:user_id => user.id, :repository_id => repo_id, :action_id => action.id,
16 :body => body, :ref => ref, :date => Time.now)
17 end
4 belongs_to :target, :polymorphic => true
185end
toggle raw diff

app/models/merge_request.rb

 
22 belongs_to :user
33 belongs_to :source_repository, :class_name => 'Repository'
44 belongs_to :target_repository, :class_name => 'Repository'
5 has_many :events, :as => :target, :dependent => :destroy
56
67 is_indexed :fields => ["proposal"], :include => [{
78 :association_name => "user",
toggle raw diff

app/models/project.rb

 
99 :class_name => "Repository"
1010 has_many :repository_clones, :conditions => ["mainline = ?", false],
1111 :class_name => "Repository"
12 has_many :events, :as => :target, :dependent => :destroy
1213
1314 is_indexed :fields => ["title", "description", "slug"],
1415 :concatenate => [
toggle raw diff

app/models/repository.rb

 
99 :order => "status, id desc", :dependent => :destroy
1010 has_many :proposed_merge_requests, :foreign_key => 'source_repository_id',
1111 :class_name => 'MergeRequest', :order => "id desc", :dependent => :destroy
12 has_many :events, :dependent => :destroy
12 has_many :events, :as => :target, :dependent => :destroy
1313
1414 validates_presence_of :user_id, :project_id, :name
1515 validates_format_of :name, :with => /^[a-z0-9_\-]+$/i,
228228 users_by_email = users.inject({}){|hash, user| hash[user.email] = user; hash }
229229 users_by_email
230230 end
231
231
232232 protected
233233 def set_as_mainline_if_first
234234 unless project.repositories.size >= 1
248248 def self.create_hooks(path)
249249 hooks = File.join(GitoriousConfig["repository_base_path"], ".hooks")
250250 Dir.chdir(path) do
251 hooks_base_path = File.expand_path(File.join(File.dirname(__FILE__), "../../data/hooks")) # FIXME: the hooks are in GITORIOUS_ROOT/data/hooks
251 hooks_base_path = File.expand_path("#{RAILS_ROOT}/data/hooks")
252252
253253 if not File.symlink?(hooks)
254254 if not File.exist?(hooks)
toggle raw diff

app/models/user.rb

 
105105 def to_xml(opts = {})
106106 super({:except => [:activation_code, :crypted_password, :remember_token, :remember_token_expires_at, :salt, :ssh_key_id]}.merge(opts))
107107 end
108
108
109 def create_event(action_name, target, data = nil, body = nil)
110 action = Action.find_by_name(action_name)
111 return false if action.nil?
112
113 return events.create(:action_id => action.id, :target => target, :body => body, :data => data, :date => Time.now)
114 end
115
109116 protected
110117 # before filter
111118 def encrypt_password
toggle raw diff

app/views/events/_events.html.erb

 
11<ul class="project_list">
22<% events.reverse_each do |event| -%>
3 <% action, body = action_and_body_for_event(event) %>
34 <li>
4 <% action = "" %>
5 <% body = nil %>
6 <% repo = event.repository %>
7 <% project = repo.project unless repo.nil? %>
8 <% case event.action.name
9 when "create project"
10 action = "<b>created project</b> #{link_to h(project.title), project_path(project)}"
11 body = truncate(project.stripped_description, 100)
12 when "delete project"
13 action = "<b>deleted project</b> #{h(event.ref)}"
14 when "update project"
15 action = "<b>updated project</b> #{link_to h(project.title), project_path(project)}"
16 when "fork project"
17 original_repo = Repository.find_by_id(event.ref.to_i)
18 next if original_repo.nil?
19
20 action = "<b>forked</b> #{link_to h(project.title), project_path(project)}/#{link_to h(original_repo.name), project_repository_url(project, original_repo)} in #{link_to h(repo.name), project_repository_url(project, repo)}"
21 when "commit"
22 action = "<b>commited to</b> #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
23 body = "#{link_to event.ref, project_repository_commit_path(project, repo, event.ref)}<br/>#{event.body}"
24 when "create branch"
25 if event.ref == "master"
26 action = "<b>started development</b> of #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
27 body = event.body
28 else
29 action = "<b>created branch</b> #{link_to h(event.ref), project_repository_tree_path(project, repo, event.ref)} on #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
30 end
31 when "delete branch"
32 action = "<b>deleted branch</b> #{event.ref} on #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
33 when "create tag"
34 action = "<b>tagged</b> #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
35 body = "#{link_to event.ref, project_repository_commit_path(project, repo, event.ref)}<br/>#{event.body}"
36 when "delete tag"
37 action = "<b>deleted tag</b> #{event.ref} on #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
38 when "add committer"
39 committer = User.find_by_id(event.ref.to_i)
40 next if committer.nil?
41 action = "<b>added committer</b> #{link_to committer.login, user_path(committer)} to #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
42 when "remove committer"
43 committer = User.find_by_id(event.ref.to_i)
44 next if committer.nil?
45 action = "<b>removed committer</b> #{link_to committer.login, user_path(committer)} from #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
46 when "comment"
47 action = "<b>commented</b> #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
48 comment = Comment.find_by_id(event.ref.to_i)
49 body = truncate(h(comment.body), 100)
50 when "request merge"
51 request = MergeRequest.find_by_id(event.ref.to_i)
52 next if request.nil?
53 action = "<b>requested merge</b> #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)} to #{link_to h(project.title), project_path(project)}/#{link_to h(request.target_repository.name)}"
54 body = "#{link_to "review", [project, request.target_repository, request]}<br/>#{truncate(h(request.proposal), 100)}"
55 when "resolve merge request"
56 request = MergeRequest.find_by_id(event.ref.to_i)
57 next if request.nil?
58 action = "<b>resolved merge request to </b> [#{request.status_string}] from #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
59 when "update merge request"
60 request = MergeRequest.find_by_id(event.ref.to_i)
61 next if request.nil?
62 action = "<b>updated merge request</b> from #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
63 when "delete merge request"
64 action = "<b>deleted merge request</b> from #{link_to h(project.title), project_path(project)}/#{link_to h(repo.name), project_repository_url(project, repo)}"
65 end -%>
665 <div style="margin: 20px; padding-bottom: 10px;" >
676 <% unless action.empty? %>
687 <%= link_to event.user.login, user_path(event.user) %> <%= action %> <%= time_ago_in_words(event.date) %>
1515 </div>
1616 </li>
1717<% end -%>
18</ul>
19
18</ul>
toggle raw diff

data/hooks/post-receive

 
124124 puts "#{hash[:author]}: #{action_name} #{ref} on #{slug} [#{hash[:date]}]"
125125 puts " #{hash[:message]}"
126126
127 action = Action.find_by_name(action_name)
128 Event.from_action_name(action_name, user, repository, ref, hash[:message])
127 user.create_event(action_name, repository, ref, hash[:message])
129128end
130129
131130puts "=> Thanks! http://#{GitoriousConfig['gitorious_host']}/events"
toggle raw diff

db/migrate/023_create_actions.rb

 
99 Action.create :name => "create project"
1010 Action.create :name => "delete project"
1111 Action.create :name => "update project"
12 Action.create :name => "fork project"
12 Action.create :name => "clone repository"
13 Action.create :name => "delete repository"
1314
1415 # On repository
1516 Action.create :name => "commit"
toggle raw diff

db/migrate/024_create_events.rb

 
22 def self.up
33 create_table :events do |t|
44 t.integer :user_id, :null => false
5 t.integer :repository_id
65 t.integer :action_id, :null => false
7 t.string :ref
6 t.string :data # Additional data
87 t.text :body
98 t.datetime :date, :null => false
9
10 t.integer :target_id
11 t.string :target_type
1012 end
1113
1214 add_index :events, :user_id
1818 drop_table :events
1919 end
2020end
21
toggle raw diff

lib/git_backend.rb

 
3838 protected
3939 def post_create(path)
4040 FileUtils.touch(File.join(path, "git-daemon-export-ok"))
41 execute_command(%Q{chmod +x #{File.join(path, "hooks/post-update")}})
4241 execute_command(%Q{GIT_DIR="#{path}" git-update-server-info})
4342 end
4443
toggle raw diff