From fec86a9ce100dec444872993c792fa99cc489b96 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 7 Dec 2008 15:21:40 +0000 Subject: [PATCH] Adds a setting to limit the number of diff lines that should be displayed (default to 1500). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2112 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/views/common/_diff.rhtml | 5 +- app/views/settings/_general.rhtml | 3 + config/settings.yml | 3 + lang/bg.yml | 2 + lang/ca.yml | 2 + lang/cs.yml | 2 + lang/da.yml | 2 + lang/de.yml | 2 + lang/en.yml | 2 + lang/es.yml | 2 + lang/fi.yml | 2 + lang/fr.yml | 2 + lang/he.yml | 2 + lang/hu.yml | 2 + lang/it.yml | 2 + lang/ja.yml | 2 + lang/ko.yml | 2 + lang/lt.yml | 2 + lang/nl.yml | 2 + lang/no.yml | 2 + lang/pl.yml | 2 + lang/pt-br.yml | 2 + lang/pt.yml | 2 + lang/ro.yml | 2 + lang/ru.yml | 2 + lang/sk.yml | 2 + lang/sr.yml | 2 + lang/sv.yml | 2 + lang/th.yml | 2 + lang/tr.yml | 2 + lang/uk.yml | 2 + lang/vn.yml | 2 + lang/zh-tw.yml | 2 + lang/zh.yml | 2 + lib/redmine/unified_diff.rb | 10 +++ test/fixtures/diffs/subversion.diff | 79 ++++++++++++++++++++++ test/unit/lib/redmine/unified_diff_test.rb | 42 ++++++++++++ 37 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/diffs/subversion.diff create mode 100644 test/unit/lib/redmine/unified_diff_test.rb diff --git a/app/views/common/_diff.rhtml b/app/views/common/_diff.rhtml index 07bd4745f..104845b4d 100644 --- a/app/views/common/_diff.rhtml +++ b/app/views/common/_diff.rhtml @@ -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| -%>
<% if diff_type == 'sbs' -%> @@ -62,3 +63,5 @@ <% end -%> + +<%= l(:text_diff_truncated) if diff.truncated? %> diff --git a/app/views/settings/_general.rhtml b/app/views/settings/_general.rhtml index 06db77b22..9889702a2 100644 --- a/app/views/settings/_general.rhtml +++ b/app/views/settings/_general.rhtml @@ -48,6 +48,9 @@

<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %>

+

+<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %>

+

<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %>

