Commit 422e43989b0e35f3773c7e91f3d04c0baec0fb14

Authored by Dmitriy Zaporozhets
1 parent 6c416aaa

Compare view for commits

app/assets/stylesheets/commits.css.scss
... ... @@ -134,3 +134,10 @@ ul.bordered-list li:last-child { border:none }
134 134 margin:2px;
135 135 }
136 136 }
  137 +
  138 +.project-refs-form.commit-refs-form .chzn-container {
  139 + position: relative;
  140 + top: 0;
  141 + left: 0;
  142 + margin-right: 10px;
  143 +}
... ...
app/controllers/commits_controller.rb
... ... @@ -9,6 +9,7 @@ class CommitsController < ApplicationController
9 9 before_filter :authorize_read_project!
10 10 before_filter :require_non_empty_project
11 11 before_filter :load_refs, :only => :index # load @branch, @tag & @ref
  12 + before_filter :render_full_content
12 13  
13 14 def index
14 15 @repo = project.repo
... ... @@ -29,11 +30,29 @@ class CommitsController < ApplicationController
29 30  
30 31 @line_notes = project.commit_line_notes(@commit)
31 32  
32   - render_full_content
33   -
34 33 respond_to do |format|
35 34 format.html
36 35 format.js { respond_with_notes }
37 36 end
38 37 end
  38 +
  39 + def compare
  40 + first = project.commit(params[:to])
  41 + last = project.commit(params[:from])
  42 +
  43 + @diffs = []
  44 + @commits = []
  45 + @line_notes = []
  46 +
  47 + if first && last
  48 + commits = [first, last].sort_by(&:created_at)
  49 + younger = commits.first
  50 + older = commits.last
  51 +
  52 +
  53 + @commits = project.repo.commits_between(younger.id, older.id).map {|c| Commit.new(c)}
  54 + @diffs = project.repo.diff(younger.id, older.id) rescue []
  55 + @commit = older
  56 + end
  57 + end
39 58 end
... ...
app/views/commits/_commit.html.haml 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +%li.entry
  2 + = link_to project_commit_path(@project, :id => commit.id) do
  3 + %div
  4 + %strong
  5 + = truncate commit.id.to_s, :length => 10
  6 + –
  7 + = image_tag gravatar_icon(commit.author_email), :class => "", :width => 16
  8 + = truncate(commit.safe_message, :length => 50)
  9 +
  10 + %span.right.cgray
  11 + = time_ago_in_words(commit.committed_date)
  12 + ago
  13 +
... ...
app/views/commits/_commits.html.haml
... ... @@ -3,17 +3,4 @@
3 3 .day-commits-table
4 4 %h5.underlined= day.stamp("28 Aug, 2010")
5 5 %br
6   - %ul.unstyled
7   - - commits.each do |commit|
8   - %li.entry
9   - = link_to project_commit_path(@project, :id => commit.id) do
10   - %div
11   - %strong
12   - = truncate commit.id.to_s, :length => 10
13   - –
14   - = image_tag gravatar_icon(commit.author_email), :class => "", :width => 16
15   - = truncate(commit.safe_message, :length => 50)
16   -
17   - %span.right.cgray
18   - = time_ago_in_words(commit.committed_date)
19   - ago
  6 + %ul.unstyled= render commits
