Compare commits

..
1 Commits
Author SHA1 Message Date
Jean-Philippe Lang 03f6e25ca3 tagged version 2.2.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/2.2.2@11241 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 19:05:40 +00:00
20 changed files with 2630 additions and 2659 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
source 'http://rubygems.org' source 'http://rubygems.org'
gem 'rails', '3.2.12' gem 'rails', '3.2.11'
gem "jquery-rails", "~> 2.0.2" gem "jquery-rails", "~> 2.0.2"
gem "i18n", "~> 0.6.0" gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.6" gem "coderay", "~> 1.0.6"
+3 -4
View File
@@ -704,11 +704,10 @@ module ApplicationHelper
# identifier:document:"Some document" # identifier:document:"Some document"
# identifier:version:1.0.0 # identifier:version:1.0.0
# identifier:source:some/file # identifier:source:some/file
def parse_redmine_links(text, default_project, obj, attr, only_path, options) def parse_redmine_links(text, project, obj, attr, only_path, options)
text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-_]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m| text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
leading, esc, project_prefix, project_identifier, prefix, repo_prefix, repo_identifier, sep, identifier, comment_suffix, comment_id = $1, $2, $3, $4, $5, $10, $11, $8 || $12 || $18, $14 || $19, $15, $17 leading, esc, project_prefix, project_identifier, prefix, repo_prefix, repo_identifier, sep, identifier, comment_suffix, comment_id = $1, $2, $3, $4, $5, $10, $11, $8 || $12 || $18, $14 || $19, $15, $17
link = nil link = nil
project = default_project
if project_identifier if project_identifier
project = Project.visible.find_by_identifier(project_identifier) project = Project.visible.find_by_identifier(project_identifier)
end end
@@ -794,7 +793,7 @@ module ApplicationHelper
when 'commit', 'source', 'export' when 'commit', 'source', 'export'
if project if project
repository = nil repository = nil
if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$} if name =~ %r{^(([a-z0-9\-]+)\|)(.+)$}
repo_prefix, repo_identifier, name = $1, $2, $3 repo_prefix, repo_identifier, name = $1, $2, $3
repository = project.repositories.detect {|repo| repo.identifier == repo_identifier} repository = project.repositories.detect {|repo| repo.identifier == repo_identifier}
else else
+5 -5
View File
@@ -87,14 +87,14 @@ module QueriesHelper
format_time(value) format_time(value)
when 'Date' when 'Date'
format_date(value) format_date(value)
when 'Fixnum' when 'Fixnum', 'Float'
if column.name == :done_ratio if column.name == :done_ratio
progress_bar(value, :width => '80px') progress_bar(value, :width => '80px')
else elsif column.name == :spent_hours
value.to_s
end
when 'Float'
sprintf "%.2f", value sprintf "%.2f", value
else
h(value.to_s)
end
when 'User' when 'User'
link_to_user value link_to_user value
when 'Project' when 'Project'
+1 -3
View File
@@ -731,7 +731,7 @@ class Project < ActiveRecord::Base
def copy_wiki(project) def copy_wiki(project)
# Check that the source project has a wiki first # Check that the source project has a wiki first
unless project.wiki.nil? unless project.wiki.nil?
wiki = self.wiki || Wiki.new self.wiki ||= Wiki.new
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id") wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
wiki_pages_map = {} wiki_pages_map = {}
project.wiki.pages.each do |page| project.wiki.pages.each do |page|
@@ -743,8 +743,6 @@ class Project < ActiveRecord::Base
wiki.pages << new_wiki_page wiki.pages << new_wiki_page
wiki_pages_map[page.id] = new_wiki_page wiki_pages_map[page.id] = new_wiki_page
end end
self.wiki = wiki
wiki.save wiki.save
# Reproduce page hierarchy # Reproduce page hierarchy
project.wiki.pages.each do |page| project.wiki.pages.each do |page|
+1 -1
View File
@@ -111,7 +111,7 @@
<li><%= bulk_update_custom_field_context_menu_link(field, text, value || text) %></li> <li><%= bulk_update_custom_field_context_menu_link(field, text, value || text) %></li>
<% end %> <% end %>
<% unless field.is_required? %> <% unless field.is_required? %>
<li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '__none__') %></li> <li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '') %></li>
<% end %> <% end %>
</ul> </ul>
</li> </li>
+1 -1
View File
@@ -833,7 +833,7 @@ bg:
label_generate_key: Генериране на ключ label_generate_key: Генериране на ключ
label_issue_watchers: Наблюдатели label_issue_watchers: Наблюдатели
label_example: Пример label_example: Пример
label_display: Показване label_display: Display
label_sort: Сортиране label_sort: Сортиране
label_ascending: Нарастващ label_ascending: Нарастващ
label_descending: Намаляващ label_descending: Намаляващ
+66 -66
View File
@@ -1037,84 +1037,84 @@ es:
description_selected_columns: Columnas seleccionadas description_selected_columns: Columnas seleccionadas
label_parent_revision: Padre label_parent_revision: Padre
label_child_revision: Hijo label_child_revision: Hijo
setting_default_issue_start_date_to_creation_date: Utilizar la fecha actual como fecha de inicio para nuevas peticiones setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
button_edit_section: Editar esta sección button_edit_section: Edit this section
setting_repositories_encodings: Codificación de adjuntos y repositorios setting_repositories_encodings: Attachments and repositories encodings
description_all_columns: Todas las columnas description_all_columns: Todas las columnas
button_export: Exportar button_export: Exportar
label_export_options: "%{export_format} opciones de exportación" label_export_options: "%{export_format} opciones de exportación"
error_attachment_too_big: Este fichero no se puede adjuntar porque excede el tamaño máximo de fichero (%{max_size}) error_attachment_too_big: Este fichero no se puede adjuntar porque excede el tamaño máximo de fichero (%{max_size})
notice_failed_to_save_time_entries: "Error al guardar %{count} entradas de tiempo de las %{total} seleccionadas: %{ids}." notice_failed_to_save_time_entries: "Error al guarda %{count} entradas de tiempo de las %{total} seleccionadas: %{ids}."
label_x_issues: label_x_issues:
zero: 0 petición zero: 0 petición
one: 1 petición one: 1 petición
other: "%{count} peticiones" other: "%{count} peticiones"
label_repository_new: Nuevo repositorio label_repository_new: New repository
field_repository_is_default: Repositorio principal field_repository_is_default: Main repository
label_copy_attachments: Copiar adjuntos label_copy_attachments: Copy attachments
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Versiones completadas label_completed_versions: Completed versions
text_project_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.<br />Una vez guardado, el identificador no se puede cambiar. text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_multiple: Valores múltiples field_multiple: Multiple values
setting_commit_cross_project_ref: Permitir referenciar y resolver peticiones de todos los demás proyectos setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: Añadir mis notas y descartar mis otros cambios text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: Aplicar mis campos de todas formas (las notas anteriores se mantendrán pero algunos cambios podrían ser sobreescritos) text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: La petición ha sido actualizada por otro usuario mientras la editaba. notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: Descartar todos mis cambios y mostrar de nuevo %{link} text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: Gestionar peticiones relacionadas permission_manage_related_issues: Manage related issues
field_auth_source_ldap_filter: Filtro LDAP field_auth_source_ldap_filter: LDAP filter
label_search_for_watchers: Buscar seguidores para añadirlos label_search_for_watchers: Search for watchers to add
notice_account_deleted: Su cuenta ha sido eliminada notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Permitir a los usuarios borrar sus propias cuentas setting_unsubscribe: Allow users to delete their own account
button_delete_my_account: Borrar mi cuenta button_delete_my_account: Delete my account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
¿Está seguro de querer proceder? Are you sure you want to proceed?
Su cuenta quedará borrada permanentemente, sin la posibilidad de reactivarla. Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Su sesión ha expirado. Por favor, vuelva a identificarse. error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Advertencia: el cambio de estas opciones podría hacer expirar las sesiones activas, incluyendo la suya." text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Tiempo de vida máximo de las sesiones setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Tiempo máximo de inactividad de las sesiones setting_session_timeout: Session inactivity timeout
label_session_expiration: Expiración de sesiones label_session_expiration: Session expiration
permission_close_project: Cerrar / reabrir el proyecto permission_close_project: Close / reopen the project
label_show_closed_projects: Ver proyectos cerrados label_show_closed_projects: View closed projects
button_close: Cerrar button_close: Close
button_reopen: Reabrir button_reopen: Reopen
project_status_active: activo project_status_active: active
project_status_closed: cerrado project_status_closed: closed
project_status_archived: archivado project_status_archived: archived
text_project_closed: Este proyecto está cerrado y es de sólo lectura text_project_closed: This project is closed and read-only.
notice_user_successful_create: Usuario %{id} creado. notice_user_successful_create: User %{id} created.
field_core_fields: Campos básicos field_core_fields: Standard fields
field_timeout: Tiempo de inactividad (en segundos) field_timeout: Timeout (in seconds)
setting_thumbnails_enabled: Mostrar miniaturas de los adjuntos setting_thumbnails_enabled: Display attachment thumbnails
setting_thumbnails_size: Tamaño de las miniaturas (en píxeles) setting_thumbnails_size: Thumbnails size (in pixels)
label_status_transitions: Transiciones de estado label_status_transitions: Status transitions
label_fields_permissions: Permisos sobre los campos label_fields_permissions: Fields permissions
label_readonly: Sólo lectura label_readonly: Read-only
label_required: Requerido label_required: Required
text_repository_identifier_info: Solo se permiten letras en minúscula (a-z), números, guiones y barras bajas.<br />Una vez guardado, el identificador no se puede cambiar. text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_board_parent: Foro padre field_board_parent: Parent forum
label_attribute_of_project: "%{name} del proyecto" label_attribute_of_project: Project's %{name}
label_attribute_of_author: "%{name} del autor" label_attribute_of_author: Author's %{name}
label_attribute_of_assigned_to: "%{name} de la persona asignada" label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: "%{name} de la versión indicada" label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copiar subtareas label_copy_subtasks: Copy subtasks
label_copied_to: copiada a label_copied_to: copied to
label_copied_from: copiada desde label_copied_from: copied from
label_any_issues_in_project: cualquier petición del proyecto label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: cualquier petición que no sea del proyecto label_any_issues_not_in_project: any issues not in project
field_private_notes: Notas privadas field_private_notes: Private notes
permission_view_private_notes: Ver notas privadas permission_view_private_notes: View private notes
permission_set_notes_private: Poner notas como privadas permission_set_notes_private: Set notes as private
label_no_issues_in_project: no hay peticiones en el proyecto label_no_issues_in_project: no issues in project
label_any: todos label_any: todos
label_last_n_weeks: en las últimas %{count} semanas label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Permitir subtareas cruzadas entre proyectos setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: Con proyectos hijo label_cross_project_descendants: Con proyectos hijo
label_cross_project_tree: Con el árbol del proyecto label_cross_project_tree: Con el árbol del proyecto
label_cross_project_hierarchy: Con la jerarquía del proyecto label_cross_project_hierarchy: Con la jerarquía del proyecto
label_cross_project_system: Con todos los proyectos label_cross_project_system: Con todos los proyectos
button_hide: Ocultar button_hide: Hide
setting_non_working_week_days: Días no laborables setting_non_working_week_days: Non-working days
label_in_the_next_days: en los próximos label_in_the_next_days: in the next
label_in_the_past_days: en los anteriores label_in_the_past_days: in the past
+1 -1
View File
@@ -1147,7 +1147,7 @@ ru:
button_delete_my_account: "Удалить мою учетную запись" button_delete_my_account: "Удалить мою учетную запись"
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз
text_session_expiration_settings: "Внимание! Изменение этих настроек может привести к завершению текущих сессий, включая вашу." text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Максимальная продолжительность сессии setting_session_lifetime: Максимальная продолжительность сессии
setting_session_timeout: Таймут сессии setting_session_timeout: Таймут сессии
label_session_expiration: Срок истечения сессии label_session_expiration: Срок истечения сессии
-13
View File
@@ -4,19 +4,6 @@ Redmine - project management software
Copyright (C) 2006-2012 Jean-Philippe Lang Copyright (C) 2006-2012 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2013-02-12 v2.2.3
* Upgrade to Rails 3.2.12
* Defect #11987: pdf: Broken new line in table
* Defect #12930: 404 Error when referencing different project source files in the wiki syntax
* Defect #12979: Wiki link syntax commit:repo_a:abcd doesn't work
* Defect #13075: Can't clear custom field value through context menu in the issue list
* Defect #13097: Project copy fails when wiki module is disabled
* Defect #13126: Issue view: estimated time vs. spent time
* Patch #12922: Update Spanish translation
* Patch #12928: Bulgarian translation for 2.2-stable
* Patch #12987: Russian translation for 2.2-stable
== 2013-01-20 v2.2.2 == 2013-01-20 v2.2.2
* Defect #7510: Link to attachment should return latest attachment * Defect #7510: Link to attachment should return latest attachment
-4
View File
@@ -4002,10 +4002,6 @@ class TCPDF
@quote_page[@quote_count] = @page; @quote_page[@quote_count] = @page;
@quote_count += 1 @quote_count += 1
when 'br' when 'br'
if @tdbegin
@tdtext << "\n"
return
end
Ln(); Ln();
if (@li_spacer.length > 0) if (@li_spacer.length > 0)
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 2 MAJOR = 2
MINOR = 2 MINOR = 2
TINY = 3 TINY = 2
# Branch values: # Branch values:
# * official release: nil # * official release: nil
@@ -132,7 +132,7 @@ class ContextMenusControllerTest < ActionController::TestCase
:attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&amp;issue%5Bcustom_field_values%5D%5B#{field.id}%5D=Foo"} :attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&amp;issue%5Bcustom_field_values%5D%5B#{field.id}%5D=Foo"}
assert_tag 'a', assert_tag 'a',
:content => 'none', :content => 'none',
:attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&amp;issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__"} :attributes => {:href => "/issues/bulk_update?ids%5B%5D=1&amp;issue%5Bcustom_field_values%5D%5B#{field.id}%5D="}
end end
def test_context_menu_should_not_include_null_value_for_required_custom_fields def test_context_menu_should_not_include_null_value_for_required_custom_fields
+3 -12
View File
@@ -347,15 +347,6 @@ RAW
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" } to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text), "#{text} failed" }
end end
def test_redmine_links_with_a_different_project_before_current_project
vp1 = Version.generate!(:project_id => 1, :name => '1.4.4')
vp3 = Version.generate!(:project_id => 3, :name => '1.4.4')
@project = Project.find(3)
assert_equal %(<p><a href="/versions/#{vp1.id}" class="version">1.4.4</a> <a href="/versions/#{vp3.id}" class="version">1.4.4</a></p>),
textilizable("ecookbook:version:1.4.4 version:1.4.4")
end
def test_escaped_redmine_links_should_not_be_parsed def test_escaped_redmine_links_should_not_be_parsed
to_test = [ to_test = [
'#3.', '#3.',
@@ -403,14 +394,14 @@ RAW
end end
def test_multiple_repositories_redmine_links def test_multiple_repositories_redmine_links
svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn_repo-1', :url => 'file:///foo/hg') svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn1', :url => 'file:///foo/hg')
Changeset.create!(:repository => svn, :committed_on => Time.now, :revision => '123') Changeset.create!(:repository => svn, :committed_on => Time.now, :revision => '123')
hg = Repository::Mercurial.create!(:project_id => 1, :identifier => 'hg1', :url => '/foo/hg') hg = Repository::Mercurial.create!(:project_id => 1, :identifier => 'hg1', :url => '/foo/hg')
Changeset.create!(:repository => hg, :committed_on => Time.now, :revision => '123', :scmid => 'abcd') Changeset.create!(:repository => hg, :committed_on => Time.now, :revision => '123', :scmid => 'abcd')
changeset_link = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, changeset_link = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
:class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
svn_changeset_link = link_to('svn_repo-1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn_repo-1', :rev => 123}, svn_changeset_link = link_to('svn1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn1', :rev => 123},
:class => 'changeset', :title => '') :class => 'changeset', :title => '')
hg_changeset_link = link_to('hg1|abcd', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'hg1', :rev => 'abcd'}, hg_changeset_link = link_to('hg1|abcd', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'hg1', :rev => 'abcd'},
:class => 'changeset', :title => '') :class => 'changeset', :title => '')
@@ -420,7 +411,7 @@ RAW
to_test = { to_test = {
'r2' => changeset_link, 'r2' => changeset_link,
'svn_repo-1|r123' => svn_changeset_link, 'svn1|r123' => svn_changeset_link,
'invalid|r123' => 'invalid|r123', 'invalid|r123' => 'invalid|r123',
'commit:hg1|abcd' => hg_changeset_link, 'commit:hg1|abcd' => hg_changeset_link,
'commit:invalid|abcd' => 'commit:invalid|abcd', 'commit:invalid|abcd' => 'commit:invalid|abcd',