diff --git a/lib/gollum/committer.rb b/lib/gollum/committer.rb index e1911bdf..ada599c9 100644 --- a/lib/gollum/committer.rb +++ b/lib/gollum/committer.rb @@ -104,6 +104,8 @@ module Gollum end end + fullpath = fullpath.force_encoding('ascii-8bit') if fullpath.respond_to?(:force_encoding) + index.add(fullpath, @wiki.normalize(data)) end @@ -129,6 +131,8 @@ module Gollum ::File.join(dir, @wiki.page_file_name(name, format)) end + path = path.force_encoding('ascii-8bit') if path.respond_to?(:force_encoding) + Dir.chdir(::File.join(@wiki.repo.path, '..')) do if file_path_scheduled_for_deletion?(index.tree, path) @wiki.repo.git.rm({'f' => true}, '--', path) @@ -212,6 +216,7 @@ module Gollum # Proxies methods t def method_missing(name, *args) + args.map! { |item| item.respond_to?(:force_encoding) ? item.force_encoding('ascii-8bit') : item } index.send(name, *args) end end diff --git a/test/test_unicode.rb b/test/test_unicode.rb new file mode 100644 index 00000000..2fe209d7 --- /dev/null +++ b/test/test_unicode.rb @@ -0,0 +1,114 @@ +# ~*~ encoding: utf-8 ~*~ +require File.expand_path(File.join(File.dirname(__FILE__), "helper")) + +def utf8(str) + str.respond_to?(:force_encoding) ? str.force_encoding('utf-8') : str +end + +context "Unicode Support" do + setup do + @path = cloned_testpath("examples/revert.git") + @wiki = Gollum::Wiki.new(@path) + end + + teardown do + FileUtils.rm_rf(@path) + end + + test "create and read non-latin page" do + @wiki.write_page("한글 test", :markdown, "# 한글") + + page = @wiki.page("한글 test") + assert_equal Gollum::Page, page.class + assert_equal "# 한글", utf8(page.raw_data) + end + + test "unicode with existing format rules" do + @wiki.write_page("한글 test", :markdown, "# 한글") + assert_equal @wiki.page("한글 test").path, @wiki.page("한글-test").path + end +end + +context "Frontend Unicode support" do + include Rack::Test::Methods + + setup do + @path = cloned_testpath("examples/revert.git") + @wiki = Gollum::Wiki.new(@path) + Precious::App.set(:gollum_path, @path) + Precious::App.set(:wiki_options, {}) + end + + teardown do + FileUtils.rm_rf(@path) + end + + test "creates korean page" do + post "/create", :content => 'english text', :page => "한글", + :format => 'markdown', :message => 'def' + follow_redirect! + assert last_response.ok? + + page = @wiki.page('한글') + assert_equal 'english text', page.raw_data + assert_equal 'def', page.version.message + end + + test "creates korean page which contains korean content" do + post "/create", :content => '한글 text', :page => "한글", + :format => 'markdown', :message => 'def' + follow_redirect! + assert last_response.ok? + + page = @wiki.page('한글') + assert_equal '한글 text', utf8(page.raw_data) + assert_equal 'def', page.version.message + end + + test "heavy use 1" do + post "/create", :content => '한글 text', :page => "PG", + :format => 'markdown', :message => 'def' + follow_redirect! + assert last_response.ok? + + @wiki.update_page(@wiki.page('PG'), nil, nil, '다른 text', {}) + page = @wiki.page('PG') + assert_equal '다른 text', utf8(page.raw_data) + + post '/edit/PG', :content => '바뀐 text', :message => 'ghi' + follow_redirect! + assert last_response.ok? + + @wiki = Gollum::Wiki.new(@path) + page = @wiki.page('PG') + assert_equal '바뀐 text', utf8(page.raw_data) + assert_equal 'ghi', page.version.message + end + + test "heavy use 2" do + post "/create", :content => '한글 text', :page => "한글", + :format => 'markdown', :message => 'def' + follow_redirect! + assert last_response.ok? + + @wiki.update_page(@wiki.page('한글'), nil, nil, '다른 text', {}) + @wiki = Gollum::Wiki.new(@path) + page = @wiki.page('한글') + assert_equal '다른 text', utf8(page.raw_data) + + post '/edit/' + CGI.escape('한글'), :content => '바뀐 text', + :format => 'markdown', :message => 'ghi' + follow_redirect! + assert last_response.ok? + + @wiki = Gollum::Wiki.new(@path) + page = @wiki.page('한글') + assert_equal '바뀐 text', utf8(page.raw_data) + assert_equal 'ghi', page.version.message + end + + def app + Precious::App + end +end +