... ...
app/views/commits/_diff.html.haml
... ... @@ -1,24 +0,0 @@
1   -.file_stats
2   - = render "commits/diff_head", :diffs => @commit.diffs
3   -
4   -- @commit.diffs.each_with_index do |diff, i|
5   - - next if diff.diff.empty?
6   - - file = (@commit.tree / diff.b_path)
7   - - next unless file
8   - .diff_file
9   - .diff_file_header
10   - - if diff.deleted_file
11   - %strong{:id => "#{diff.b_path}"}= diff.a_path
12   - - else
13   - = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do
14   - %strong{:id => "#{diff.b_path}"}= diff.b_path
15   - %br/
16   - .diff_file_content
17   - - if file.text?
18   - = render :partial => "commits/text_file", :locals => { :diff => diff, :index => i }
19   - - elsif file.image?
20   - .diff_file_content_image
21   - %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
22   - - else
23   - %p
24   - %center No preview for this file type
app/views/commits/_diffs.html.haml 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +.file_stats
  2 + = render "commits/diff_head", :diffs => diffs
  3 +
  4 +- diffs.each_with_index do |diff, i|
  5 + - next if diff.diff.empty?
  6 + - file = (@commit.tree / diff.b_path)
  7 + - next unless file
  8 + .diff_file
  9 + .diff_file_header
  10 + - if diff.deleted_file
  11 + %strong{:id => "#{diff.b_path}"}= diff.a_path
  12 + - else
  13 + = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do
  14 + %strong{:id => "#{diff.b_path}"}= diff.b_path
  15 + %br/
  16 + .diff_file_content
  17 + - if file.text?
  18 + = render :partial => "commits/text_file", :locals => { :diff => diff, :index => i }
  19 + - elsif file.image?
  20 + .diff_file_content_image
  21 + %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
  22 + - else
  23 + %p
  24 + %center No preview for this file type
  25 +
... ...
app/views/commits/_head.html.haml 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +%ul.tabs
  2 + %li
  3 + = form_tag switch_project_refs_path(@project), :method => :get, :class => "project-refs-form commit-refs-form" do
  4 + = select_tag "ref", grouped_options_refs, :onchange => "$(this.form).trigger('submit');", :class => "project-refs-select"
  5 + = hidden_field_tag :destination, "commits"
  6 +
  7 + %li{:class => "#{'active' if current_page?(project_commits_path(@project)) }"}
  8 + = link_to project_commits_path(@project) do
  9 + %span
  10 + Commits
  11 + %li{:class => "#{'active' if current_page?(compare_project_commits_path(@project)) }"}
  12 + = link_to compare_project_commits_path(@project) do
  13 + %span
  14 + Compare
  15 +
  16 +
  17 +
  18 +
  19 +:javascript
  20 + $(function(){
  21 + $('.project-refs-select').chosen();
  22 + });
... ...
app/views/commits/compare.html.haml 0 → 100644
... ... @@ -0,0 +1,49 @@
  1 += render "head"
  2 +
  3 +%h3
  4 + Compare View
  5 +%hr
  6 +
  7 +%div
  8 + %p
  9 + Fill input field with commit id like
  10 + %code '4eedf23'
  11 + or branch/tag name like
  12 + %code master
  13 + & press compare button for commits list, code diff.
  14 +
  15 + %br
  16 +
  17 + = form_tag compare_project_commits_path(@project), :method => :get do
  18 + .clearfix
  19 + = text_field_tag :from, params[:from], :placeholder => "master", :class => "xlarge"
  20 + = "..."
  21 + = text_field_tag :to, params[:to], :placeholder => "aa8b4ef", :class => "xlarge"
  22 + .actions
  23 + = submit_tag "Compare", :class => "btn primary"
  24 +
  25 +
  26 +- unless @commits.empty?
  27 + %h4 Commits
  28 + %ul.unstyled= render @commits
  29 +
  30 +- unless @diffs.empty?
  31 + %h4 Diff
  32 + = render "commits/diffs", :diffs => @diffs
  33 +
  34 +
  35 +:javascript
  36 + $(function() {
  37 + var availableTags = #{@project.heads.map(&:name).to_json};
  38 +
  39 + $( "#from" ).autocomplete({
  40 + source: availableTags,
  41 + minLength: 1
  42 + });
  43 +
  44 + $( "#to" ).autocomplete({
  45 + source: availableTags,
  46 + minLength: 1
  47 + });
  48 + });
  49 +
... ...
app/views/commits/index.html.haml
  1 += render "head"
