]> source.dussan.org Git - redmine.git/commitdiff
scm: fix annotate error with non ASCII author on Ruby 1.9 and Ruby 2.0 (#14931)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 18 Sep 2013 14:22:44 +0000 (14:22 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 18 Sep 2013 14:22:44 +0000 (14:22 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12156 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/views/repositories/annotate.html.erb
test/functional/repositories_bazaar_controller_test.rb
test/functional/repositories_git_controller_test.rb

index 210a0c0e5fd69ceb89346eb4fce0a7ef83fb4cc5..fcb6d3d8485f69b4f7b77e79497cca362ccc3a86 100644 (file)
@@ -26,7 +26,9 @@
         </td>
         <td class="author">
           <% if revision && revision != previous_revision %>
-            <%= revision.author.to_s.split('<').first %>
+            <% author = Redmine::CodesetUtil.to_utf8(revision.author.to_s,
+                                                     @repository.repo_log_encoding) %>
+            <%= author.split('<').first %>
           <% end %>
         </td>
         <td class="line-code"><pre><%= line.html_safe %></pre></td>
index 46a71d2310266bbad8038d7eab5417883d9c94da..b4d7d72763a92a4ca095e451f7fcc4e96cd5ce40 100644 (file)
@@ -26,6 +26,7 @@ class RepositoriesBazaarControllerTest < ActionController::TestCase
   REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s
   REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk")
   PRJ_ID = 3
+  CHAR_1_UTF8_HEX   = "\xc3\x9c"
 
   def setup
     User.current = nil
@@ -35,6 +36,10 @@ class RepositoriesBazaarControllerTest < ActionController::TestCase
                     :url          => REPOSITORY_PATH_TRUNK,
                     :log_encoding => 'UTF-8')
     assert @repository
+    @char_1_utf8 = CHAR_1_UTF8_HEX.dup
+    if @char_1_utf8.respond_to?(:force_encoding)
+      @char_1_utf8.force_encoding('UTF-8')
+    end
   end
 
   if File.directory?(REPOSITORY_PATH)
@@ -171,6 +176,37 @@ class RepositoriesBazaarControllerTest < ActionController::TestCase
       end
     end
 
+    if REPOSITORY_PATH.respond_to?(:force_encoding)
+      def test_annotate_author_non_ascii
+        log_encoding = nil
+        if Encoding.locale_charmap == "UTF-8" || 
+             Encoding.locale_charmap == "ISO-8859-1"
+          log_encoding = Encoding.locale_charmap
+        end
+        unless log_encoding.nil?
+          repository = Repository::Bazaar.create(
+                        :project      => @project,
+                        :url          => File.join(REPOSITORY_PATH, "author_non_ascii"),
+                        :identifier => 'author_non_ascii',
+                        :log_encoding => log_encoding)
+          assert repository
+          get :annotate, :id => PRJ_ID, :repository_id => 'author_non_ascii',
+              :path => repository_path_hash(['author-non-ascii-test.txt'])[:param]
+          assert_response :success
+          assert_template 'annotate'
+          assert_select "th.line-num", :text => '1' do
+            assert_select "+ td.revision" do
+              assert_select "a", :text => '2'
+              assert_select "+ td.author", :text => "test #{@char_1_utf8}" do
+                assert_select "+ td",
+                              :text => "author non ASCII test"
+              end
+            end
+          end
+        end
+      end
+    end
+
     def test_destroy_valid_repository
       @request.session[:user_id] = 1 # admin
       assert_equal 0, @repository.changesets.count
index 16907e42ab8a75ab4df04cc528a9bca652d4a89b..dd25b3736bda16d80478f5e88efabcd92aefcd39 100644 (file)
@@ -27,6 +27,7 @@ class RepositoriesGitControllerTest < ActionController::TestCase
   REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
   PRJ_ID     = 3
   CHAR_1_HEX = "\xc3\x9c"
+  FELIX_HEX  = "Felix Sch\xC3\xA4fer"
   NUM_REV = 28
 
   ## Git, Mercurial and CVS path encodings are binary.
@@ -50,8 +51,10 @@ class RepositoriesGitControllerTest < ActionController::TestCase
                       )
     assert @repository
     @char_1        = CHAR_1_HEX.dup
+    @felix_utf8  = FELIX_HEX.dup
     if @char_1.respond_to?(:force_encoding)
       @char_1.force_encoding('UTF-8')
+      @felix_utf8.force_encoding('UTF-8')
     end
   end
 
@@ -546,6 +549,23 @@ class RepositoriesGitControllerTest < ActionController::TestCase
       end
     end
 
+    def test_annotate_latin_1_author
+      ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', '83ca5fd546063a'].each do |r1|
+        get :annotate, :id => PRJ_ID,
+            :path => repository_path_hash([" filename with a leading space.txt "])[:param],
+            :rev => r1
+        assert_select "th.line-num", :text => '1' do
+          assert_select "+ td.revision" do
+            assert_select "a", :text => '83ca5fd5'
+            assert_select "+ td.author", :text => @felix_utf8 do
+              assert_select "+ td",
+                            :text => "And this is a file with a leading and trailing space..."
+            end
+          end
+        end
+      end
+    end
+
     def test_revisions
       assert_equal 0, @repository.changesets.count
       @repository.fetch_changesets