]> source.dussan.org Git - redmine.git/commitdiff
Fixed: View differences for individual file of a changeset fails if the subversion...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 24 May 2008 17:58:34 +0000 (17:58 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 24 May 2008 17:58:34 +0000 (17:58 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1446 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/change.rb
app/models/repository.rb
app/models/repository/subversion.rb
app/views/repositories/revision.rhtml
test/fixtures/changes.yml
test/functional/repositories_subversion_controller_test.rb

index d14f435a4a4d0c9342f59fd63402a0964a66bf3b..385fe5acbf0ffd420bc20b7312deca6d24e864b3 100644 (file)
@@ -19,4 +19,8 @@ class Change < ActiveRecord::Base
   belongs_to :changeset
   
   validates_presence_of :changeset_id, :action, :path
+  
+  def relative_path
+    changeset.repository.relative_path(path)
+  end
 end
index 8b1f8d0aff6cc12a8bec7c5aed1e6dff9afb2ae4..1ea77f24f003765d84aa1510f1320c0f573492e8 100644 (file)
@@ -64,6 +64,11 @@ class Repository < ActiveRecord::Base
       :order => "committed_on DESC, #{Changeset.table_name}.id DESC").collect(&:changeset)
   end
   
+  # Returns a path relative to the url of the repository
+  def relative_path(path)
+    path
+  end
+  
   def latest_changeset
     @latest_changeset ||= changesets.find(:first)
   end
index 0c2239c433d7fd91efd9773a27e4c1e0e7d93452..3981d6f4c4540a62f27993183d3c2d43f327dfee 100644 (file)
@@ -35,6 +35,11 @@ class Repository::Subversion < Repository
     revisions ? changesets.find_all_by_revision(revisions.collect(&:identifier), :order => "committed_on DESC") : []
   end
   
+  # Returns a path relative to the url of the repository
+  def relative_path(path)
+    path.gsub(Regexp.new("^\/?#{Regexp.escape(relative_url)}"), '')
+  end
+  
   def fetch_changesets
     scm_info = scm.info
     if scm_info
@@ -71,4 +76,14 @@ class Repository::Subversion < Repository
       end
     end
   end
+  
+  private
+  
+  # Returns the relative url of the repository
+  # Eg: root_url = file:///var/svn/foo
+  #     url      = file:///var/svn/foo/bar
+  #     => returns /bar
+  def relative_url
+    @relative_url ||= url.gsub(Regexp.new("^#{Regexp.escape(root_url)}"), '')
+  end
 end
index f1e176669f25af159514bec426eb5c5b3c6b5cb9..2fdf58faf6f7300a102494f98917786657e1037b 100644 (file)
@@ -49,7 +49,7 @@
 <td><div class="square action_<%= change.action %>"></div> <%= change.path %> <%= "(#{change.revision})" unless change.revision.blank?  %></td>
 <td align="right">
 <% if change.action == "M" %>
-<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => without_leading_slash(change.path), :rev => @changeset.revision %>
+<%= link_to l(:label_view_diff), :action => 'diff', :id => @project, :path => without_leading_slash(change.relative_path), :rev => @changeset.revision %>
 <% end %>
 </td>
 </tr>
index 30acbd02d466159a0b96940b9bf8bb982f1b29b9..56d93629600fccebaab9e4d706e54c9c2f96717f 100644 (file)
@@ -13,4 +13,11 @@ changes_002:
   path: /test/some/path/elsewhere/in/the/repo\r
   from_path:\r
   from_revision:\r
+changes_003: \r
+  id: 3\r
+  changeset_id: 101\r
+  action: M\r
+  path: /test/some/path/in/the/repo\r
+  from_path:\r
+  from_revision:\r
   
\ No newline at end of file
index dd56947fc687385990c8f81bf8cd694d5851ad67..bc3f261a051e84c833563458e5f2b4a7a04be19f 100644 (file)
@@ -97,6 +97,32 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase
       assert_equal 'folder', assigns(:entry).name
     end
     
+    def test_revision
+      get :revision, :id => 1, :rev => 2
+      assert_response :success
+      assert_template 'revision'
+      assert_tag :tag => 'tr',
+                 :child => { :tag => 'td', :content => %r{/test/some/path/in/the/repo} },
+                 :child => { :tag => 'td', 
+                             :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/test/some/path/in/the/repo?rev=2' } }
+                           }
+    end
+    
+    def test_revision_with_repository_pointing_to_a_subdirectory
+      r = Project.find(1).repository
+      # Changes repository url to a subdirectory
+      r.update_attribute :url, (r.url + '/test/some')
+      
+      get :revision, :id => 1, :rev => 2
+      assert_response :success
+      assert_template 'revision'
+      assert_tag :tag => 'tr',
+                 :child => { :tag => 'td', :content => %r{/test/some/path/in/the/repo} },
+                 :child => { :tag => 'td', 
+                             :child => { :tag => 'a', :attributes => { :href => '/repositories/diff/ecookbook/path/in/the/repo?rev=2' } }
+                           }
+    end
+    
     def test_diff
       get :diff, :id => 1, :rev => 3
       assert_response :success