summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/models/change.rb4
-rw-r--r--app/models/repository.rb5
-rw-r--r--app/models/repository/subversion.rb15
-rw-r--r--app/views/repositories/revision.rhtml2
-rw-r--r--test/fixtures/changes.yml7
-rw-r--r--test/functional/repositories_subversion_controller_test.rb26
6 files changed, 58 insertions, 1 deletions
diff --git a/app/models/change.rb b/app/models/change.rb
index d14f435a4..385fe5acb 100644
--- a/app/models/change.rb
+++ b/app/models/change.rb
@@ -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
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 8b1f8d0af..1ea77f24f 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -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
diff --git a/app/models/repository/subversion.rb b/app/models/repository/subversion.rb
index 0c2239c43..3981d6f4c 100644
--- a/app/models/repository/subversion.rb
+++ b/app/models/repository/subversion.rb
@@ -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
diff --git a/app/views/repositories/revision.rhtml b/app/views/repositories/revision.rhtml
index f1e176669..2fdf58faf 100644
--- a/app/views/repositories/revision.rhtml
+++ b/app/views/repositories/revision.rhtml
@@ -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>
diff --git a/test/fixtures/changes.yml b/test/fixtures/changes.yml
index 30acbd02d..56d936296 100644
--- a/test/fixtures/changes.yml
+++ b/test/fixtures/changes.yml
@@ -13,4 +13,11 @@ changes_002:
path: /test/some/path/elsewhere/in/the/repo
from_path:
from_revision:
+changes_003:
+ id: 3
+ changeset_id: 101
+ action: M
+ path: /test/some/path/in/the/repo
+ from_path:
+ from_revision:
\ No newline at end of file
diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb
index dd56947fc..bc3f261a0 100644
--- a/test/functional/repositories_subversion_controller_test.rb
+++ b/test/functional/repositories_subversion_controller_test.rb
@@ -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