]> source.dussan.org Git - redmine.git/commitdiff
Fixed that git diff displays deleted files as /dev/null (#11868).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 18 Sep 2012 19:32:58 +0000 (19:32 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 18 Sep 2012 19:32:58 +0000 (19:32 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10424 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/views/attachments/diff.html.erb
app/views/common/_diff.html.erb
app/views/repositories/diff.html.erb
lib/redmine/unified_diff.rb
test/functional/repositories_git_controller_test.rb

index 5359d4eea121118be6adc9aa7f76c14a125a0073..f429ba3f8187d8b1c4c85642ff7f4c69616cca47 100644 (file)
@@ -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 %>
 
index cf99967f759c2ad4dee20185d9ca6dc4b1ff8c75..8600164c06bfb907cc8c0d9dba758cde2c732cbe 100644 (file)
@@ -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">
index ecd19ccf8335243ff6ac71aa945cfcf185cf7265..050e535525435aed0fa09b26cf9da5c1372a25a8 100644 (file)
@@ -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| %>
index b634813bd1a425c839e68b3202a76f015eadc17a..69fdaa6fd8d96e820dfd7d5d593e5c86dd8fd272 100644 (file)
 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)]
index 38a2d5b1e57cda4518a799fc199f08737e4b1625..d8efeee86925fa7ff52702fa3fefe58d90f423e8 100644 (file)
@@ -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)