From c5863c0ad08c89b344850e9857ecba81241683fb Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 20 Jun 2010 16:08:26 +0000 Subject: [PATCH] Support listing directories in svn which include square brackets. #5548 Contributed by Gregor Schmidt git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3800 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- .../scm/adapters/subversion_adapter.rb | 21 +++++++---- .../subversion_repository.dump.gz | Bin 12611 -> 12819 bytes ...repositories_subversion_controller_test.rb | 2 +- test/unit/repository_subversion_test.rb | 34 +++++++++++++++--- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/lib/redmine/scm/adapters/subversion_adapter.rb b/lib/redmine/scm/adapters/subversion_adapter.rb index 73814f93..a4520a62 100644 --- a/lib/redmine/scm/adapters/subversion_adapter.rb +++ b/lib/redmine/scm/adapters/subversion_adapter.rb @@ -47,7 +47,7 @@ module Redmine # Get info about the svn repository def info - cmd = "#{SVN_BIN} info --xml #{target('')}" + cmd = "#{SVN_BIN} info --xml #{target}" cmd << credentials_string info = nil shellout(cmd) do |io| @@ -77,7 +77,7 @@ module Redmine path ||= '' identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" entries = Entries.new - cmd = "#{SVN_BIN} list --xml #{target(URI.escape(path))}@#{identifier}" + cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}" cmd << credentials_string shellout(cmd) do |io| output = io.read @@ -116,7 +116,7 @@ module Redmine return nil unless self.class.client_version_above?([1, 5, 0]) identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{SVN_BIN} proplist --verbose --xml #{target(URI.escape(path))}@#{identifier}" + cmd = "#{SVN_BIN} proplist --verbose --xml #{target(path)}@#{identifier}" cmd << credentials_string properties = {} shellout(cmd) do |io| @@ -142,7 +142,7 @@ module Redmine cmd << credentials_string cmd << " --verbose " if options[:with_paths] cmd << " --limit #{options[:limit].to_i}" if options[:limit] - cmd << ' ' + target(URI.escape(path)) + cmd << ' ' + target(path) shellout(cmd) do |io| output = io.read begin @@ -180,7 +180,7 @@ module Redmine cmd = "#{SVN_BIN} diff -r " cmd << "#{identifier_to}:" cmd << "#{identifier_from}" - cmd << " #{target(URI.escape(path))}@#{identifier_from}" + cmd << " #{target(path)}@#{identifier_from}" cmd << credentials_string diff = [] shellout(cmd) do |io| @@ -194,7 +194,7 @@ module Redmine def cat(path, identifier=nil) identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{SVN_BIN} cat #{target(URI.escape(path))}@#{identifier}" + cmd = "#{SVN_BIN} cat #{target(path)}@#{identifier}" cmd << credentials_string cat = nil shellout(cmd) do |io| @@ -207,7 +207,7 @@ module Redmine def annotate(path, identifier=nil) identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" - cmd = "#{SVN_BIN} blame #{target(URI.escape(path))}@#{identifier}" + cmd = "#{SVN_BIN} blame #{target(path)}@#{identifier}" cmd << credentials_string blame = Annotate.new shellout(cmd) do |io| @@ -243,6 +243,13 @@ module Redmine end end end + + def target(path = '') + base = path.match(/^\//) ? root_url : url + uri = "#{base}/#{path}" + uri = URI.escape(URI.escape(uri), '[]') + shell_quote(uri.gsub(/[?<>\*]/, '')) + end end end end diff --git a/test/fixtures/repositories/subversion_repository.dump.gz b/test/fixtures/repositories/subversion_repository.dump.gz index 79ef77fa7dc420f0715028a8e201901dbc66d4c1..b47542f174432006c3faa6affbe4d45954064f9a 100644 GIT binary patch literal 12819 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 literal 12611 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 diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb index d28646d4..7c88f253 100644 --- a/test/functional/repositories_subversion_controller_test.rb +++ b/test/functional/repositories_subversion_controller_test.rb @@ -57,7 +57,7 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase assert_response :success assert_template 'show' assert_not_nil assigns(:entries) - assert_equal ['folder', '.project', 'helloworld.c', 'textfile.txt'], assigns(:entries).collect(&:name) + assert_equal ['[folder_with_brackets]', 'folder', '.project', 'helloworld.c', 'textfile.txt'], assigns(:entries).collect(&:name) entry = assigns(:entries).detect {|e| e.name == 'helloworld.c'} assert_equal 'file', entry.kind assert_equal 'subversion_test/helloworld.c', entry.path diff --git a/test/unit/repository_subversion_test.rb b/test/unit/repository_subversion_test.rb index a2394fac..ca4d2ce0 100644 --- a/test/unit/repository_subversion_test.rb +++ b/test/unit/repository_subversion_test.rb @@ -18,7 +18,7 @@ require File.dirname(__FILE__) + '/../test_helper' class RepositorySubversionTest < ActiveSupport::TestCase - fixtures :projects + fixtures :projects, :repositories def setup @project = Project.find(1) @@ -30,8 +30,8 @@ class RepositorySubversionTest < ActiveSupport::TestCase @repository.fetch_changesets @repository.reload - assert_equal 10, @repository.changesets.count - assert_equal 18, @repository.changes.count + assert_equal 11, @repository.changesets.count + assert_equal 20, @repository.changes.count assert_equal 'Initial import.', @repository.changesets.find_by_revision('1').comments end @@ -43,7 +43,7 @@ class RepositorySubversionTest < ActiveSupport::TestCase assert_equal 5, @repository.changesets.count @repository.fetch_changesets - assert_equal 10, @repository.changesets.count + assert_equal 11, @repository.changesets.count end def test_latest_changesets @@ -62,6 +62,32 @@ class RepositorySubversionTest < ActiveSupport::TestCase changesets = @repository.latest_changesets('subversion_test/folder', 8) assert_equal ["7", "6", "5", "2"], changesets.collect(&:revision) end + + def test_directory_listing_with_square_brackets_in_path + @repository.fetch_changesets + @repository.reload + + entries = @repository.entries('subversion_test/[folder_with_brackets]') + assert_not_nil entries, 'Expect to find entries in folder_with_brackets' + assert_equal 1, entries.size, 'Expect one entry in folder_with_brackets' + assert_equal 'README.txt', entries.first.name + end + + def test_directory_listing_with_square_brackets_in_base + @project = Project.find(1) + @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}/subversion_test/[folder_with_brackets]") + + @repository.fetch_changesets + @repository.reload + + assert_equal 1, @repository.changesets.count, 'Expected to see 1 revision' + assert_equal 2, @repository.changes.count, 'Expected to see 2 changes, dir add and file add' + + entries = @repository.entries('') + assert_not_nil entries, 'Expect to find entries' + assert_equal 1, entries.size, 'Expect a single entry' + assert_equal 'README.txt', entries.first.name + end else puts "Subversion test repository NOT FOUND. Skipping unit tests !!!" def test_fake; assert true end