diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 198a9766..64eb0579 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -65,7 +65,8 @@ class RepositoriesController < ApplicationController if request.xhr? @entries ? render(:partial => 'dir_list_content') : render(:nothing => true) else - show_error_not_found unless @entries + show_error_not_found and return unless @entries + render :action => 'browse' end rescue Redmine::Scm::Adapters::CommandFailed => e show_error_command_failed(e.message) @@ -95,6 +96,12 @@ class RepositoriesController < ApplicationController end def entry + @entry = @repository.scm.entry(@path, @rev) + show_error_not_found and return unless @entry + + # If the entry is a dir, show the browser + browse and return if @entry.is_dir? + @content = @repository.scm.cat(@path, @rev) show_error_not_found and return unless @content if 'raw' == params[:format] || @content.is_binary_data? diff --git a/lib/redmine/scm/adapters/abstract_adapter.rb b/lib/redmine/scm/adapters/abstract_adapter.rb index 41edf00a..2c254d48 100644 --- a/lib/redmine/scm/adapters/abstract_adapter.rb +++ b/lib/redmine/scm/adapters/abstract_adapter.rb @@ -59,8 +59,17 @@ module Redmine # Returns the entry identified by path and revision identifier # or nil if entry doesn't exist in the repository def entry(path=nil, identifier=nil) - e = entries(path, identifier) - e ? e.first : nil + parts = path.to_s.split(%r{[\/\\]}).select {|n| !n.blank?} + search_path = parts[0..-2].join('/') + search_name = parts[-1] + if search_path.blank? && search_name.blank? + # Root entry + Entry.new(:path => '', :kind => 'dir') + else + # Search for the entry in the parent directory + es = entries(search_path, identifier) + es ? es.detect {|e| e.name == search_name} : nil + end end # Returns an Entries collection diff --git a/lib/redmine/scm/adapters/bazaar_adapter.rb b/lib/redmine/scm/adapters/bazaar_adapter.rb index 11a44b7c..2225a627 100644 --- a/lib/redmine/scm/adapters/bazaar_adapter.rb +++ b/lib/redmine/scm/adapters/bazaar_adapter.rb @@ -44,18 +44,6 @@ module Redmine return nil end - # Returns the entry identified by path and revision identifier - # or nil if entry doesn't exist in the repository - def entry(path=nil, identifier=nil) - path ||= '' - parts = path.split(%r{[\/\\]}).select {|p| !p.blank?} - if parts.size > 0 - parent = parts[0..-2].join('/') - entries = entries(parent, identifier) - entries ? entries.detect {|e| e.name == parts.last} : nil - end - end - # Returns an Entries collection # or nil if the given path doesn't exist in the repository def entries(path=nil, identifier=nil) diff --git a/lib/redmine/scm/adapters/cvs_adapter.rb b/lib/redmine/scm/adapters/cvs_adapter.rb index 6085bfdb..37920b59 100644 --- a/lib/redmine/scm/adapters/cvs_adapter.rb +++ b/lib/redmine/scm/adapters/cvs_adapter.rb @@ -55,15 +55,6 @@ module Redmine def get_previous_revision(revision) CvsRevisionHelper.new(revision).prevRev end - - # Returns the entry identified by path and revision identifier - # or nil if entry doesn't exist in the repository - # this method returns all revisions from one single SCM-Entry - def entry(path=nil, identifier="HEAD") - e = entries(path, identifier) - logger.debug(" #{e.first.inspect}") if e - e ? e.first : nil - end # Returns an Entries collection # or nil if the given path doesn't exist in the repository diff --git a/lib/redmine/scm/adapters/darcs_adapter.rb b/lib/redmine/scm/adapters/darcs_adapter.rb index 660b6cf8..a1d1867b 100644 --- a/lib/redmine/scm/adapters/darcs_adapter.rb +++ b/lib/redmine/scm/adapters/darcs_adapter.rb @@ -40,13 +40,6 @@ module Redmine rev ? Info.new({:root_url => @url, :lastrev => rev.last}) : nil end - # Returns the entry identified by path and revision identifier - # or nil if entry doesn't exist in the repository - def entry(path=nil, identifier=nil) - e = entries(path, identifier) - e ? e.first : nil - end - # Returns an Entries collection # or nil if the given path doesn't exist in the repository def entries(path=nil, identifier=nil) diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index 5d315b0c..77604f28 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -132,14 +132,6 @@ module Redmine entries.sort_by_name end - def entry(path=nil, identifier=nil) - path ||= '' - search_path = path.split('/')[0..-2].join('/') - entry_name = path.split('/').last - e = entries(search_path, identifier) - e ? e.detect{|entry| entry.name == entry_name} : nil - end - def revisions(path, identifier_from, identifier_to, options={}) revisions = Revisions.new cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw " diff --git a/lib/redmine/scm/adapters/mercurial_adapter.rb b/lib/redmine/scm/adapters/mercurial_adapter.rb index 72db723b..6f42dda0 100644 --- a/lib/redmine/scm/adapters/mercurial_adapter.rb +++ b/lib/redmine/scm/adapters/mercurial_adapter.rb @@ -59,14 +59,6 @@ module Redmine return nil if $? && $?.exitstatus != 0 entries.sort_by_name end - - def entry(path=nil, identifier=nil) - path ||= '' - search_path = path.split('/')[0..-2].join('/') - entry_name = path.split('/').last - e = entries(search_path, identifier) - e ? e.detect{|entry| entry.name == entry_name} : nil - end def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}) revisions = Revisions.new diff --git a/lib/redmine/scm/adapters/subversion_adapter.rb b/lib/redmine/scm/adapters/subversion_adapter.rb index efbd3ba8..40c7eb3f 100644 --- a/lib/redmine/scm/adapters/subversion_adapter.rb +++ b/lib/redmine/scm/adapters/subversion_adapter.rb @@ -51,13 +51,6 @@ module Redmine return nil end - # Returns the entry identified by path and revision identifier - # or nil if entry doesn't exist in the repository - def entry(path=nil, identifier=nil) - e = entries(path, identifier) - e ? e.first : nil - end - # Returns an Entries collection # or nil if the given path doesn't exist in the repository def entries(path=nil, identifier=nil) diff --git a/test/functional/repositories_bazaar_controller_test.rb b/test/functional/repositories_bazaar_controller_test.rb index 5a473bab..acb6c1d2 100644 --- a/test/functional/repositories_bazaar_controller_test.rb +++ b/test/functional/repositories_bazaar_controller_test.rb @@ -99,6 +99,14 @@ class RepositoriesBazaarControllerTest < Test::Unit::TestCase assert @response.body.include?('Show help message') end + def test_directory_entry + get :entry, :id => 3, :path => ['directory'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entry) + assert_equal 'directory', assigns(:entry).name + end + def test_diff # Full diff of changeset 3 get :diff, :id => 3, :rev => 3 diff --git a/test/functional/repositories_cvs_controller_test.rb b/test/functional/repositories_cvs_controller_test.rb index d6181ad3..e12bb53a 100644 --- a/test/functional/repositories_cvs_controller_test.rb +++ b/test/functional/repositories_cvs_controller_test.rb @@ -101,6 +101,14 @@ class RepositoriesCvsControllerTest < Test::Unit::TestCase get :entry, :id => 1, :path => ['sources', 'watchers_controller.rb'], :format => 'raw' assert_response :success end + + def test_directory_entry + get :entry, :id => 1, :path => ['sources'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entry) + assert_equal 'sources', assigns(:entry).name + end def test_diff Project.find(1).repository.fetch_changesets diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb index 10a4950f..339e2289 100644 --- a/test/functional/repositories_git_controller_test.rb +++ b/test/functional/repositories_git_controller_test.rb @@ -101,6 +101,14 @@ class RepositoriesGitControllerTest < Test::Unit::TestCase assert @response.body.include?('WITHOUT ANY WARRANTY') end + def test_directory_entry + get :entry, :id => 3, :path => ['sources'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entry) + assert_equal 'sources', assigns(:entry).name + end + def test_diff # Full diff of changeset 2f9c0091 get :diff, :id => 3, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' diff --git a/test/functional/repositories_mercurial_controller_test.rb b/test/functional/repositories_mercurial_controller_test.rb index b09265d1..cb870aa3 100644 --- a/test/functional/repositories_mercurial_controller_test.rb +++ b/test/functional/repositories_mercurial_controller_test.rb @@ -99,7 +99,15 @@ class RepositoriesMercurialControllerTest < Test::Unit::TestCase # File content assert @response.body.include?('WITHOUT ANY WARRANTY') end - + + def test_directory_entry + get :entry, :id => 3, :path => ['sources'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entry) + assert_equal 'sources', assigns(:entry).name + end + def test_diff # Full diff of changeset 4 get :diff, :id => 3, :rev => 4 diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb index adb69c8e..dd56947f 100644 --- a/test/functional/repositories_subversion_controller_test.rb +++ b/test/functional/repositories_subversion_controller_test.rb @@ -89,6 +89,14 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase assert_response :success end + def test_directory_entry + get :entry, :id => 1, :path => ['subversion_test', 'folder'] + assert_response :success + assert_template 'browse' + assert_not_nil assigns(:entry) + assert_equal 'folder', assigns(:entry).name + end + def test_diff get :diff, :id => 1, :rev => 3 assert_response :success