diff --git a/config/settings.yml b/config/settings.yml index 02f0b13b5..50064450f 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -61,6 +61,9 @@ protocol: feeds_limit: format: int default: 15 +diff_max_lines_displayed: + format: int + default: 1500 enabled_scm: serialized: true default: diff --git a/lang/bg.yml b/lang/bg.yml index 9bce327c6..5170a977e 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/ca.yml b/lang/ca.yml index 250bb1d8d..79398078b 100644 --- a/lang/ca.yml +++ b/lang/ca.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/cs.yml b/lang/cs.yml index cb7f361bc..ba22ab12c 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -699,3 +699,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/da.yml b/lang/da.yml index a8acfa49b..5b8ee5b89 100644 --- a/lang/da.yml +++ b/lang/da.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/de.yml b/lang/de.yml index 82c91d991..93afc016b 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -696,3 +696,5 @@ enumeration_doc_categories: Dokumentenkategorien 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 diff --git a/lang/en.yml b/lang/en.yml index 256141d07..b2d7efc4f 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: Enable WS for incoming emails 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 @@ -670,6 +671,7 @@ text_enumeration_destroy_question: '%d objects are assigned to this value.' 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 diff --git a/lang/es.yml b/lang/es.yml index 0c773496d..52d3c30aa 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -679,3 +679,5 @@ text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su con 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 diff --git a/lang/fi.yml b/lang/fi.yml index e917ec2a8..be0a46b06 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: Muokkaa omia viestejä 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 diff --git a/lang/fr.yml b/lang/fr.yml index ffc1b75f3..daa6f2f60 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails" 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 @@ -670,6 +671,7 @@ text_enumeration_destroy_question: 'Cette valeur est affectée à %d objets.' 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 diff --git a/lang/he.yml b/lang/he.yml index da9160809..552c42233 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/hu.yml b/lang/hu.yml index e3c649026..24a9da4a5 100644 --- a/lang/hu.yml +++ b/lang/hu.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Saját üzenetek szerkesztése 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 diff --git a/lang/it.yml b/lang/it.yml index 3ae2a323d..c5efcb219 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: Modifica propri messaggi 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 diff --git a/lang/ja.yml b/lang/ja.yml index 71e50a794..e1dfa2d8a 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/ko.yml b/lang/ko.yml index a476966a3..9d2fb6d8e 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: 자기 메시지 편집 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 diff --git a/lang/lt.yml b/lang/lt.yml index 8a7db6b40..cd83a1b22 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/nl.yml b/lang/nl.yml index e70fd9997..51b91a1a1 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/no.yml b/lang/no.yml index afad80787..8cf2321f1 100644 --- a/lang/no.yml +++ b/lang/no.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/pl.yml b/lang/pl.yml index 7aea9bbfd..0591f7a25 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -713,3 +713,5 @@ text_workflow_edit: Zaznacz rolę i typ zagadnienia do edycji przepływu 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 diff --git a/lang/pt-br.yml b/lang/pt-br.yml index 5f202de50..72137889b 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Editar próprias mensagens permission_delete_own_messages: Excluir próprias mensagens label_user_activity: "Atividade de %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 diff --git a/lang/pt.yml b/lang/pt.yml index 0df3cda38..25110002a 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/ro.yml b/lang/ro.yml index 27d9c8e16..72d8f871c 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -694,3 +694,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/ru.yml b/lang/ru.yml index 4d7807cb1..acf916006 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -728,3 +728,5 @@ text_wiki_destroy_confirmation: Вы уверены, что хотите уда 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 diff --git a/lang/sk.yml b/lang/sk.yml index 9cea7d006..8f874356b 100644 --- a/lang/sk.yml +++ b/lang/sk.yml @@ -700,3 +700,5 @@ permission_delete_own_messages: Delete own messages 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 diff --git a/lang/sr.yml b/lang/sr.yml index 797e94f54..4a4b6d083 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -695,3 +695,5 @@ permission_delete_own_messages: Delete own messages 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 diff --git a/lang/sv.yml b/lang/sv.yml index f15febe70..5c7e5e0d2 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/th.yml b/lang/th.yml index 2689c9889..a569a50d5 100644 --- a/lang/th.yml +++ b/lang/th.yml @@ -697,3 +697,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/tr.yml b/lang/tr.yml index bdd971268..a587b4214 100644 --- a/lang/tr.yml +++ b/lang/tr.yml @@ -695,3 +695,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/uk.yml b/lang/uk.yml index 7b3c446f4..b5d7c9789 100644 --- a/lang/uk.yml +++ b/lang/uk.yml @@ -696,3 +696,5 @@ permission_edit_own_messages: Edit own messages 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 diff --git a/lang/vn.yml b/lang/vn.yml index 93a243ff3..de5a4f058 100644 --- a/lang/vn.yml +++ b/lang/vn.yml @@ -697,3 +697,5 @@ text_repository_usernames_mapping: "Chọn hoặc cập nhật ánh xạ ngườ 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 diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index a23df295b..f52f4d815 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -696,3 +696,5 @@ default_activity_development: 開發 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 diff --git a/lang/zh.yml b/lang/zh.yml index 721d21719..428c6e67d 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -696,3 +696,5 @@ enumeration_issue_priorities: 问题优先级 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 diff --git a/lib/redmine/unified_diff.rb b/lib/redmine/unified_diff.rb index 5408a1ef9..bf4dec335 100644 --- a/lib/redmine/unified_diff.rb +++ b/lib/redmine/unified_diff.rb @@ -19,8 +19,11 @@ module Redmine # 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 @@ module Redmine 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 diff --git a/test/fixtures/diffs/subversion.diff b/test/fixtures/diffs/subversion.diff new file mode 100644 index 000000000..9b6c9d086 --- /dev/null +++ b/test/fixtures/diffs/subversion.diff @@ -0,0 +1,79 @@ +Index: app/views/settings/_general.rhtml +=================================================================== +--- app/views/settings/_general.rhtml (revision 2094) ++++ app/views/settings/_general.rhtml (working copy) +@@ -48,6 +48,9 @@ +

+ <%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %>

+ ++

++<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %>

++ +

+ <%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %>

+ +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| -%> +
+ <% if diff_type == 'sbs' -%> +
+@@ -62,3 +63,5 @@ + + + <% 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 diff --git a/test/unit/lib/redmine/unified_diff_test.rb b/test/unit/lib/redmine/unified_diff_test.rb new file mode 100644 index 000000000..5e6ba1aef --- /dev/null +++ b/test/unit/lib/redmine/unified_diff_test.rb @@ -0,0 +1,42 @@ +# 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 -- 2.39.5