-<% Redmine::UnifiedDiff.new(diff, diff_type).each do |table_file| -%>
+<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
+<% diff.each do |table_file| -%>
<div class="autoscroll">
<% if diff_type == 'sbs' -%>
<table class="filecontent CodeRay">
</div>
<% end -%>
+
+<%= l(:text_diff_truncated) if diff.truncated? %>
<p><label><%= l(:setting_feeds_limit) %></label>
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
+<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
+<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
+
<p><label><%= l(:setting_gravatar_enabled) %></label>
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
</div>
feeds_limit:
format: int
default: 15
+diff_max_lines_displayed:
+ format: int
+ default: 1500
enabled_scm:
serialized: true
default:
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages\r
label_user_activity: "%s's activity"\r
label_updated_time_by: Updated by %s %s ago\r
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'\r
+setting_diff_max_lines_displayed: Max number of diff lines displayed\r
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
enumeration_activities: Aktivitäten (Zeiterfassung)
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
setting_mail_handler_api_key: API key
setting_sequential_project_identifiers: Generate sequential project identifiers
setting_gravatar_enabled: Use Gravatar user icons
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_edit_project: Edit project
permission_select_project_modules: Select project modules
text_enumeration_category_reassign_to: 'Reassign them to this value:'
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
default_role_manager: Manager
default_role_developper: Developer
text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Poista omia viestejä
label_user_activity: "Käyttäjän %s historia"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
setting_mail_handler_api_key: Clé de protection de l'API
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
+setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
permission_edit_project: Modifier le projet
permission_select_project_modules: Choisir les modules
text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:'
text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer."
text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés."
+text_diff_truncated: '... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.'
default_role_manager: Manager
default_role_developper: Développeur
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Saját üzenetek törlése
label_user_activity: "%s tevékenységei"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Elimina propri messaggi
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: 자기 메시지 삭제
label_user_activity: "%s의 활동"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
label_user_activity: "Aktywność: %s"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Excluir próprias mensagens
label_user_activity: "Atividade de %s"
label_updated_time_by: Updated by %s %s ago\r
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'\r
+setting_diff_max_lines_displayed: Max number of diff lines displayed\r
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
label_user_activity: "%s's activity"\r
label_updated_time_by: Updated by %s %s ago\r
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'\r
+setting_diff_max_lines_displayed: Max number of diff lines displayed\r
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
permission_delete_own_messages: Delete own messages
label_user_activity: "%s's activity"\r
label_updated_time_by: Updated by %s %s ago\r
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'\r
+setting_diff_max_lines_displayed: Max number of diff lines displayed\r
enumeration_issue_priorities: 項目優先權
enumeration_doc_categories: 文件分類
enumeration_activities: 活動 (時間追蹤)
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
enumeration_doc_categories: 文档类别
enumeration_activities: 活动(时间跟踪)
label_updated_time_by: Updated by %s %s ago
+text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
+setting_diff_max_lines_displayed: Max number of diff lines displayed
module Redmine
# Class used to parse unified diffs
class UnifiedDiff < Array
- def initialize(diff, type="inline")
- diff_table = DiffTable.new type
+ def initialize(diff, options={})
+ options.assert_valid_keys(:type, :max_lines)
+ diff_type = options[:type] || 'inline'
+
+ lines = 0
+ @truncated = false
+ diff_table = DiffTable.new(diff_type)
diff.each do |line|
if line =~ /^(---|\+\+\+) (.*)$/
self << diff_table if diff_table.length > 1
- diff_table = DiffTable.new type
+ diff_table = DiffTable.new(diff_type)
+ end
+ diff_table.add_line line
+ lines += 1
+ if options[:max_lines] && lines > options[:max_lines]
+ @truncated = true
+ break
end
- a = diff_table.add_line line
end
self << diff_table unless diff_table.empty?
self
end
+
+ def truncated?; @truncated; end
end
# Class that represents a file diff
--- /dev/null
+Index: app/views/settings/_general.rhtml
+===================================================================
+--- app/views/settings/_general.rhtml (revision 2094)
++++ app/views/settings/_general.rhtml (working copy)
+@@ -48,6 +48,9 @@
+ <p><label><%= l(:setting_feeds_limit) %></label>
+ <%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
+
++<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
++<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
++
+ <p><label><%= l(:setting_gravatar_enabled) %></label>
+ <%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
+ </div>
+Index: app/views/common/_diff.rhtml
+===================================================================
+--- app/views/common/_diff.rhtml (revision 2111)
++++ app/views/common/_diff.rhtml (working copy)
+@@ -1,4 +1,5 @@
+-<% Redmine::UnifiedDiff.new(diff, :type => diff_type).each do |table_file| -%>
++<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
++<% diff.each do |table_file| -%>
+ <div class="autoscroll">
+ <% if diff_type == 'sbs' -%>
+ <table class="filecontent CodeRay">
+@@ -62,3 +63,5 @@
+
+ </div>
+ <% end -%>
++
++<%= l(:text_diff_truncated) if diff.truncated? %>
+Index: lang/lt.yml
+===================================================================
+--- config/settings.yml (revision 2094)
++++ config/settings.yml (working copy)
+@@ -61,6 +61,9 @@
+ feeds_limit:
+ format: int
+ default: 15
++diff_max_lines_displayed:
++ format: int
++ default: 1500
+ enabled_scm:
+ serialized: true
+ default:
+Index: lib/redmine/unified_diff.rb
+===================================================================
+--- lib/redmine/unified_diff.rb (revision 2110)
++++ lib/redmine/unified_diff.rb (working copy)
+@@ -19,8 +19,11 @@
+ # Class used to parse unified diffs
+ class UnifiedDiff < Array
+ def initialize(diff, options={})
++ options.assert_valid_keys(:type, :max_lines)
+ diff_type = options[:type] || 'inline'
+
++ lines = 0
++ @truncated = false
+ diff_table = DiffTable.new(diff_type)
+ diff.each do |line|
+ if line =~ /^(---|\+\+\+) (.*)$/
+@@ -28,10 +31,17 @@
+ diff_table = DiffTable.new(diff_type)
+ end
+ diff_table.add_line line
++ lines += 1
++ if options[:max_lines] && lines > options[:max_lines]
++ @truncated = true
++ break
++ end
+ end
+ self << diff_table unless diff_table.empty?
+ self
+ end
++
++ def truncated?; @truncated; end
+ end
+
+ # Class that represents a file diff
--- /dev/null
+# Redmine - project management software
+# Copyright (C) 2006-2008 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../../../test_helper'
+
+class Redmine::UnifiedDiffTest < Test::Unit::TestCase
+
+ def setup
+ end
+
+ def test_subversion_diff
+ diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'))
+ # number of files
+ assert_equal 4, diff.size
+ assert diff.detect {|file| file.file_name =~ %r{^config/settings.yml}}
+ end
+
+ def test_truncate_diff
+ diff = Redmine::UnifiedDiff.new(read_diff_fixture('subversion.diff'), :max_lines => 20)
+ assert_equal 2, diff.size
+ end
+
+ private
+
+ def read_diff_fixture(filename)
+ File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
+ end
+end