Feature #1735 ยป cvs_encoding.patch
app/helpers/repositories_helper.rb (working copy) | ||
---|---|---|
78 | 78 |
content_tag('p', form.password_field(:password, :size => 30, :name => 'ignore', |
79 | 79 |
:value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)), |
80 | 80 |
:onfocus => "this.value=''; this.name='repository[password]';", |
81 |
:onchange => "this.name='repository[password]';")) |
|
81 |
:onchange => "this.name='repository[password]';")) + |
|
82 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.root_url.blank?))) |
|
82 | 83 |
end |
83 | 84 | |
84 | 85 |
def darcs_field_tags(form, repository) |
85 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?))) |
|
86 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?))) + |
|
87 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => ( repository && !repository.new_record?))) |
|
86 | 88 |
end |
87 | 89 |
|
88 | 90 |
def mercurial_field_tags(form, repository) |
89 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) |
|
91 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) + |
|
92 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.root_url.blank?))) |
|
90 | 93 |
end |
91 | 94 | |
92 | 95 |
def git_field_tags(form, repository) |
93 |
content_tag('p', form.text_field(:url, :label => 'Path to .git directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) |
|
96 |
content_tag('p', form.text_field(:url, :label => 'Path to .git directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) + |
|
97 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.root_url.blank?))) |
|
94 | 98 |
end |
95 | 99 | |
96 | 100 |
def cvs_field_tags(form, repository) |
97 | 101 |
content_tag('p', form.text_field(:root_url, :label => 'CVSROOT', :size => 60, :required => true, :disabled => !repository.new_record?)) + |
98 |
content_tag('p', form.text_field(:url, :label => 'Module', :size => 30, :required => true, :disabled => !repository.new_record?)) |
|
102 |
content_tag('p', form.text_field(:url, :label => 'Module', :size => 30, :required => true, :disabled => !repository.new_record?)) + |
|
103 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.new_record?))) |
|
99 | 104 |
end |
100 | 105 | |
101 | 106 |
def bazaar_field_tags(form, repository) |
102 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?))) |
|
107 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?))) + |
|
108 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.new_record?))) |
|
103 | 109 |
end |
104 | 110 |
|
105 | 111 |
def filesystem_field_tags(form, repository) |
106 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) |
|
112 |
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?))) + |
|
113 |
content_tag('p', form.text_field(:encoding, :size => 30, :disabled => (repository && !repository.root_url.blank?))) |
|
107 | 114 |
end |
108 | 115 |
end |
app/models/repository/subversion.rb (working copy) | ||
---|---|---|
19 | 19 | |
20 | 20 |
class Repository::Subversion < Repository |
21 | 21 |
attr_protected :root_url |
22 |
validates_presence_of :url |
|
22 |
validates_presence_of :url, :encoding
|
|
23 | 23 |
validates_format_of :url, :with => /^(http|https|svn|svn\+ssh|file):\/\/.+/i |
24 | 24 | |
25 | 25 |
def scm_adapter |
app/models/repository/bazaar.rb (working copy) | ||
---|---|---|
19 | 19 | |
20 | 20 |
class Repository::Bazaar < Repository |
21 | 21 |
attr_protected :root_url |
22 |
validates_presence_of :url |
|
22 |
validates_presence_of :url, :encoding
|
|
23 | 23 | |
24 | 24 |
def scm_adapter |
25 | 25 |
Redmine::Scm::Adapters::BazaarAdapter |
app/models/repository/git.rb (working copy) | ||
---|---|---|
19 | 19 | |
20 | 20 |
class Repository::Git < Repository |
21 | 21 |
attr_protected :root_url |
22 |
validates_presence_of :url |
|
22 |
validates_presence_of :url, :encoding
|
|
23 | 23 | |
24 | 24 |
def scm_adapter |
25 | 25 |
Redmine::Scm::Adapters::GitAdapter |
app/models/repository/mercurial.rb (working copy) | ||
---|---|---|
19 | 19 | |
20 | 20 |
class Repository::Mercurial < Repository |
21 | 21 |
attr_protected :root_url |
22 |
validates_presence_of :url |
|
22 |
validates_presence_of :url, :encoding
|
|
23 | 23 | |
24 | 24 |
def scm_adapter |
25 | 25 |
Redmine::Scm::Adapters::MercurialAdapter |
app/models/repository/filesystem.rb (working copy) | ||
---|---|---|
22 | 22 | |
23 | 23 |
class Repository::Filesystem < Repository |
24 | 24 |
attr_protected :root_url |
25 |
validates_presence_of :url |
|
25 |
validates_presence_of :url, :encoding
|
|
26 | 26 | |
27 | 27 |
def scm_adapter |
28 | 28 |
Redmine::Scm::Adapters::FilesystemAdapter |
app/models/repository/cvs.rb (working copy) | ||
---|---|---|
19 | 19 |
require 'digest/sha1' |
20 | 20 | |
21 | 21 |
class Repository::Cvs < Repository |
22 |
validates_presence_of :url, :root_url |
|
22 |
validates_presence_of :url, :root_url, :encoding
|
|
23 | 23 | |
24 | 24 |
def scm_adapter |
25 | 25 |
Redmine::Scm::Adapters::CvsAdapter |
app/models/repository/darcs.rb (working copy) | ||
---|---|---|
18 | 18 |
require 'redmine/scm/adapters/darcs_adapter' |
19 | 19 | |
20 | 20 |
class Repository::Darcs < Repository |
21 |
validates_presence_of :url |
|
21 |
validates_presence_of :url, :encoding
|
|
22 | 22 | |
23 | 23 |
def scm_adapter |
24 | 24 |
Redmine::Scm::Adapters::DarcsAdapter |
app/models/repository.rb (working copy) | ||
---|---|---|
31 | 31 |
def url=(arg) |
32 | 32 |
write_attribute(:url, arg ? arg.to_s.strip : nil) |
33 | 33 |
end |
34 |
|
|
34 | ||
35 |
def encoding=(arg) |
|
36 |
write_attribute(:encoding, arg ? arg.to_s.strip : nil) |
|
37 |
end |
|
38 | ||
39 | ||
35 | 40 |
# Removes leading and trailing whitespace |
36 | 41 |
def root_url=(arg) |
37 | 42 |
write_attribute(:root_url, arg ? arg.to_s.strip : nil) |
38 | 43 |
end |
39 | 44 | |
40 | 45 |
def scm |
41 |
@scm ||= self.scm_adapter.new url, root_url, login, password |
|
46 |
@scm ||= self.scm_adapter.new url, root_url, login, password, encoding
|
|
42 | 47 |
update_attribute(:root_url, @scm.root_url) if root_url.blank? |
43 | 48 |
@scm |
44 | 49 |
end |
... | ... | |
129 | 134 |
# Strips url and root_url |
130 | 135 |
url.strip! |
131 | 136 |
root_url.strip! |
137 |
encoding.strip! |
|
132 | 138 |
true |
133 | 139 |
end |
134 | 140 |
|
app/controllers/application.rb (working copy) | ||
---|---|---|
33 | 33 |
def current_role |
34 | 34 |
@current_role ||= User.current.role_for_project(@project) |
35 | 35 |
end |
36 |
|
|
36 |
|
|
37 | ||
37 | 38 |
def user_setup |
38 | 39 |
# Check the settings cache for each request |
39 | 40 |
Setting.check_cache |
lib/redmine/scm/adapters/abstract_adapter.rb (working copy) | ||
---|---|---|
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 | 17 | |
18 |
require 'iconv' |
|
18 | 19 |
require 'cgi' |
19 | 20 | |
20 | 21 |
module Redmine |
... | ... | |
47 | 48 |
end |
48 | 49 |
end |
49 | 50 |
|
50 |
def initialize(url, root_url=nil, login=nil, password=nil) |
|
51 |
def initialize(url, root_url=nil, login=nil, password=nil, encoding=nil)
|
|
51 | 52 |
@url = url |
52 | 53 |
@login = login if login && !login.empty? |
53 | 54 |
@password = (password || "") if @login |
54 | 55 |
@root_url = root_url.blank? ? retrieve_root_url : root_url |
56 |
@encoding = encoding.blank? ? "UTF-8" : encoding |
|
55 | 57 |
end |
56 |
|
|
58 |
|
|
59 |
def to_utf(str) |
|
60 |
if encoding != nil and str != nil and encoding != "UTF-8" |
|
61 |
logger.debug "Encoding, from: #{encoding}" |
|
62 |
return Iconv.conv("UTF-8", encoding, str) |
|
63 |
end |
|
64 |
logger.debug "Don't encoding, enc: #{encoding}" |
|
65 |
return str |
|
66 | ||
67 |
end |
|
68 | ||
57 | 69 |
def adapter_name |
58 | 70 |
'Abstract' |
59 | 71 |
end |
... | ... | |
69 | 81 |
def root_url |
70 | 82 |
@root_url |
71 | 83 |
end |
72 |
|
|
84 |
|
|
85 |
def encoding |
|
86 |
@encoding |
|
87 |
end |
|
88 | ||
73 | 89 |
def url |
74 | 90 |
@url |
75 | 91 |
end |
lib/redmine/scm/adapters/cvs_adapter.rb (working copy) | ||
---|---|---|
30 | 30 |
# root_url -> the good old, sometimes damned, CVSROOT |
31 | 31 |
# login -> unnecessary |
32 | 32 |
# password -> unnecessary too |
33 |
def initialize(url, root_url=nil, login=nil, password=nil) |
|
33 |
# encoding -> unnecessary too |
|
34 |
def initialize(url, root_url=nil, login=nil, password=nil, encoding="UTF-8") |
|
34 | 35 |
@url = url |
35 | 36 |
@login = login if login && !login.empty? |
36 | 37 |
@password = (password || "") if @login |
38 |
@encoding = encoding |
|
37 | 39 |
#TODO: better Exception here (IllegalArgumentException) |
38 | 40 |
raise CommandFailed if root_url.blank? |
39 | 41 |
@root_url = root_url |
... | ... | |
220 | 222 |
# version.line_minus = 0 |
221 | 223 |
# end |
222 | 224 |
else |
223 |
commit_log << line unless line =~ /^\*\*\* empty log message \*\*\*/
|
|
225 |
commit_log << to_utf( (line unless line =~ /^\*\*\* empty log message \*\*\*/) )
|
|
224 | 226 |
end |
225 | 227 |
end |
226 | 228 |
end |