diff app/helpers/.svn/text-base/repositories_helper.rb.svn-base @ 246:eeebe205a056 cannam

* Merge from default branch, bringing us up to SVN trunk rev 4993
author Chris Cannam
date Thu, 03 Mar 2011 12:02:03 +0000
parents cd2282d2aa55 051f544170fe
children 753f1380d6bc
line wrap: on
line diff
--- a/app/helpers/.svn/text-base/repositories_helper.rb.svn-base	Thu Jan 20 09:59:02 2011 +0000
+++ b/app/helpers/.svn/text-base/repositories_helper.rb.svn-base	Thu Mar 03 12:02:03 2011 +0000
@@ -25,13 +25,13 @@
       revision.to_s
     end
   end
-  
+
   def truncate_at_line_break(text, length = 255)
     if text
       text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
     end
   end
-  
+
   def render_properties(properties)
     unless properties.nil? || properties.empty?
       content = ''
@@ -41,7 +41,7 @@
       content_tag('ul', content, :class => 'properties')
     end
   end
-  
+
   def render_changeset_changes
     changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change|
       case change.action
@@ -75,10 +75,10 @@
     
     render_changes_tree(tree[:s])
   end
-  
+
   def render_changes_tree(tree)
     return '' if tree.nil?
-    
+
     output = ''
     output << '<ul>'
     tree.keys.sort.each do |file|
@@ -115,15 +115,18 @@
     output << '</ul>'
     output
   end
-  
+
   def to_utf8(str)
+    return str if str.blank?
     if str.respond_to?(:force_encoding)
       str.force_encoding('UTF-8')
-      return str if str.valid_encoding?
     else
+      # TODO:
+      # Japanese Shift_JIS(CP932) is not compatible with ASCII.
+      # UTF-7 and Japanese ISO-2022-JP are 7bits clean.
       return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
     end
-    
+
     @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip)
     @encodings.each do |encoding|
       begin
@@ -132,67 +135,118 @@
         # do nothing here and try the next encoding
       end
     end
+    str = replace_invalid_utf8(str)
+  end
+
+  def replace_invalid_utf8(str)
+    if str.respond_to?(:force_encoding)
+      str.force_encoding('UTF-8')
+      if ! str.valid_encoding?
+        str = str.encode("US-ASCII", :invalid => :replace,
+              :undef => :replace, :replace => '?').encode("UTF-8")
+      end
+    end
     str
   end
-  
-  def repository_field_tags(form, repository)    
+
+  def repository_field_tags(form, repository)
     method = repository.class.name.demodulize.underscore + "_field_tags"
-    send(method, form, repository) if repository.is_a?(Repository) && respond_to?(method) && method != 'repository_field_tags'
+    if repository.is_a?(Repository) &&
+        respond_to?(method) && method != 'repository_field_tags'
+      send(method, form, repository)
+    end
   end
-  
+
   def scm_select_tag(repository)
     scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']]
     Redmine::Scm::Base.all.each do |scm|
-      scm_options << ["Repository::#{scm}".constantize.scm_name, scm] if Setting.enabled_scm.include?(scm) || (repository && repository.class.name.demodulize == scm)
+    if Setting.enabled_scm.include?(scm) ||
+          (repository && repository.class.name.demodulize == scm)
+        scm_options << ["Repository::#{scm}".constantize.scm_name, scm]
+      end
     end
-    
     select_tag('repository_scm', 
                options_for_select(scm_options, repository.class.name.demodulize),
                :disabled => (repository && !repository.new_record?),
-               :onchange => remote_function(:url => { :controller => 'repositories', :action => 'edit', :id => @project }, :method => :get, :with => "Form.serialize(this.form)")
+               :onchange => remote_function(
+                  :url => {
+                      :controller => 'repositories',
+                      :action => 'edit',
+                      :id => @project
+                        },
+               :method => :get,
+               :with => "Form.serialize(this.form)")
                )
   end
-  
+
   def with_leading_slash(path)
     path.to_s.starts_with?('/') ? path : "/#{path}"
   end
-  
+
   def without_leading_slash(path)
     path.gsub(%r{^/+}, '')
   end
 
   def subversion_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)) +
+      content_tag('p', form.text_field(:url, :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
                        '<br />(file:///, http://, https://, svn://, svn+[tunnelscheme]://)') +
       content_tag('p', form.text_field(:login, :size => 30)) +
-      content_tag('p', form.password_field(:password, :size => 30, :name => 'ignore',
-                                           :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
-                                           :onfocus => "this.value=''; this.name='repository[password]';",
-                                           :onchange => "this.name='repository[password]';"))
+      content_tag('p', form.password_field(
+                            :password, :size => 30, :name => 'ignore',
+                            :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
+                            :onfocus => "this.value=''; this.name='repository[password]';",
+                            :onchange => "this.name='repository[password]';"))
   end
 
   def darcs_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def mercurial_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />local repository (e.g. /hgrepo, c:\hgrepo)' )
   end
 
   def git_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Path to .git directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Path to repository',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />a bare and local repository (e.g. /gitrepo, c:\gitrepo)')
   end
 
   def cvs_field_tags(form, repository)
-      content_tag('p', form.text_field(:root_url, :label => 'CVSROOT', :size => 60, :required => true, :disabled => !repository.new_record?)) +
-      content_tag('p', form.text_field(:url, :label => 'Module', :size => 30, :required => true, :disabled => !repository.new_record?))
+      content_tag('p', form.text_field(:root_url,
+                       :label => 'CVSROOT', :size => 60, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.text_field(:url, :label => 'Module',
+                       :size => 30, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
 
   def bazaar_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def filesystem_field_tags(form, repository)
-    content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+    content_tag('p', form.text_field(:url, :label => 'Root directory',
+                     :size => 60, :required => true,
+                     :disabled => (repository && !repository.root_url.blank?))) +
+    content_tag('p', form.select(
+                        :path_encoding, [nil] + Setting::ENCODINGS,
+                        :label => 'Path encoding') +
+                        '<br />Default: UTF-8')
   end
 end