| |   |
| 1 | class MergeRequestsController < ApplicationController |
| 2 | before_filter :login_required, :except => [:index, :show] |
| 3 | before_filter :find_project |
| 4 | before_filter :find_repository |
| 5 | before_filter :find_merge_request, :except => [:index, :show, :new, :create] |
| 6 | before_filter :assert_merge_request_ownership, :except => [:index, :show, :new, :create, :resolve] |
| 7 | before_filter :assert_merge_request_resolvable, :only => [:resolve] |
| 8 | |
| 9 | def index |
| 10 | @merge_requests = @repository.merge_requests |
| 11 | @comment_count = @repository.comments.count |
| 12 | #@proposed_merge_requests = @repository.proposed_merge_requests |
| 13 | end |
| 14 | |
| 15 | def show |
| 16 | @merge_request = @repository.merge_requests.find(params[:id]) |
| 17 | @commits = @merge_request.target_repository.git.commit_deltas_from(@merge_request.source_repository.git) |
| 18 | end |
| 19 | |
| 20 | def new |
| 21 | @merge_request = @repository.proposed_merge_requests.new(:user => current_user) |
| 22 | @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id]) |
| 23 | end |
| 24 | |
| 25 | def create |
| 26 | @merge_request = @repository.proposed_merge_requests.new(params[:merge_request]) |
| 27 | @merge_request.user = current_user |
| 28 | if @merge_request.save |
| 29 | flash[:success] = "Your sent a merge request to #{@merge_request.target_repository.name}" |
| 30 | redirect_to project_repository_path(@project, @repository) and return |
| 31 | else |
| 32 | @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id]) |
| 33 | render :action => "new" |
| 34 | end |
| 35 | end |
| 36 | |
| 37 | def resolve |
| 38 | # TODO: put to change status |
| 39 | @merge_request.status = params[:merge_request][:status] |
| 40 | if @merge_request.save |
| 41 | flash[:notice] = "The merge request was marked as #{@merge_request.status_string}" |
| 42 | end |
| 43 | redirect_to [@project, @repository, @merge_request] |
| 44 | end |
| 45 | |
| 46 | def edit |
| 47 | @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id]) |
| 48 | end |
| 49 | |
| 50 | def update |
| 51 | @merge_request.attributes = params[:merge_request] |
| 52 | if @merge_request.save |
| 53 | flash[:success] = "Merge request was updated" |
| 54 | redirect_to [@project, @repository, @merge_request] |
| 55 | else |
| 56 | @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id]) |
| 57 | render :action => "edit" |
| 58 | end |
| 59 | end |
| 60 | |
| 61 | def destroy |
| 62 | @merge_request.destroy |
| 63 | flash[:success] = "Merge request was retracted" |
| 64 | redirect_to project_repository_path(@project, @repository) |
| 65 | end |
| 66 | |
| 67 | protected |
| 68 | def find_repository |
| 69 | @repository = @project.repositories.find_by_name!(params[:repository_id]) |
| 70 | end |
| 71 | |
| 72 | def find_merge_request |
| 73 | @merge_request = @repository.merge_requests.find(params[:id]) |
| 74 | end |
| 75 | |
| 76 | def assert_merge_request_resolvable |
| 77 | unless @merge_request.resolvable_by?(current_user) |
| 78 | respond_to do |format| |
| 79 | flash[:error] = "You're not permitted to resolve this merge request" |
| 80 | format.html { redirect_to([@project, @repository, @merge_request]) } |
| 81 | format.xml { render :text => "You're not permitted to resolve this merge request", :status => :forbidden } |
| 82 | end |
| 83 | return |
| 84 | end |
| 85 | end |
| 86 | |
| 87 | def assert_merge_request_ownership |
| 88 | if @merge_request.user != current_user |
| 89 | respond_to do |format| |
| 90 | flash[:error] = "You're not the owner of this merge request" |
| 91 | format.html { redirect_to([@project, @repository]) } |
| 92 | format.xml { render :text => "You're not the owner of this merge request", :status => :forbidden } |
| 93 | end |
| 94 | return |
| 95 | end |
| 96 | end |
| 97 | |
| 98 | end |
| toggle raw diff |
--- /dev/null
+++ b/app/controllers/merge_requests_controller.rb
@@ -0,0 +1,98 @@
+class MergeRequestsController < ApplicationController
+ before_filter :login_required, :except => [:index, :show]
+ before_filter :find_project
+ before_filter :find_repository
+ before_filter :find_merge_request, :except => [:index, :show, :new, :create]
+ before_filter :assert_merge_request_ownership, :except => [:index, :show, :new, :create, :resolve]
+ before_filter :assert_merge_request_resolvable, :only => [:resolve]
+
+ def index
+ @merge_requests = @repository.merge_requests
+ @comment_count = @repository.comments.count
+ #@proposed_merge_requests = @repository.proposed_merge_requests
+ end
+
+ def show
+ @merge_request = @repository.merge_requests.find(params[:id])
+ @commits = @merge_request.target_repository.git.commit_deltas_from(@merge_request.source_repository.git)
+ end
+
+ def new
+ @merge_request = @repository.proposed_merge_requests.new(:user => current_user)
+ @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id])
+ end
+
+ def create
+ @merge_request = @repository.proposed_merge_requests.new(params[:merge_request])
+ @merge_request.user = current_user
+ if @merge_request.save
+ flash[:success] = "Your sent a merge request to #{@merge_request.target_repository.name}"
+ redirect_to project_repository_path(@project, @repository) and return
+ else
+ @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id])
+ render :action => "new"
+ end
+ end
+
+ def resolve
+ # TODO: put to change status
+ @merge_request.status = params[:merge_request][:status]
+ if @merge_request.save
+ flash[:notice] = "The merge request was marked as #{@merge_request.status_string}"
+ end
+ redirect_to [@project, @repository, @merge_request]
+ end
+
+ def edit
+ @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id])
+ end
+
+ def update
+ @merge_request.attributes = params[:merge_request]
+ if @merge_request.save
+ flash[:success] = "Merge request was updated"
+ redirect_to [@project, @repository, @merge_request]
+ else
+ @repositories = @project.repositories.find(:all, :conditions => ["id != ?", @repository.id])
+ render :action => "edit"
+ end
+ end
+
+ def destroy
+ @merge_request.destroy
+ flash[:success] = "Merge request was retracted"
+ redirect_to project_repository_path(@project, @repository)
+ end
+
+ protected
+ def find_repository
+ @repository = @project.repositories.find_by_name!(params[:repository_id])
+ end
+
+ def find_merge_request
+ @merge_request = @repository.merge_requests.find(params[:id])
+ end
+
+ def assert_merge_request_resolvable
+ unless @merge_request.resolvable_by?(current_user)
+ respond_to do |format|
+ flash[:error] = "You're not permitted to resolve this merge request"
+ format.html { redirect_to([@project, @repository, @merge_request]) }
+ format.xml { render :text => "You're not permitted to resolve this merge request", :status => :forbidden }
+ end
+ return
+ end
+ end
+
+ def assert_merge_request_ownership
+ if @merge_request.user != current_user
+ respond_to do |format|
+ flash[:error] = "You're not the owner of this merge request"
+ format.html { redirect_to([@project, @repository]) }
+ format.xml { render :text => "You're not the owner of this merge request", :status => :forbidden }
+ end
+ return
+ end
+ end
+
+end |
| |   |
| 1 | class MergeRequest < ActiveRecord::Base |
| 2 | belongs_to :user |
| 3 | belongs_to :source_repository, :class_name => 'Repository' |
| 4 | belongs_to :target_repository, :class_name => 'Repository' |
| 5 | |
| 6 | attr_protected :user, :status |
| 7 | |
| 8 | STATUS_OPEN = 0 |
| 9 | STATUS_MERGED = 1 |
| 10 | STATUS_REJECTED = 2 |
| 11 | |
| 12 | validates_presence_of :user, :source_repository, :target_repository |
| 13 | attr_protected :user_id |
| 14 | |
| 15 | def self.statuses |
| 16 | { "Open" => STATUS_OPEN, "Merged" => STATUS_MERGED, "Rejected" => STATUS_REJECTED } |
| 17 | end |
| 18 | |
| 19 | def self.count_open |
| 20 | count(:all, :conditions => {:status => STATUS_OPEN}) |
| 21 | end |
| 22 | |
| 23 | def status_string |
| 24 | self.class.statuses.invert[status].downcase |
| 25 | end |
| 26 | |
| 27 | def open? |
| 28 | status == STATUS_OPEN |
| 29 | end |
| 30 | |
| 31 | def merged? |
| 32 | status == STATUS_MERGED |
| 33 | end |
| 34 | |
| 35 | def rejected? |
| 36 | status == STATUS_REJECTED |
| 37 | end |
| 38 | |
| 39 | def resolvable_by?(candidate) |
| 40 | candidate == target_repository.user |
| 41 | end |
| 42 | end |
| toggle raw diff |
--- /dev/null
+++ b/app/models/merge_request.rb
@@ -0,0 +1,42 @@
+class MergeRequest < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :source_repository, :class_name => 'Repository'
+ belongs_to :target_repository, :class_name => 'Repository'
+
+ attr_protected :user, :status
+
+ STATUS_OPEN = 0
+ STATUS_MERGED = 1
+ STATUS_REJECTED = 2
+
+ validates_presence_of :user, :source_repository, :target_repository
+ attr_protected :user_id
+
+ def self.statuses
+ { "Open" => STATUS_OPEN, "Merged" => STATUS_MERGED, "Rejected" => STATUS_REJECTED }
+ end
+
+ def self.count_open
+ count(:all, :conditions => {:status => STATUS_OPEN})
+ end
+
+ def status_string
+ self.class.statuses.invert[status].downcase
+ end
+
+ def open?
+ status == STATUS_OPEN
+ end
+
+ def merged?
+ status == STATUS_MERGED
+ end
+
+ def rejected?
+ status == STATUS_REJECTED
+ end
+
+ def resolvable_by?(candidate)
+ candidate == target_repository.user
+ end
+end |
| |   |
| 5 | 5 | has_many :committerships, :dependent => :destroy |
| 6 | 6 | has_many :committers, :through => :committerships, :source => :user |
| 7 | 7 | has_many :comments, :dependent => :destroy |
| 8 | has_many :merge_requests, :foreign_key => 'target_repository_id', :order => "status, id desc" |
| 9 | has_many :proposed_merge_requests, :foreign_key => 'source_repository_id', |
| 10 | :class_name => 'MergeRequest', :order => "id desc" |
| 8 | 11 | |
| 9 | 12 | validates_presence_of :user_id, :project_id, :name |
| 10 | 13 | validates_format_of :name, :with => /^[a-z0-9_\-]+$/i, |
| toggle raw diff |
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -5,6 +5,9 @@ class Repository < ActiveRecord::Base
has_many :committerships, :dependent => :destroy
has_many :committers, :through => :committerships, :source => :user
has_many :comments, :dependent => :destroy
+ has_many :merge_requests, :foreign_key => 'target_repository_id', :order => "status, id desc"
+ has_many :proposed_merge_requests, :foreign_key => 'source_repository_id',
+ :class_name => 'MergeRequest', :order => "id desc"
validates_presence_of :user_id, :project_id, :name
validates_format_of :name, :with => /^[a-z0-9_\-]+$/i, |
| |   |
| 1 | <% no_link ||= false -%> |
| 2 | |
| 3 | <div class="merge_request_summary <%= merge_request.status_string -%>"> |
| 4 | <p class="status">[<span><%= merge_request.status_string -%></span>]</p> |
| 5 | <h5> |
| 6 | <%= link_to h(merge_request.source_repository.name), [@project, merge_request.source_repository] -%> |
| 7 | has requested a merge with <%= link_to h(merge_request.target_repository.name), [@project, merge_request.target_repository] -%>: |
| 8 | </h5> |
| 9 | <div class="proposal"><%= sanitize(simple_format(merge_request.proposal)) -%></div> |
| 10 | <p class="byline"> |
| 11 | <%= link_to(h(merge_request.user.login), merge_request.user) -%> | |
| 12 | <%= merge_request.created_at.to_s(:short) -%> |
| 13 | <% unless no_link -%> |
| 14 | | <strong><%= link_to "Review merge request →", [@project, @repository, merge_request] -%></strong> |
| 15 | <% end -%> |
| 16 | </p> |
| 17 | </div> |
| toggle raw diff |
--- /dev/null
+++ b/app/views/merge_requests/_merge_request.html.erb
@@ -0,0 +1,17 @@
+<% no_link ||= false -%>
+
+<div class="merge_request_summary <%= merge_request.status_string -%>">
+ <p class="status">[<span><%= merge_request.status_string -%></span>]</p>
+ <h5>
+ <%= link_to h(merge_request.source_repository.name), [@project, merge_request.source_repository] -%>
+ has requested a merge with <%= link_to h(merge_request.target_repository.name), [@project, merge_request.target_repository] -%>:
+ </h5>
+ <div class="proposal"><%= sanitize(simple_format(merge_request.proposal)) -%></div>
+ <p class="byline">
+ <%= link_to(h(merge_request.user.login), merge_request.user) -%> |
+ <%= merge_request.created_at.to_s(:short) -%>
+ <% unless no_link -%>
+ | <strong><%= link_to "Review merge request →", [@project, @repository, merge_request] -%></strong>
+ <% end -%>
+ </p>
+</div>
\ No newline at end of file |
| |   |
| 1 | <% @page_title = "Merge requests in #{h(@repository.name)}" -%> |
| 2 | <h1> |
| 3 | Merge requests in <%=h @repository.name -%> |
| 4 | </h1> |
| 5 | |
| 6 | <%= render :partial => "repositories/infobox" -%> |
| 7 | |
| 8 | <p class="hint"> |
| 9 | A "merge request" is a notification from one repository to another that |
| 10 | would like their changes to be merged upstream. |
| 11 | </p> |
| 12 | |
| 13 | <ul class="tab_menu"> |
| 14 | <li><%= link_to "Recent commits", project_repository_path(@project, @repository) -%></li> |
| 15 | <li><%= link_to "comments (#{@comment_count})", |
| 16 | project_repository_comments_path(@project, @repository) -%></li> |
| 17 | <li class="selected">merge requests(<%= @merge_requests.select{|mr| mr.open? }.size -%>)</li> |
| 18 | </ul> |
| 19 | |
| 20 | <% if @merge_requests.blank? -%> |
| 21 | <p> |
| 22 | <em>No merge requests yet</em><br /> |
| 23 | </p> |
| 24 | <% else -%> |
| 25 | <%= render :partial => @merge_requests -%> |
| 26 | <% end -%> |
| toggle raw diff |
--- /dev/null
+++ b/app/views/merge_requests/index.html.erb
@@ -0,0 +1,26 @@
+<% @page_title = "Merge requests in #{h(@repository.name)}" -%>
+<h1>
+ Merge requests in <%=h @repository.name -%>
+</h1>
+
+<%= render :partial => "repositories/infobox" -%>
+
+<p class="hint">
+ A "merge request" is a notification from one repository to another that
+ would like their changes to be merged upstream.
+</p>
+
+<ul class="tab_menu">
+ <li><%= link_to "Recent commits", project_repository_path(@project, @repository) -%></li>
+ <li><%= link_to "comments (#{@comment_count})",
+ project_repository_comments_path(@project, @repository) -%></li>
+ <li class="selected">merge requests(<%= @merge_requests.select{|mr| mr.open? }.size -%>)</li>
+</ul>
+
+<% if @merge_requests.blank? -%>
+ <p>
+ <em>No merge requests yet</em><br />
+ </p>
+<% else -%>
+ <%= render :partial => @merge_requests -%>
+<% end -%> |
| |   |
| 1 | <h1> |
| 2 | Reviewing merge request "<%=h @merge_request.source_repository.name -%>" → |
| 3 | "<%= @merge_request.target_repository.name -%>" |
| 4 | </h1> |
| 5 | |
| 6 | <%= render :partial => @merge_request, :locals => { :no_link => true } -%> |
| 7 | |
| 8 | <% if @merge_request.resolvable_by?(current_user) -%> |
| 9 | <% form_for @merge_request, |
| 10 | :url => resolve_project_repository_merge_request_path(@project, |
| 11 | @repository, @merge_request) do |f| -%> |
| 12 | <p> |
| 13 | <%= f.label :status -%><br /> |
| 14 | <%= f.select :status, MergeRequest.statuses.sort_by{|k,v| v } -%><br /> |
| 15 | <%= f.submit "Update merge request" -%></p> |
| 16 | <% end -%> |
| 17 | |
| 18 | <% if @merge_request.open? -%> |
| 19 | <p>The simplest way to merge in these changes is to simply pull them in with the following command:</p> |
| 20 | <pre>git pull <%= @merge_request.source_repository.clone_url -%></pre> |
| 21 | <% end -%> |
| 22 | <% end -%> |
| 23 | |
| 24 | <% if @merge_request.open? -%> |
| 25 | <h2>Commits that would be merged:</h2> |
| 26 | |
| 27 | <ul class="shortlog"> |
| 28 | <% @commits.each do |commit| -%> |
| 29 | <li><a href=""><%= link_to h(commit.id_abbrev), |
| 30 | project_repository_commit_path(@project, @merge_request.source_repository, commit.id) -%></a> |
| 31 | by <strong><%=h commit.committer.name -%></strong> <%=h time_ago_in_words(commit.committed_date) -%> ago |
| 32 | <div class="commit_message"><%= simple_format(h(commit.message)) -%></div></li> |
| 33 | <% end -%> |
| 34 | </ul> |
| 35 | <% end -%> |
| toggle raw diff |
--- /dev/null
+++ b/app/views/merge_requests/show.html.erb
@@ -0,0 +1,35 @@
+<h1>
+ Reviewing merge request "<%=h @merge_request.source_repository.name -%>" →
+ "<%= @merge_request.target_repository.name -%>"
+</h1>
+
+<%= render :partial => @merge_request, :locals => { :no_link => true } -%>
+
+<% if @merge_request.resolvable_by?(current_user) -%>
+ <% form_for @merge_request,
+ :url => resolve_project_repository_merge_request_path(@project,
+ @repository, @merge_request) do |f| -%>
+ <p>
+ <%= f.label :status -%><br />
+ <%= f.select :status, MergeRequest.statuses.sort_by{|k,v| v } -%><br />
+ <%= f.submit "Update merge request" -%></p>
+ <% end -%>
+
+ <% if @merge_request.open? -%>
+ <p>The simplest way to merge in these changes is to simply pull them in with the following command:</p>
+ <pre>git pull <%= @merge_request.source_repository.clone_url -%></pre>
+ <% end -%>
+<% end -%>
+
+<% if @merge_request.open? -%>
+<h2>Commits that would be merged:</h2>
+
+<ul class="shortlog">
+ <% @commits.each do |commit| -%>
+ <li><a href=""><%= link_to h(commit.id_abbrev),
+ project_repository_commit_path(@project, @merge_request.source_repository, commit.id) -%></a>
+ by <strong><%=h commit.committer.name -%></strong> <%=h time_ago_in_words(commit.committed_date) -%> ago
+ <div class="commit_message"><%= simple_format(h(commit.message)) -%></div></li>
+ <% end -%>
+</ul>
+<% end -%>
\ No newline at end of file |
| |   |
| 7 | 7 | <% end -%> |
| 8 | 8 | <li><strong>Created:</strong> <%= @repository.created_at.to_s(:short) -%></li> |
| 9 | 9 | <li> |
| 10 | | <strong>Clone url:</strong> <code><%=h @repository.clone_url -%></code> |
| 10 | <strong>Public clone url:</strong> <code><%=h @repository.clone_url -%></code> |
| 11 | 11 | <small><%= link_to_function "More info…", "$('detailed_clone_info').toggle()" -%></small> |
| 12 | 12 | <div id="detailed_clone_info" class="info_hint" style="display:none"> |
| 13 | 13 | You can clone this repository with the following command:<br /> |
| 14 | | <% if logged_in? && current_user.can_write_to?(@repository) -%> |
| 15 | | <code>git clone <%= @repository.push_url -%></code> |
| 16 | | <% else -%> |
| 17 | | <code>git clone <%= @repository.clone_url -%></code> |
| 18 | | <% end -%> |
| 14 | <code>git clone <%= @repository.clone_url -%></code> |
| 19 | 15 | </div> |
| 20 | 16 | </li> |
| 21 | 17 | <li> |
| … | … | |
| 19 | 19 | <small><%= link_to_function "More info…", "$('detailed_http_clone_info').toggle()" -%></small> |
| 20 | 20 | <div id="detailed_http_clone_info" class="info_hint" style="display:none"> |
| 21 | 21 | You can clone this repository with the following command:<br /> |
| 22 | | <code>git clone <%= @repository.http_clone_url -%></code> |
| 22 | <code>git clone <%= @repository.http_clone_url -%></code><br /> |
| 23 | <small>(note that cloning over HTTP is slightly slower, but useful |
| 24 | if you're behind a firewall)</small> |
| 23 | 25 | </div> |
| 24 | 26 | </li> |
| 25 | 27 | <% if logged_in? && current_user.can_write_to?(@repository) -%> |
| … | … | |
| 29 | 29 | <strong>Push url:</strong> <code><%=h @repository.push_url -%></code> |
| 30 | 30 | <small><%= link_to_function "More info…", "$('detailed_push_info').toggle()" -%></small> |
| 31 | 31 | <div id="detailed_push_info" class="info_hint" style="display:none"> |
| 32 | | You can run "<code>git push git@gitorious.org:tumbline/mainline.git</code>", or |
| 33 | | you can setup a remote by doing the following: |
| 32 | You can run "<code>git push <%= @repository.push_url %></code>", or |
| 33 | you can setup a remote by doing the following: |
| 34 | 34 | <pre> |
| 35 | 35 | git remote add origin <%= @repository.push_url %> |
| 36 | 36 | # to push the master branch to the origin remote we added above: |
| toggle raw diff |
--- a/app/views/repositories/_infobox.html.erb
+++ b/app/views/repositories/_infobox.html.erb
@@ -7,15 +7,11 @@
<% end -%>
<li><strong>Created:</strong> <%= @repository.created_at.to_s(:short) -%></li>
<li>
- <strong>Clone url:</strong> <code><%=h @repository.clone_url -%></code>
+ <strong>Public clone url:</strong> <code><%=h @repository.clone_url -%></code>
<small><%= link_to_function "More info…", "$('detailed_clone_info').toggle()" -%></small>
<div id="detailed_clone_info" class="info_hint" style="display:none">
You can clone this repository with the following command:<br />
- <% if logged_in? && current_user.can_write_to?(@repository) -%>
- <code>git clone <%= @repository.push_url -%></code>
- <% else -%>
- <code>git clone <%= @repository.clone_url -%></code>
- <% end -%>
+ <code>git clone <%= @repository.clone_url -%></code>
</div>
</li>
<li>
@@ -23,7 +19,9 @@
<small><%= link_to_function "More info…", "$('detailed_http_clone_info').toggle()" -%></small>
<div id="detailed_http_clone_info" class="info_hint" style="display:none">
You can clone this repository with the following command:<br />
- <code>git clone <%= @repository.http_clone_url -%></code>
+ <code>git clone <%= @repository.http_clone_url -%></code><br />
+ <small>(note that cloning over HTTP is slightly slower, but useful
+ if you're behind a firewall)</small>
</div>
</li>
<% if logged_in? && current_user.can_write_to?(@repository) -%>
@@ -31,8 +29,8 @@
<strong>Push url:</strong> <code><%=h @repository.push_url -%></code>
<small><%= link_to_function "More info…", "$('detailed_push_info').toggle()" -%></small>
<div id="detailed_push_info" class="info_hint" style="display:none">
-You can run "<code>git push git@gitorious.org:tumbline/mainline.git</code>", or
-you can setup a remote by doing the following:
+ You can run "<code>git push <%= @repository.push_url %></code>", or
+ you can setup a remote by doing the following:
<pre>
git remote add origin <%= @repository.push_url %>
# to push the master branch to the origin remote we added above: |
| |   |
| 9 | 9 | |
| 10 | 10 | <ul class="tab_menu"> |
| 11 | 11 | <li class="selected">Recent commits</li> |
| 12 | | <li><%= link_to "comments (#{@comment_count})", project_repository_comments_path(@project, @repository) -%></li> |
| 12 | <li><%= link_to "comments (#{@comment_count})", |
| 13 | project_repository_comments_path(@project, @repository) -%></li> |
| 14 | <li><%= link_to "merge requests(#{@merge_request_count})", |
| 15 | project_repository_merge_requests_path(@project, @repository) -%></li> |
| 13 | 16 | </ul> |
| 14 | 17 | |
| 15 | 18 | <h2>Recent commits</h2> |
| … | … | |
| 36 | 36 | <% content_for :sidebar do -%> |
| 37 | 37 | <ul class="links"> |
| 38 | 38 | <% if @repository.ready? -%> |
| 39 | | <li><%= link_to "Clone this repository", new_project_repository_path(@project, @repository) -%></li> |
| 39 | <li><%= link_to "Clone repository", new_project_repository_path(@project, @repository) -%></li> |
| 40 | 40 | <% end -%> |
| 41 | 41 | <% if @repository.user == current_user -%> |
| 42 | <li><%= link_to "Request merge", new_project_repository_merge_request_path(@project, @repository) -%></li> |
| 42 | 43 | <li><%= link_to "Add committer", |
| 43 | 44 | { :controller => "committers", :action => "new", :project_id => @project, |
| 44 | 45 | :repository_id => @repository } -%></li> |
| toggle raw diff |
--- a/app/views/repositories/show.html.erb
+++ b/app/views/repositories/show.html.erb
@@ -9,7 +9,10 @@
<ul class="tab_menu">
<li class="selected">Recent commits</li>
- <li><%= link_to "comments (#{@comment_count})", project_repository_comments_path(@project, @repository) -%></li>
+ <li><%= link_to "comments (#{@comment_count})",
+ project_repository_comments_path(@project, @repository) -%></li>
+ <li><%= link_to "merge requests(#{@merge_request_count})",
+ project_repository_merge_requests_path(@project, @repository) -%></li>
</ul>
<h2>Recent commits</h2>
@@ -33,9 +36,10 @@
<% content_for :sidebar do -%>
<ul class="links">
<% if @repository.ready? -%>
- <li><%= link_to "Clone this repository", new_project_repository_path(@project, @repository) -%></li>
+ <li><%= link_to "Clone repository", new_project_repository_path(@project, @repository) -%></li>
<% end -%>
<% if @repository.user == current_user -%>
+ <li><%= link_to "Request merge", new_project_repository_merge_request_path(@project, @repository) -%></li>
<li><%= link_to "Add committer",
{ :controller => "committers", :action => "new", :project_id => @project,
:repository_id => @repository } -%></li> |
| |   |
| 1 | class CreateMergeRequests < ActiveRecord::Migration |
| 2 | def self.up |
| 3 | create_table :merge_requests do |t| |
| 4 | t.integer :user_id |
| 5 | t.integer :source_repository_id |
| 6 | t.integer :target_repository_id |
| 7 | t.text :proposal |
| 8 | t.string :sha_snapshot |
| 9 | t.integer :status, :default => 0 |
| 10 | t.timestamps |
| 11 | end |
| 12 | add_index :merge_requests, :user_id |
| 13 | add_index :merge_requests, :source_repository_id |
| 14 | add_index :merge_requests, :target_repository_id |
| 15 | add_index :merge_requests, :status |
| 16 | end |
| 17 | |
| 18 | def self.down |
| 19 | drop_table :merge_requests |
| 20 | end |
| 21 | end |
| toggle raw diff |
--- /dev/null
+++ b/db/migrate/021_create_merge_requests.rb
@@ -0,0 +1,21 @@
+class CreateMergeRequests < ActiveRecord::Migration
+ def self.up
+ create_table :merge_requests do |t|
+ t.integer :user_id
+ t.integer :source_repository_id
+ t.integer :target_repository_id
+ t.text :proposal
+ t.string :sha_snapshot
+ t.integer :status, :default => 0
+ t.timestamps
+ end
+ add_index :merge_requests, :user_id
+ add_index :merge_requests, :source_repository_id
+ add_index :merge_requests, :target_repository_id
+ add_index :merge_requests, :status
+ end
+
+ def self.down
+ drop_table :merge_requests
+ end
+end |
| |   |
| 9 | 9 | # |
| 10 | 10 | # It's strongly recommended to check this file into your version control system. |
| 11 | 11 | |
| 12 | | ActiveRecord::Schema.define(:version => 20) do |
| 12 | ActiveRecord::Schema.define(:version => 21) do |
| 13 | 13 | |
| 14 | 14 | create_table "comments", :force => true do |t| |
| 15 | 15 | t.integer "user_id", :null => false |
| … | … | |
| 37 | 37 | add_index "committerships", ["repository_id"], :name => "index_permissions_on_repository_id" |
| 38 | 38 | add_index "committerships", ["user_id"], :name => "index_permissions_on_user_id" |
| 39 | 39 | |
| 40 | create_table "merge_requests", :force => true do |t| |
| 41 | t.integer "user_id" |
| 42 | t.integer "source_repository_id" |
| 43 | t.integer "target_repository_id" |
| 44 | t.text "proposal" |
| 45 | t.string "sha_snapshot" |
| 46 | t.integer "status", :default => 0 |
| 47 | t.datetime "created_at" |
| 48 | t.datetime "updated_at" |
| 49 | end |
| 50 | |
| 51 | add_index "merge_requests", ["user_id"], :name => "index_merge_requests_on_user_id" |
| 52 | add_index "merge_requests", ["source_repository_id"], :name => "index_merge_requests_on_source_repository_id" |
| 53 | add_index "merge_requests", ["target_repository_id"], :name => "index_merge_requests_on_target_repository_id" |
| 54 | add_index "merge_requests", ["status"], :name => "index_merge_requests_on_status" |
| 55 | |
| 40 | 56 | create_table "projects", :force => true do |t| |
| 41 | 57 | t.string "title" |
| 42 | 58 | t.text "description" |
| toggle raw diff |
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -9,7 +9,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20) do
+ActiveRecord::Schema.define(:version => 21) do
create_table "comments", :force => true do |t|
t.integer "user_id", :null => false
@@ -37,6 +37,22 @@ ActiveRecord::Schema.define(:version => 20) do
add_index "committerships", ["repository_id"], :name => "index_permissions_on_repository_id"
add_index "committerships", ["user_id"], :name => "index_permissions_on_user_id"
+ create_table "merge_requests", :force => true do |t|
+ t.integer "user_id"
+ t.integer "source_repository_id"
+ t.integer "target_repository_id"
+ t.text "proposal"
+ t.string "sha_snapshot"
+ t.integer "status", :default => 0
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ add_index "merge_requests", ["user_id"], :name => "index_merge_requests_on_user_id"
+ add_index "merge_requests", ["source_repository_id"], :name => "index_merge_requests_on_source_repository_id"
+ add_index "merge_requests", ["target_repository_id"], :name => "index_merge_requests_on_target_repository_id"
+ add_index "merge_requests", ["status"], :name => "index_merge_requests_on_status"
+
create_table "projects", :force => true do |t|
t.string "title"
t.text "description" |