1 2 %h3
2 3 Commits
3 4 - if current_user.private_token
4 5 %span.rss-icon
5 6 = link_to project_commits_path(@project, :atom, { :private_token => current_user.private_token, :ref => @ref }) do
6 7 = image_tag "Rss-UI.PNG", :width => 22, :title => "feed"
7   - = form_tag switch_project_refs_path(@project), :method => :get, :class => "project-refs-form right" do
8   - = select_tag "ref", grouped_options_refs, :onchange => "$(this.form).trigger('submit');", :class => "project-refs-select"
9   - = hidden_field_tag :destination, "commits"
10 8 %hr
11 9  
12 10 - if params[:path]
... ... @@ -31,7 +29,3 @@
31 29 CommitsList.init("#{@ref}", 20);
32 30 });
33 31  
34   -:javascript
35   - $(function(){
36   - $('.project-refs-select').chosen();
37   - });
... ...
app/views/commits/show.html.haml
... ... @@ -19,7 +19,7 @@
19 19 .clear
20 20 %br
21 21  
22   -= render "commits/diff"
  22 += render "commits/diffs", :diffs => @commit.diffs
23 23 = render "notes/notes"
24 24 = render "notes/per_line_form"
25 25  
... ...
app/views/merge_requests/_commits.html.haml
1 1 - if @commits.size > 0
2 2 .merge-request-commits
3   - - @commits.each do |commit|
4   - .entry
5   - = link_to project_commit_path(@project, :id => commit.id) do
6   - %strong
7   - = truncate(commit.id.to_s, :length => 10)
8   - = image_tag gravatar_icon(commit.author_email), :class => "", :width => 16
9   - %span= truncate(commit.safe_message, :length => 40)
10   - %span.right
11   - = time_ago_in_words(commit.committed_date)
12   - ago
  3 + %ul.unstyled= render @commits
13 4  
14 5 - if @commits.empty?
15 6 %p.cgray Nothing to merge
... ...
app/views/merge_requests/_diffs.html.haml
1   -.file_stats
2   - = render "commits/diff_head", :diffs => @diffs
3   -- @diffs.each_with_index do |diff, i|
4   - - next if diff.diff.empty?
5   - - file = (@commit.tree / diff.b_path)
6   - - next unless file
7   - .diff_file
8   - .diff_file_header
9   - - if diff.deleted_file
10   - %strong{:id => "#{diff.b_path}"}= diff.a_path
11   - - else
12   - = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do
13   - %strong{:id => "#{diff.b_path}"}= diff.b_path
14   - %br/
15   - .diff_file_content
16   - - if file.text?
17   - = render :partial => "commits/text_file", :locals => { :diff => diff, :index => i }
18   - - elsif file.image?
19   - .diff_file_content_image
20   - %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
21   - - else
22   - %p
23   - %center No preview for this file type
24   -
  1 += render "commits/diffs", :diffs => @diffs
25 2 - if @diffs.empty?
26 3 %p.cgray Nothing to merge
... ...
config/routes.rb
... ... @@ -96,7 +96,11 @@ Gitlab::Application.routes.draw do
96 96 get :test
97 97 end
98 98 end
99   - resources :commits
  99 + resources :commits do
  100 + collection do
  101 + get :compare
  102 + end
  103 + end
100 104 resources :team_members
101 105 resources :issues do
102 106 collection do
... ...
spec/requests/commits_spec.rb
... ... @@ -55,4 +55,14 @@ describe "Commits" do
55 55 current_path.should == project_commit_path(project, commit.id)
56 56 end
57 57 end
  58 +
  59 + describe "GET /commits/compare" do
  60 + before do
  61 + visit compare_project_commits_path(project)
  62 + end
  63 +
  64 + it "should have valid path" do
  65 + current_path.should == compare_project_commits_path(project)
  66 + end
  67 + end
58 68 end
... ...