diff options
-rw-r--r-- | app/views/attachments/diff.html.erb | 2 | ||||
-rw-r--r-- | app/views/common/_diff.html.erb | 3 | ||||
-rw-r--r-- | app/views/repositories/diff.html.erb | 2 | ||||
-rw-r--r-- | lib/redmine/unified_diff.rb | 29 | ||||
-rw-r--r-- | test/functional/repositories_git_controller_test.rb | 10 |
5 files changed, 37 insertions, 9 deletions
diff --git a/app/views/attachments/diff.html.erb b/app/views/attachments/diff.html.erb index 5359d4eea..f429ba3f8 100644 --- a/app/views/attachments/diff.html.erb +++ b/app/views/attachments/diff.html.erb @@ -15,7 +15,7 @@ :onchange => "if (this.value != '') {this.form.submit()}" %> <% end %> </p> -<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type} %> +<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type, :diff_style => nil} %> <% html_title @attachment.filename %> diff --git a/app/views/common/_diff.html.erb b/app/views/common/_diff.html.erb index cf99967f7..8600164c0 100644 --- a/app/views/common/_diff.html.erb +++ b/app/views/common/_diff.html.erb @@ -1,6 +1,7 @@ <% diff = Redmine::UnifiedDiff.new( diff, :type => diff_type, - :max_lines => Setting.diff_max_lines_displayed.to_i) -%> + :max_lines => Setting.diff_max_lines_displayed.to_i, + :style => diff_style) -%> <% diff.each do |table_file| -%> <div class="autoscroll"> diff --git a/app/views/repositories/diff.html.erb b/app/views/repositories/diff.html.erb index ecd19ccf8..050e53552 100644 --- a/app/views/repositories/diff.html.erb +++ b/app/views/repositories/diff.html.erb @@ -14,7 +14,7 @@ <% end %> <% cache(@cache_key) do -%> -<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type} %> +<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type, :diff_style => @repository.class.scm_name} %> <% end -%> <% other_formats_links do |f| %> diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb index b634813bd..69fdaa6fd 100644 --- a/lib/redmine/unified_diff.rb +++ b/lib/redmine/unified_diff.rb @@ -18,15 +18,16 @@ module Redmine # Class used to parse unified diffs class UnifiedDiff < Array - attr_reader :diff_type + attr_reader :diff_type, :diff_style def initialize(diff, options={}) - options.assert_valid_keys(:type, :max_lines) + options.assert_valid_keys(:type, :style, :max_lines) diff = diff.split("\n") if diff.is_a?(String) @diff_type = options[:type] || 'inline' + @diff_style = options[:style] lines = 0 @truncated = false - diff_table = DiffTable.new(@diff_type) + diff_table = DiffTable.new(diff_type, diff_style) diff.each do |line| line_encoding = nil if line.respond_to?(:force_encoding) @@ -39,7 +40,7 @@ module Redmine unless diff_table.add_line line line.force_encoding(line_encoding) if line_encoding self << diff_table if diff_table.length > 0 - diff_table = DiffTable.new(diff_type) + diff_table = DiffTable.new(diff_type, diff_style) end lines += 1 if options[:max_lines] && lines > options[:max_lines] @@ -60,11 +61,13 @@ module Redmine # Initialize with a Diff file and the type of Diff View # The type view must be inline or sbs (side_by_side) - def initialize(type="inline") + def initialize(type="inline", style=nil) @parsing = false @added = 0 @removed = 0 @type = type + @style = style + @file_name = nil end # Function for add a line of this Diff @@ -72,7 +75,7 @@ module Redmine def add_line(line) unless @parsing if line =~ /^(---|\+\+\+) (.*)$/ - @file_name = $2 + self.file_name = $2 elsif line =~ /^@@ (\+|\-)(\d+)(,\d+)? (\+|\-)(\d+)(,\d+)? @@/ @line_num_l = $2.to_i @line_num_r = $5.to_i @@ -112,6 +115,20 @@ module Redmine private + def file_name=(arg) + case @style + when "Git" + if file_name && arg == "/dev/null" + # keep the original file name + else + # remove leading a/ b/ + @file_name = arg.sub(%r{^(a|b)/}, '') + end + else + @file_name = arg + end + end + def diff_for_added_line if @type == 'sbs' && @removed > 0 && @added < @removed self[-(@removed - @added)] diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb index 38a2d5b1e..d8efeee86 100644 --- a/test/functional/repositories_git_controller_test.rb +++ b/test/functional/repositories_git_controller_test.rb @@ -384,6 +384,16 @@ class RepositoriesGitControllerTest < ActionController::TestCase end end + def test_diff_should_show_filenames + get :diff, :id => PRJ_ID, :rev => 'deff712f05a90d96edbd70facc47d944be5897e3', :type => 'inline' + assert_response :success + assert_template 'diff' + # modified file + assert_select 'th.filename', :text => 'sources/watchers_controller.rb' + # deleted file + assert_select 'th.filename', :text => 'test.txt' + end + def test_save_diff_type @request.session[:user_id] = 1 # admin user = User.find(1) |