From ffb3d9260aa04fbd340652631e5df1d440740181 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 26 Sep 2010 21:54:52 +0000 Subject: [PATCH] Support leading and trailing spaces in filenames or directories in the git adapter. #6499 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed by Felix Schäfer git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4189 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/scm/adapters/git_adapter.rb | 6 +++--- .../repositories/git_repository.tar.gz | Bin 20118 -> 20711 bytes .../repositories_git_controller_test.rb | 3 ++- .../redmine/scm/adapters/git_adapter_test.rb | 10 +++++++++- test/unit/repository_git_test.rb | 8 ++++---- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index f455a57f5..5ed57c264 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -65,7 +65,7 @@ module Redmine shellout(cmd) do |io| io.each_line do |line| e = line.chomp.to_s - if e =~ /^\d+\s+(\w+)\s+([0-9a-f]{40})\s+([0-9-]+)\s+(.+)$/ + if e =~ /^\d+\s+(\w+)\s+([0-9a-f]{40})\s+([0-9-]+)\t(.+)$/ type = $1 sha = $2 size = $3 @@ -165,13 +165,13 @@ module Redmine parsing_descr = 1 changeset[:description] = "" elsif (parsing_descr == 1 || parsing_descr == 2) \ - && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\s+(.+)$/ + && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\t(.+)$/ parsing_descr = 2 fileaction = $1 filepath = $2 files << {:action => fileaction, :path => filepath} elsif (parsing_descr == 1 || parsing_descr == 2) \ - && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\d+\s+(\S+)\s+(.+)$/ + && line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\d+\s+(\S+)\t(.+)$/ parsing_descr = 2 fileaction = $1 filepath = $3 diff --git a/test/fixtures/repositories/git_repository.tar.gz b/test/fixtures/repositories/git_repository.tar.gz index 8a07a230cc9202a7396d5f4ed6e207087ec63d03..17cb22943b34d75268ded8cbbacb66a5cbda3d8b 100644 GIT binary patch literal 20711 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 literal 20118 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 diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb index bea9663c2..941fbcf1b 100644 --- a/test/functional/repositories_git_controller_test.rb +++ b/test/functional/repositories_git_controller_test.rb @@ -50,7 +50,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase assert_response :success assert_template 'show' assert_not_nil assigns(:entries) - assert_equal 8, assigns(:entries).size + assert_equal 9, assigns(:entries).size assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} @@ -59,6 +59,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase assert assigns(:entries).detect {|e| e.name == 'new_file.txt' && e.kind == 'file'} assert assigns(:entries).detect {|e| e.name == 'renamed_test.txt' && e.kind == 'file'} assert assigns(:entries).detect {|e| e.name == 'filemane with spaces.txt' && e.kind == 'file'} + assert assigns(:entries).detect {|e| e.name == ' filename with a leading space.txt ' && e.kind == 'file'} end def test_browse_branch diff --git a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb index 76dca9ed6..45e3a5adb 100644 --- a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb +++ b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb @@ -13,7 +13,7 @@ class GitAdapterTest < ActiveSupport::TestCase end def test_getting_all_revisions - assert_equal 14, @adapter.revisions('',nil,nil,:all => true).length + assert_equal 15, @adapter.revisions('',nil,nil,:all => true).length end def test_getting_certain_revisions @@ -24,6 +24,14 @@ class GitAdapterTest < ActiveSupport::TestCase assert_equal 1, @adapter.revisions("filemane with spaces.txt", nil, nil, :all => true).length end + def test_getting_revisions_with_leading_and_trailing_spaces_in_filename + assert_equal " filename with a leading space.txt ", @adapter.revisions(" filename with a leading space.txt ", nil, nil, :all => true)[0].paths[0][:path] + end + + def test_getting_entries_with_leading_and_trailing_spaces_in_filename + assert_equal " filename with a leading space.txt ", @adapter.entries('', '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name + end + def test_annotate annotate = @adapter.annotate('sources/watchers_controller.rb') assert_kind_of Redmine::Scm::Adapters::Annotate, annotate diff --git a/test/unit/repository_git_test.rb b/test/unit/repository_git_test.rb index 4f6087511..5ae889492 100644 --- a/test/unit/repository_git_test.rb +++ b/test/unit/repository_git_test.rb @@ -34,8 +34,8 @@ class RepositoryGitTest < ActiveSupport::TestCase @repository.fetch_changesets @repository.reload - assert_equal 14, @repository.changesets.count - assert_equal 23, @repository.changes.count + assert_equal 15, @repository.changesets.count + assert_equal 24, @repository.changes.count commit = @repository.changesets.find(:first, :order => 'committed_on ASC') assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments @@ -57,10 +57,10 @@ class RepositoryGitTest < ActiveSupport::TestCase # Remove the 3 latest changesets @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy) @repository.reload - assert_equal 11, @repository.changesets.count + assert_equal 12, @repository.changesets.count @repository.fetch_changesets - assert_equal 14, @repository.changesets.count + assert_equal 15, @repository.changesets.count end else puts "Git test repository NOT FOUND. Skipping unit tests !!!"