From 6eea3300f88a943015979a22d224c3c51799cb45 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 24 Jun 2010 02:35:24 +0000 Subject: [PATCH 01/31] Sanitize image links and handle nils in the toc formatter. #5445 Based on contribution by Yuki Kita. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3811 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/wiki_formatting/textile/formatter.rb | 4 +++- test/unit/helpers/application_helper_test.rb | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/redmine/wiki_formatting/textile/formatter.rb b/lib/redmine/wiki_formatting/textile/formatter.rb index abffdbcbf..a622e8039 100644 --- a/lib/redmine/wiki_formatting/textile/formatter.rb +++ b/lib/redmine/wiki_formatting/textile/formatter.rb @@ -67,7 +67,9 @@ module Redmine toc_item = content.gsub(/(\[\[([^\]\|]*)(\|([^\]]*))?\]\])/) { $4 || $2 } # sanitizes titles from links # see redcloth3.rb, same as "#{pre}#{text}#{post}" - toc_item.gsub!(LINK_RE) { $2+$4+$9 } + toc_item.gsub!(LINK_RE) { [$2, $4, $9].join } + # sanitizes image links from titles + toc_item.gsub!(IMAGE_RE) { [$5].join } # removes styles # eg. %{color:red}Triggers% => Triggers toc_item.gsub! %r[%\{[^\}]*\}([^%]+)%], '\\1' diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb index 534135ecd..90d342898 100644 --- a/test/unit/helpers/application_helper_test.rb +++ b/test/unit/helpers/application_helper_test.rb @@ -421,6 +421,9 @@ h2. Subtitle with %{color:red}red text% h1. Another title h2. An "Internet link":http://www.redmine.org/ inside subtitle + +h2. "Project Name !/attachments/1234/logo_small.gif! !/attachments/5678/logo_2.png!":/projects/projectname/issues + RAW expected = '' - + assert textilizable(raw).gsub("\n", "").include?(expected) end From 672852baafdd7cd9d47f19d1b9a3ed28129d4140 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 24 Jun 2010 03:08:20 +0000 Subject: [PATCH 02/31] Force string comparison for login search to be case sensitive on MySQL. #2473 Contributed by Holger Just. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3813 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/user.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index bbb3ff2ec..8148ae3a9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -225,10 +225,13 @@ class User < Principal # Find a user account by matching the exact login and then a case-insensitive # version. Exact matches will be given priority. def self.find_by_login(login) + # force string comparison to be case sensitive on MySQL + type_cast = (ActiveRecord::Base.connection.adapter_name == 'MySQL') ? 'BINARY' : '' + # First look for an exact match - user = first(:conditions => {:login => login}) + user = first(:conditions => ["#{type_cast} login = ?", login]) # Fail over to case-insensitive if none was found - user ||= first(:conditions => ["LOWER(login) = ?", login.to_s.downcase]) + user ||= first(:conditions => ["#{type_cast} LOWER(login) = ?", login.to_s.downcase]) end def self.find_by_rss_key(key) From c7d075fb6835db2c32b0582175e45a9245d24bdf Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Mon, 28 Jun 2010 02:46:20 +0000 Subject: [PATCH 03/31] Updating documentation for the 0.9.5 release. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3814 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- doc/CHANGELOG | 12 ++++++++++++ doc/INSTALL | 2 +- doc/UPGRADING | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 2393282e4..8d23117fd 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -8,6 +8,18 @@ http://www.redmine.org/ Adds context menu to the roadmap issue lists +== 2010-06-24 v0.9.5 +Linkify folder names on revision view +"fiters" and "options" should be hidden in print view via css +Fixed: NoMethodError when no issue params are submitted +Fixed: projects.atom with required authentication +Fixed: External links not correctly displayed in Wiki TOC +Fixed: Member role forms in project settings are not hidden after member added +Fixed: pre can't be inside p +Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT +Fixed: mail handler fails when the from address is empty + + == 2010-05-01 v0.9.4 Filters collapsed by default on issues index page for a saved query diff --git a/doc/INSTALL b/doc/INSTALL index eb7669c60..a4e4312eb 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -33,7 +33,7 @@ Optional: 4. Generate a session store secret Redmine stores session data in cookies by default, which requires a secret to be generated. Run: - rake config/initializers/session_store.rb + rake generate_session_store 5. Create the database structure. Under the application main directory: rake db:migrate RAILS_ENV="production" diff --git a/doc/UPGRADING b/doc/UPGRADING index fe69676a2..a9b81d177 100644 --- a/doc/UPGRADING +++ b/doc/UPGRADING @@ -12,12 +12,12 @@ http://www.redmine.org/ 2. Copy your database settings (RAILS_ROOT/config/database.yml) and SMTP settings (RAILS_ROOT/config/email.yml) into the new config directory - DO NOT REPLACE ANY OTHERS FILES. + DO NOT REPLACE OR EDIT ANY OTHER FILES. 3. Generate a session store secret Redmine stores session data in cookies by default, which requires a secret to be generated. Run: - rake config/initializers/session_store.rb + rake generate_session_store 4. Migrate your database (please make a backup before doing this): rake db:migrate RAILS_ENV="production" From bc3ad9af38886931f66e79d2892bb11afd61fee3 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Mon, 28 Jun 2010 02:46:25 +0000 Subject: [PATCH 04/31] Bump release to 0.9.5 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3815 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb index f9f536032..3e84bd17c 100644 --- a/lib/redmine/version.rb +++ b/lib/redmine/version.rb @@ -4,7 +4,7 @@ module Redmine module VERSION #:nodoc: MAJOR = 0 MINOR = 9 - TINY = 4 + TINY = 5 # Branch values: # * official release: nil From 6ef240841cff1fe398083a117a53cfb18628d635 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 01:47:47 +0000 Subject: [PATCH 05/31] Add some tests for User#try_to_login with LDAP. #5592 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3819 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- test/unit/user_test.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 8d66e86da..5a0c9f87e 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -156,6 +156,21 @@ class UserTest < ActiveSupport::TestCase if ldap_configured? context "#try_to_login using LDAP" do + context "with failed connection to the LDAP server" do + should "return nil" do + @auth_source = AuthSourceLdap.find(1) + AuthSource.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::LdapError, 'Cannot connect') + + assert_equal nil, User.try_to_login('edavis', 'wrong') + end + end + + context "with an unsuccessful authentication" do + should "return nil" do + assert_equal nil, User.try_to_login('edavis', 'wrong') + end + end + context "on the fly registration" do setup do @auth_source = AuthSourceLdap.find(1) From 305cab100fe195ef24731b485c8c83030aaa4e29 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 01:55:44 +0000 Subject: [PATCH 06/31] Rename code and locale typo: Developper. #5751 Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3820 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- config/locales/bg.yml | 2 +- config/locales/bs.yml | 2 +- config/locales/ca.yml | 2 +- config/locales/cs.yml | 2 +- config/locales/da.yml | 2 +- config/locales/de.yml | 2 +- config/locales/el.yml | 2 +- config/locales/en-GB.yml | 2 +- config/locales/en.yml | 2 +- config/locales/es.yml | 2 +- config/locales/eu.yml | 2 +- config/locales/fi.yml | 2 +- config/locales/fr.yml | 2 +- config/locales/gl.yml | 2 +- config/locales/he.yml | 2 +- config/locales/hr.yml | 2 +- config/locales/hu.yml | 2 +- config/locales/id.yml | 2 +- config/locales/it.yml | 2 +- config/locales/ja.yml | 2 +- config/locales/ko.yml | 2 +- config/locales/lt.yml | 2 +- config/locales/lv.yml | 2 +- config/locales/mn.yml | 2 +- config/locales/nl.yml | 2 +- config/locales/no.yml | 2 +- config/locales/pl.yml | 2 +- config/locales/pt-BR.yml | 2 +- config/locales/pt.yml | 2 +- config/locales/ro.yml | 2 +- config/locales/ru.yml | 2 +- config/locales/sk.yml | 2 +- config/locales/sl.yml | 2 +- config/locales/sr-CY.yml | 2 +- config/locales/sr.yml | 2 +- config/locales/sv.yml | 2 +- config/locales/th.yml | 2 +- config/locales/tr.yml | 2 +- config/locales/uk.yml | 2 +- config/locales/vi.yml | 2 +- config/locales/zh-TW.yml | 2 +- config/locales/zh.yml | 2 +- lib/redmine/default_data/loader.rb | 4 ++-- 43 files changed, 44 insertions(+), 44 deletions(-) diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 059357b2f..051bbdaf2 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -574,7 +574,7 @@ bg: text_issue_category_reassign_to: Преобвързване с категория default_role_manager: Мениджър - default_role_developper: Разработчик + default_role_developer: Разработчик default_role_reporter: Публикуващ default_tracker_bug: Бъг default_tracker_feature: Функционалност diff --git a/config/locales/bs.yml b/config/locales/bs.yml index ad34bd390..d3fe0a128 100644 --- a/config/locales/bs.yml +++ b/config/locales/bs.yml @@ -788,7 +788,7 @@ bs: text_custom_field_possible_values_info: 'Jedna linija za svaku vrijednost' default_role_manager: Menadžer - default_role_developper: Programer + default_role_developer: Programer default_role_reporter: Reporter default_tracker_bug: Greška default_tracker_feature: Nova funkcija diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 9c1e5c129..5f54930d1 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -775,7 +775,7 @@ ca: text_custom_field_possible_values_info: 'Una línia per a cada valor' default_role_manager: Gestor - default_role_developper: Desenvolupador + default_role_developer: Desenvolupador default_role_reporter: Informador default_tracker_bug: Error default_tracker_feature: Característica diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 0778eed3f..b00527956 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -681,7 +681,7 @@ cs: text_reassign_time_entries: 'Přeřadit evidované hodiny k tomuto úkolu:' default_role_manager: Manažer - default_role_developper: Vývojář + default_role_developer: Vývojář default_role_reporter: Reportér default_tracker_bug: Chyba default_tracker_feature: Požadavek diff --git a/config/locales/da.yml b/config/locales/da.yml index 0f2957211..069674685 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -683,7 +683,7 @@ da: text_rmagick_available: RMagick tilgængelig (valgfri) default_role_manager: Leder - default_role_developper: Udvikler + default_role_developer: Udvikler default_role_reporter: Rapportør default_tracker_bug: Bug default_tracker_feature: Feature diff --git a/config/locales/de.yml b/config/locales/de.yml index 16b00d00b..70ea45489 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -882,7 +882,7 @@ de: Sind Sie sicher, dass Sie dies tun möchten? default_role_manager: Manager - default_role_developper: Entwickler + default_role_developer: Entwickler default_role_reporter: Reporter default_tracker_bug: Fehler default_tracker_feature: Feature diff --git a/config/locales/el.yml b/config/locales/el.yml index d25ed89aa..6176a6c8e 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -799,7 +799,7 @@ el: text_wiki_page_reassign_children: "Επανεκχώριση των σελίδων τέκνων στη γονική σελίδα" default_role_manager: Manager - default_role_developper: Developer + default_role_developer: Developer default_role_reporter: Reporter default_tracker_bug: Σφάλματα default_tracker_feature: Λειτουργίες diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index daa61dd0e..2c19c4f49 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -864,7 +864,7 @@ en-GB: text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" default_role_manager: Manager - default_role_developper: Developer + default_role_developer: Developer default_role_reporter: Reporter default_tracker_bug: Bug default_tracker_feature: Feature diff --git a/config/locales/en.yml b/config/locales/en.yml index 9d875e4b4..3ab257825 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -877,7 +877,7 @@ en: text_zoom_out: Zoom out default_role_manager: Manager - default_role_developper: Developer + default_role_developer: Developer default_role_reporter: Reporter default_tracker_bug: Bug default_tracker_feature: Feature diff --git a/config/locales/es.yml b/config/locales/es.yml index db487c887..0a7a38a9c 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -228,7 +228,7 @@ es: default_priority_low: Baja default_priority_normal: Normal default_priority_urgent: Urgente - default_role_developper: Desarrollador + default_role_developer: Desarrollador default_role_manager: Jefe de proyecto default_role_reporter: Informador default_tracker_bug: Errores diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 0420c9751..9f08652fc 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -861,7 +861,7 @@ eu: text_own_membership_delete_confirmation: "Zure baimen batzuk (edo guztiak) kentzera zoaz eta baliteke horren ondoren proiektu hau ezin editatzea.\n Ziur zaude jarraitu nahi duzula?" default_role_manager: Kudeatzailea - default_role_developper: Garatzailea + default_role_developer: Garatzailea default_role_reporter: Berriemailea default_tracker_bug: Errorea default_tracker_feature: Eginbidea diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 1b5c1024d..5556252cf 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -657,7 +657,7 @@ fi: text_load_default_configuration: Lataa vakioasetukset default_role_manager: Päälikkö - default_role_developper: Kehittäjä + default_role_developer: Kehittäjä default_role_reporter: Tarkastelija default_tracker_bug: Ohjelmointivirhe default_tracker_feature: Ominaisuus diff --git a/config/locales/fr.yml b/config/locales/fr.yml index dd18b2bde..fe4f4daf5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -878,7 +878,7 @@ fr: text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?" default_role_manager: "Manager " - default_role_developper: "Développeur " + default_role_developer: "Développeur " default_role_reporter: "Rapporteur " default_tracker_bug: Anomalie default_tracker_feature: Evolution diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 1072a691f..0652ce9e4 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -205,7 +205,7 @@ gl: default_priority_low: Baixa default_priority_normal: Normal default_priority_urgent: Urxente - default_role_developper: Desenvolvedor + default_role_developer: Desenvolvedor default_role_manager: Xefe de proxecto default_role_reporter: Informador default_tracker_bug: Erros diff --git a/config/locales/he.yml b/config/locales/he.yml index 4e7547ca1..125f0265f 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -596,7 +596,7 @@ he: text_issue_category_reassign_to: הצב מחדש את הקטגוריה לנושאים default_role_manager: מנהל - default_role_developper: מפתח + default_role_developer: מפתח default_role_reporter: מדווח default_tracker_bug: באג default_tracker_feature: פיצ'ר diff --git a/config/locales/hr.yml b/config/locales/hr.yml index b0726b886..424fc7dc5 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -854,7 +854,7 @@ hr: text_wiki_page_destroy_children: "Delete child pages and all their descendants" text_wiki_page_reassign_children: "Reassign child pages to this parent page" default_role_manager: Upravitelj - default_role_developper: Razvojni inženjer + default_role_developer: Razvojni inženjer default_role_reporter: Korisnik default_tracker_bug: Pogreška default_tracker_feature: Funkcionalnost diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 479d27427..6839fb7b2 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -712,7 +712,7 @@ text_reassign_time_entries: 'A rögzített órák újra hozzárendelése másik feladathoz:' default_role_manager: Vezető - default_role_developper: Fejlesztő + default_role_developer: Fejlesztő default_role_reporter: Bejelentő default_tracker_bug: Hiba default_tracker_feature: Fejlesztés diff --git a/config/locales/id.yml b/config/locales/id.yml index 537f7583a..5a14cda55 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -838,7 +838,7 @@ id: text_wiki_page_reassign_children: "Tujukan halaman anak ke halaman induk yang ini" default_role_manager: Manager - default_role_developper: Pengembang + default_role_developer: Pengembang default_role_reporter: Pelapor default_tracker_bug: Bug default_tracker_feature: Fitur diff --git a/config/locales/it.yml b/config/locales/it.yml index 68ec7bdc5..758928f2a 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -587,7 +587,7 @@ it: text_issue_category_reassign_to: Riassegna segnalazioni a questa categoria default_role_manager: Manager - default_role_developper: Sviluppatore + default_role_developer: Sviluppatore default_role_reporter: Reporter default_tracker_bug: Segnalazione default_tracker_feature: Funzione diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 19b5c291c..dc69c9792 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -908,7 +908,7 @@ ja: text_zoom_out: 縮小 default_role_manager: 管理者 - default_role_developper: 開発者 + default_role_developer: 開発者 default_role_reporter: 報告者 default_tracker_bug: バグ default_tracker_feature: 機能 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 452c1d4ac..6ba93edc3 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -852,7 +852,7 @@ ko: text_wiki_page_reassign_children: 하위 페이지를 이 페이지 아래로 지정 default_role_manager: 관리자 - default_role_developper: 개발자 + default_role_developer: 개발자 default_role_reporter: 보고자 default_tracker_bug: 결함 default_tracker_feature: 새기능 diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 995633c96..675c3a14b 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -894,7 +894,7 @@ lt: text_wiki_page_destroy_children: Pašalinti child puslapius ir jų sekinius default_role_manager: Vadovas - default_role_developper: Projektuotojas + default_role_developer: Projektuotojas default_role_reporter: Pranešėjas default_tracker_bug: Klaida default_tracker_feature: Ypatybė diff --git a/config/locales/lv.yml b/config/locales/lv.yml index ab675cef1..4d49bd120 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -856,7 +856,7 @@ lv: text_own_membership_delete_confirmation: "Jūs tūlīt dzēsīsiet dažas vai visas atļaujas, un Jums pēc tam var nebūt atļauja labot šo projektu.\nVai turpināt?" default_role_manager: Menedžeris - default_role_developper: Izstrādātājs + default_role_developer: Izstrādātājs default_role_reporter: Ziņotājs default_tracker_bug: Kļūda default_tracker_feature: Iezīme diff --git a/config/locales/mn.yml b/config/locales/mn.yml index d780f793b..63e808024 100644 --- a/config/locales/mn.yml +++ b/config/locales/mn.yml @@ -861,7 +861,7 @@ mn: text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" default_role_manager: Менежер - default_role_developper: Хөгжүүлэгч + default_role_developer: Хөгжүүлэгч default_role_reporter: Мэдэгдэгч default_tracker_bug: Алдаа default_tracker_feature: Онцлог diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 2f1f771c5..e24d5cbb5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -167,7 +167,7 @@ nl: default_priority_low: Laag default_priority_normal: Normaal default_priority_urgent: Spoed - default_role_developper: Ontwikkelaar + default_role_developer: Ontwikkelaar default_role_manager: Manager default_role_reporter: Rapporteur default_tracker_bug: Bug diff --git a/config/locales/no.yml b/config/locales/no.yml index 3b0d88c7b..53bac51be 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -685,7 +685,7 @@ text_user_wrote: "{{value}} skrev:" default_role_manager: Leder - default_role_developper: Utvikler + default_role_developer: Utvikler default_role_reporter: Rapportør default_tracker_bug: Feil default_tracker_feature: Funksjon diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 634ebd320..efa2415de 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -192,7 +192,7 @@ pl: default_priority_low: Niski default_priority_normal: Normalny default_priority_urgent: Pilny - default_role_developper: Programista + default_role_developer: Programista default_role_manager: Kierownik default_role_reporter: Wprowadzajacy default_tracker_bug: Błąd diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 1e9c59b92..e3cf7d1c0 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -730,7 +730,7 @@ pt-BR: text_email_delivery_not_configured: "O envio de e-mail não está configurado, e as notificações estão inativas.\nConfigure seu servidor SMTP no arquivo config/email.yml e reinicie a aplicação para ativá-las." default_role_manager: Gerente - default_role_developper: Desenvolvedor + default_role_developer: Desenvolvedor default_role_reporter: Informante default_tracker_bug: Defeito default_tracker_feature: Funcionalidade diff --git a/config/locales/pt.yml b/config/locales/pt.yml index dccce68a3..c8dafd847 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -717,7 +717,7 @@ pt: text_email_delivery_not_configured: "Entrega por e-mail não está configurada, e as notificação estão desactivadas.\nConfigure o seu servidor de SMTP em config/email.yml e reinicie a aplicação para activar estas funcionalidades." default_role_manager: Gestor - default_role_developper: Programador + default_role_developer: Programador default_role_reporter: Repórter default_tracker_bug: Bug default_tracker_feature: Funcionalidade diff --git a/config/locales/ro.yml b/config/locales/ro.yml index dbd1e208a..5733ddebb 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -775,7 +775,7 @@ ro: text_custom_field_possible_values_info: 'O linie pentru fiecare valoare' default_role_manager: Manager - default_role_developper: Dezvoltator + default_role_developer: Dezvoltator default_role_reporter: Creator de rapoarte default_tracker_bug: Defect default_tracker_feature: Funcție diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 7c52f4f6e..5386c1fca 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -265,7 +265,7 @@ ru: default_priority_low: Низкий default_priority_normal: Нормальный default_priority_urgent: Срочный - default_role_developper: Разработчик + default_role_developer: Разработчик default_role_manager: Менеджер default_role_reporter: Генератор отчетов default_tracker_bug: Ошибка diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 3319cca91..22f5799f7 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -679,7 +679,7 @@ sk: text_reassign_time_entries: 'Preradiť evidované hodiny k tejto úlohe:' default_role_manager: Manažér - default_role_developper: Vývojár + default_role_developer: Vývojár default_role_reporter: Reportér default_tracker_bug: Chyba default_tracker_feature: Rozšírenie diff --git a/config/locales/sl.yml b/config/locales/sl.yml index e328a6a7b..77a155757 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -760,7 +760,7 @@ sl: text_diff_truncated: '... Ta sprememba je bila odsekana ker presega največjo velikost ki je lahko prikazana.' default_role_manager: Upravnik - default_role_developper: Razvijalec + default_role_developer: Razvijalec default_role_reporter: Poročevalec default_tracker_bug: Hrošč default_tracker_feature: Funkcija diff --git a/config/locales/sr-CY.yml b/config/locales/sr-CY.yml index 62922c8ad..11f558470 100644 --- a/config/locales/sr-CY.yml +++ b/config/locales/sr-CY.yml @@ -863,7 +863,7 @@ sr-CY: text_own_membership_delete_confirmation: "Уклањањем појединих или свих ваших дозвола нећете више моћи за уређујете овај пројекат након тога.\nЖелите ли да наставите?" default_role_manager: Менаџер - default_role_developper: Програмер + default_role_developer: Програмер default_role_reporter: Извештач default_tracker_bug: Грешка default_tracker_feature: Функционалност diff --git a/config/locales/sr.yml b/config/locales/sr.yml index f0834bc71..50140b7d8 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -863,7 +863,7 @@ sr: text_own_membership_delete_confirmation: "Uklanjanjem pojedinih ili svih vaših dozvola nećete više moći za uređujete ovaj projekat nakon toga.\nŽelite li da nastavite?" default_role_manager: Menadžer - default_role_developper: Programer + default_role_developer: Programer default_role_reporter: Izveštač default_tracker_bug: Greška default_tracker_feature: Funkcionalnost diff --git a/config/locales/sv.yml b/config/locales/sv.yml index e88d16e1a..30ac17004 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -926,7 +926,7 @@ sv: text_zoom_in: Zooma in default_role_manager: Projektledare - default_role_developper: Utvecklare + default_role_developer: Utvecklare default_role_reporter: Rapportör default_tracker_bug: Bugg default_tracker_feature: Funktionalitet diff --git a/config/locales/th.yml b/config/locales/th.yml index 71ec64696..5f68696eb 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -681,7 +681,7 @@ th: text_reassign_time_entries: 'ระบุเวลาที่ใช้ในโครงการนี่อีกครั้ง:' default_role_manager: ผู้จัดการ - default_role_developper: ผู้พัฒนา + default_role_developer: ผู้พัฒนา default_role_reporter: ผู้รายงาน default_tracker_bug: บั๊ก default_tracker_feature: ลักษณะเด่น diff --git a/config/locales/tr.yml b/config/locales/tr.yml index c542d3fd2..bc7bcbf7e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -710,7 +710,7 @@ tr: text_reassign_time_entries: 'Raporlanmış saatleri bu iletiye tekrar ata:' default_role_manager: Yönetici - default_role_developper: Geliştirici + default_role_developer: Geliştirici default_role_reporter: Raporlayıcı default_tracker_bug: Hata default_tracker_feature: ÖZellik diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 5620ad82a..5ab983325 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -611,7 +611,7 @@ uk: text_user_mail_option: "Для невибраних проектів ви отримуватимете повідомлення тільки про те, що проглядаєте або в чому берете участь (наприклад, питання автором яких ви є або які вам призначені)." default_role_manager: Менеджер - default_role_developper: Розробник + default_role_developer: Розробник default_role_reporter: Репортер звітів default_tracker_bug: Помилка default_tracker_feature: Властивість diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 2828edd0d..9d2af5e86 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -762,7 +762,7 @@ vi: 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." default_role_manager: Điều hành - default_role_developper: Phát triển + default_role_developer: Phát triển default_role_reporter: Báo cáo default_tracker_bug: Lỗi default_tracker_feature: Tính năng diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 17eff7291..7d5c8091c 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -966,7 +966,7 @@ text_zoom_out: 縮小 default_role_manager: 管理人員 - default_role_developper: 開發人員 + default_role_developer: 開發人員 default_role_reporter: 報告人員 default_tracker_bug: 臭蟲 default_tracker_feature: 功能 diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 27a48578a..49725b0a6 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -879,7 +879,7 @@ zh: text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗? default_role_manager: 管理人员 - default_role_developper: 开发人员 + default_role_developer: 开发人员 default_role_reporter: 报告人员 default_tracker_bug: 错误 default_tracker_feature: 功能 diff --git a/lib/redmine/default_data/loader.rb b/lib/redmine/default_data/loader.rb index 5eed3d9b0..e0e0cc86d 100644 --- a/lib/redmine/default_data/loader.rb +++ b/lib/redmine/default_data/loader.rb @@ -45,7 +45,7 @@ module Redmine manager.permissions = manager.setable_permissions.collect {|p| p.name} manager.save! - developper = Role.create! :name => l(:default_role_developper), + developer = Role.create! :name => l(:default_role_developer), :position => 2, :permissions => [:manage_versions, :manage_categories, @@ -146,7 +146,7 @@ module Redmine Tracker.find(:all).each { |t| [new, in_progress, resolved, feedback].each { |os| [in_progress, resolved, feedback, closed].each { |ns| - Workflow.create!(:tracker_id => t.id, :role_id => developper.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns + Workflow.create!(:tracker_id => t.id, :role_id => developer.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns } } } From c6201ae15b4fcb8ca17dbe39636e6efa626d7a03 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 02:45:34 +0000 Subject: [PATCH 07/31] Recalculate inherited attributes on parents when a child is moved under a new parent. #5524 Contributed by Jean-Baptiste Barth. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3821 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 9 ++++++++- test/unit/issue_nested_set_test.rb | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 2d0021835..7d0682df1 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -629,6 +629,7 @@ class Issue < ActiveRecord::Base end reload elsif parent_issue_id != parent_id + former_parent_id = parent_id # moving an existing issue if @parent_issue && @parent_issue.root_id == root_id # inside the same tree @@ -658,12 +659,18 @@ class Issue < ActiveRecord::Base relation.destroy unless relation.valid? end end + # update former parent + recalculate_attributes_for(former_parent_id) if former_parent_id end remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) end def update_parent_attributes - if parent_id && p = Issue.find_by_id(parent_id) + recalculate_attributes_for(parent_id) if parent_id + end + + def recalculate_attributes_for(issue_id) + if issue_id && p = Issue.find_by_id(issue_id) # priority = highest priority of children if priority_position = p.children.maximum("#{IssuePriority.table_name}.position", :include => :priority) p.priority = IssuePriority.find_by_position(priority_position) diff --git a/test/unit/issue_nested_set_test.rb b/test/unit/issue_nested_set_test.rb index 7138e4527..cda8c4e58 100644 --- a/test/unit/issue_nested_set_test.rb +++ b/test/unit/issue_nested_set_test.rb @@ -273,6 +273,15 @@ class IssueNestedSetTest < ActiveSupport::TestCase assert_equal 12, parent.reload.estimated_hours end + def test_move_parent_updates_old_parent_attributes + first_parent = create_issue! + second_parent = create_issue! + child = create_issue!(:estimated_hours => 5, :parent_issue_id => first_parent.id) + assert_equal 5, first_parent.reload.estimated_hours + child.update_attributes(:estimated_hours => 7, :parent_issue_id => second_parent.id) + assert_equal 7, second_parent.reload.estimated_hours + assert_nil first_parent.reload.estimated_hours + end def test_reschuling_a_parent_should_reschedule_subtasks parent = create_issue! From 5a17b5ba394f8084fd98d65c5d0da0fb8fff6e7f Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 02:54:15 +0000 Subject: [PATCH 08/31] Fix Chrome JavaScript bug in the pop up calendar. #5769 Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3822 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- public/javascripts/calendar/calendar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/calendar/calendar.js b/public/javascripts/calendar/calendar.js index 3c8a5912e..43ba1c1c2 100644 --- a/public/javascripts/calendar/calendar.js +++ b/public/javascripts/calendar/calendar.js @@ -1105,7 +1105,7 @@ Calendar.prototype._init = function (firstDayOfWeek, date) { var day1 = (date.getDay() - this.firstDayOfWeek) % 7; if (day1 < 0) day1 += 7; - date.setDate(-day1); + date.setDate(0-day1); date.setDate(date.getDate() + 1); var row = this.tbody.firstChild; From 43bbda1966d2f666318e1339c3f42d34761ddbaa Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 03:14:30 +0000 Subject: [PATCH 09/31] Don't style lists in a project description as a sub-project. #5752 Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3823 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- public/stylesheets/application.css | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 46fc8a88a..2067bf3db 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -343,10 +343,9 @@ form .attributes select { min-width: 50%; } ul.projects { margin: 0; padding-left: 1em; } ul.projects.root { margin: 0; padding: 0; } -ul.projects ul { border-left: 3px solid #e0e0e0; } -ul.projects li { list-style-type:none; } -ul.projects li.root { margin-bottom: 1em; } -ul.projects li.child { margin-top: 1em;} +ul.projects ul.projects { border-left: 3px solid #e0e0e0; } +ul.projects li.root { list-style-type:none; margin-bottom: 1em; } +ul.projects li.child { list-style-type:none; margin-top: 1em;} ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; } .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; } From 64d2221db526f695919eb9aba370e22ed3dc09f8 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 30 Jun 2010 03:32:18 +0000 Subject: [PATCH 10/31] Set @project so macros will work on the welcome and project list. #5781 Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3824 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/helpers/projects_helper.rb | 4 ++++ app/views/welcome/index.rhtml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e3a020818..044ccfb77 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -56,7 +56,10 @@ module ProjectsHelper s = '' if projects.any? ancestors = [] + original_project = @project projects.each do |project| + # set the project environment to please macros. + @project = project if (ancestors.empty? || project.is_descendant_of?(ancestors.last)) s << "
    \n" else @@ -75,6 +78,7 @@ module ProjectsHelper ancestors << project end s << ("
\n" * ancestors.size) + @project = original_project end s end diff --git a/app/views/welcome/index.rhtml b/app/views/welcome/index.rhtml index 279c35421..a0ada7cce 100644 --- a/app/views/welcome/index.rhtml +++ b/app/views/welcome/index.rhtml @@ -18,11 +18,13 @@

<%=l(:label_project_latest)%>

    <% for project in @projects %> + <% @project = project %>
  • <%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>) <%= textilizable project.short_description, :project => project %>
  • <% end %> + <% @project = nil %>
<% end %> From 11ff334cd86c26a432e3282e732e6b1262915248 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 1 Jul 2010 18:47:25 +0000 Subject: [PATCH 11/31] Refactor: extract @available_criterias to utility method. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3825 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/timelog_controller.rb | 95 ++++++++++++++------------- 1 file changed, 50 insertions(+), 45 deletions(-) diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb index 73ff58b82..007479ad6 100644 --- a/app/controllers/timelog_controller.rb +++ b/app/controllers/timelog_controller.rb @@ -19,6 +19,7 @@ class TimelogController < ApplicationController menu_item :issues before_filter :find_project, :authorize, :only => [:edit, :destroy] before_filter :find_optional_project, :only => [:report, :details] + before_filter :load_available_criterias, :only => [:report] verify :method => :post, :only => :destroy, :redirect_to => { :action => :details } @@ -30,51 +31,6 @@ class TimelogController < ApplicationController include CustomFieldsHelper def report - @available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id", - :klass => Project, - :label => :label_project}, - 'version' => {:sql => "#{Issue.table_name}.fixed_version_id", - :klass => Version, - :label => :label_version}, - 'category' => {:sql => "#{Issue.table_name}.category_id", - :klass => IssueCategory, - :label => :field_category}, - 'member' => {:sql => "#{TimeEntry.table_name}.user_id", - :klass => User, - :label => :label_member}, - 'tracker' => {:sql => "#{Issue.table_name}.tracker_id", - :klass => Tracker, - :label => :label_tracker}, - 'activity' => {:sql => "#{TimeEntry.table_name}.activity_id", - :klass => TimeEntryActivity, - :label => :label_activity}, - 'issue' => {:sql => "#{TimeEntry.table_name}.issue_id", - :klass => Issue, - :label => :label_issue} - } - - # Add list and boolean custom fields as available criterias - custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields) - custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf| - @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)", - :format => cf.field_format, - :label => cf.name} - end if @project - - # Add list and boolean time entry custom fields - TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| - @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)", - :format => cf.field_format, - :label => cf.name} - end - - # Add list and boolean time entry activity custom fields - TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| - @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)", - :format => cf.field_format, - :label => cf.name} - end - @criterias = params[:criterias] || [] @criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria} @criterias.uniq! @@ -308,4 +264,53 @@ private @from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) - 1 @to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) end + + def load_available_criterias + @available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id", + :klass => Project, + :label => :label_project}, + 'version' => {:sql => "#{Issue.table_name}.fixed_version_id", + :klass => Version, + :label => :label_version}, + 'category' => {:sql => "#{Issue.table_name}.category_id", + :klass => IssueCategory, + :label => :field_category}, + 'member' => {:sql => "#{TimeEntry.table_name}.user_id", + :klass => User, + :label => :label_member}, + 'tracker' => {:sql => "#{Issue.table_name}.tracker_id", + :klass => Tracker, + :label => :label_tracker}, + 'activity' => {:sql => "#{TimeEntry.table_name}.activity_id", + :klass => TimeEntryActivity, + :label => :label_activity}, + 'issue' => {:sql => "#{TimeEntry.table_name}.issue_id", + :klass => Issue, + :label => :label_issue} + } + + # Add list and boolean custom fields as available criterias + custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields) + custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf| + @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)", + :format => cf.field_format, + :label => cf.name} + end if @project + + # Add list and boolean time entry custom fields + TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| + @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)", + :format => cf.field_format, + :label => cf.name} + end + + # Add list and boolean time entry activity custom fields + TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| + @available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)", + :format => cf.field_format, + :label => cf.name} + end + + @available_criterias + end end From bd1384db7da40de4d883b6e8cca5081f414113a9 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 1 Jul 2010 18:49:25 +0000 Subject: [PATCH 12/31] Added hook :controller_timelog_available_criterias git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3826 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/timelog_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb index 007479ad6..7addff78c 100644 --- a/app/controllers/timelog_controller.rb +++ b/app/controllers/timelog_controller.rb @@ -311,6 +311,7 @@ private :label => cf.name} end + call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project }) @available_criterias end end From 48a5460da4be45e0e7e5946b870b9a91ee27f086 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Mon, 5 Jul 2010 18:00:50 +0000 Subject: [PATCH 13/31] Allow js formatted responses. Otherwise they return the invalid format error (406) instead of 403, 404, or 500 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3827 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/application_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 909125475..6e5634dbc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -130,6 +130,7 @@ class ApplicationController < ActionController::Base format.html { redirect_to :controller => "account", :action => "login", :back_url => url } format.atom { redirect_to :controller => "account", :action => "login", :back_url => url } format.xml { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } + format.js { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } format.json { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' } end return false @@ -240,6 +241,7 @@ class ApplicationController < ActionController::Base format.html { render :template => "common/403", :layout => (request.xhr? ? false : 'base'), :status => 403 } format.atom { head 403 } format.xml { head 403 } + format.js { head 403 } format.json { head 403 } end return false @@ -250,6 +252,7 @@ class ApplicationController < ActionController::Base format.html { render :template => "common/404", :layout => !request.xhr?, :status => 404 } format.atom { head 404 } format.xml { head 404 } + format.js { head 404 } format.json { head 404 } end return false @@ -263,6 +266,7 @@ class ApplicationController < ActionController::Base } format.atom { head 500 } format.xml { head 500 } + format.js { head 500 } format.json { head 500 } end end From 56af944afa1406358685a568072bc7eaed5143ef Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 6 Jul 2010 02:07:46 +0000 Subject: [PATCH 14/31] Extend changes.path and changes.from_path to support longer paths. #5771 Long paths to SCM files would be truncated or wouldn't insert into some databases. This extends those fields to support arbitrary length filenames. Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3828 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- ...164950_change_changes_path_length_limit.rb | 11 +++++++++++ .../repositories/git_repository.tar.gz | Bin 17716 -> 19452 bytes .../repositories_git_controller_test.rb | 3 ++- .../redmine/scm/adapters/git_adapter_test.rb | 2 +- test/unit/repository_git_test.rb | 8 ++++---- 5 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20100705164950_change_changes_path_length_limit.rb diff --git a/db/migrate/20100705164950_change_changes_path_length_limit.rb b/db/migrate/20100705164950_change_changes_path_length_limit.rb new file mode 100644 index 000000000..5f34d5dcf --- /dev/null +++ b/db/migrate/20100705164950_change_changes_path_length_limit.rb @@ -0,0 +1,11 @@ +class ChangeChangesPathLengthLimit < ActiveRecord::Migration + def self.up + change_column :changes, :path, :text, :default => "", :null => false + change_column :changes, :from_path, :text + end + + def self.down + change_column :changes, :path, :string, :default => "", :null => false + change_column :changes, :from_path, :string + end +end diff --git a/test/fixtures/repositories/git_repository.tar.gz b/test/fixtures/repositories/git_repository.tar.gz index 48966da30bf58b5d804ee9b51deb0dcce9da4edb..8158d583244a12064c1d48d20eb64427d56d3159 100644 GIT binary patch literal 19452 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%0A>0n{OjKsIMt(ySXTBznrqD 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 literal 17716 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 true).length + assert_equal 13, @adapter.revisions('',nil,nil,:all => true).length end def test_annotate diff --git a/test/unit/repository_git_test.rb b/test/unit/repository_git_test.rb index 71b3e4da5..dad5610ae 100644 --- a/test/unit/repository_git_test.rb +++ b/test/unit/repository_git_test.rb @@ -34,8 +34,8 @@ class RepositoryGitTest < ActiveSupport::TestCase @repository.fetch_changesets @repository.reload - assert_equal 12, @repository.changesets.count - assert_equal 21, @repository.changes.count + assert_equal 13, @repository.changesets.count + assert_equal 22, @repository.changes.count commit = @repository.changesets.find(:first, :order => 'committed_on ASC') assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments @@ -57,10 +57,10 @@ class RepositoryGitTest < ActiveSupport::TestCase # Remove the 3 latest changesets @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy) @repository.reload - assert_equal 9, @repository.changesets.count + assert_equal 10, @repository.changesets.count @repository.fetch_changesets - assert_equal 12, @repository.changesets.count + assert_equal 13, @repository.changesets.count end else puts "Git test repository NOT FOUND. Skipping unit tests !!!" From ad73f12a6b24ae4c835187f787672345e636a21e Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 6 Jul 2010 02:22:03 +0000 Subject: [PATCH 15/31] Include visible subprojects when checking for available Activity event types. #5589 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed by Felix Schäfer git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3829 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/activity/fetcher.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine/activity/fetcher.rb b/lib/redmine/activity/fetcher.rb index fb73d5d28..6edc18f3f 100644 --- a/lib/redmine/activity/fetcher.rb +++ b/lib/redmine/activity/fetcher.rb @@ -38,7 +38,7 @@ module Redmine return @event_types unless @event_types.nil? @event_types = Redmine::Activity.available_event_types - @event_types = @event_types.select {|o| @user.allowed_to?("view_#{o}".to_sym, @project)} if @project + @event_types = @event_types.select {|o| @project.self_and_descendants.detect {|p| @user.allowed_to?("view_#{o}".to_sym, p)}} if @project @event_types end From 0d5fca9ba5ac81db46211b6cc06686e59c57beb4 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 6 Jul 2010 21:06:09 +0000 Subject: [PATCH 16/31] Force the default value of path to be set on the Change model class. #5771 This is needed because MySQL does not support default values on text columns (Error introduced in r3828) Contributed by Holger Just git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3830 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/change.rb | 4 ++++ db/migrate/20100705164950_change_changes_path_length_limit.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/change.rb b/app/models/change.rb index 385fe5acb..e5c1585b4 100644 --- a/app/models/change.rb +++ b/app/models/change.rb @@ -23,4 +23,8 @@ class Change < ActiveRecord::Base def relative_path changeset.repository.relative_path(path) end + + def before_save + path ||= "" + end end diff --git a/db/migrate/20100705164950_change_changes_path_length_limit.rb b/db/migrate/20100705164950_change_changes_path_length_limit.rb index 5f34d5dcf..62ba4ec22 100644 --- a/db/migrate/20100705164950_change_changes_path_length_limit.rb +++ b/db/migrate/20100705164950_change_changes_path_length_limit.rb @@ -1,6 +1,6 @@ class ChangeChangesPathLengthLimit < ActiveRecord::Migration def self.up - change_column :changes, :path, :text, :default => "", :null => false + change_column :changes, :path, :text, :null => false change_column :changes, :from_path, :text end From ef5bca0fefea59abd5b9b56140c6f10530a4d302 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 8 Jul 2010 03:46:14 +0000 Subject: [PATCH 17/31] Have Redmine.pm respect the Authentication Required setting. #5797 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3831 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- extra/svn/Redmine.pm | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/extra/svn/Redmine.pm b/extra/svn/Redmine.pm index 1b3b0910f..f608ee124 100644 --- a/extra/svn/Redmine.pm +++ b/extra/svn/Redmine.pm @@ -227,9 +227,38 @@ sub authen_handler { } } +# check if authentication is forced +sub is_authentication_forced { + my $r = shift; + + my $dbh = connect_database($r); + my $sth = $dbh->prepare( + "SELECT value FROM settings where settings.name = 'login_required';" + ); + + $sth->execute(); + my $ret = 0; + if (my @row = $sth->fetchrow_array) { + if ($row[0] eq "1" || $row[0] eq "t") { + $ret = 1; + } + } + $sth->finish(); + undef $sth; + + $dbh->disconnect(); + undef $dbh; + + $ret; +} + sub is_public_project { my $project_id = shift; my $r = shift; + + if (is_authentication_forced($r)) { + return 0; + } my $dbh = connect_database($r); my $sth = $dbh->prepare( From 69af1515d1fd7e9cf2ae01b19f075d5483f46cc1 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 8 Jul 2010 03:46:19 +0000 Subject: [PATCH 18/31] Check the browse repository or commit access permissions in Redmine.pm with LDAP. #5797 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3832 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- extra/svn/Redmine.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extra/svn/Redmine.pm b/extra/svn/Redmine.pm index f608ee124..091e21930 100644 --- a/extra/svn/Redmine.pm +++ b/extra/svn/Redmine.pm @@ -338,7 +338,9 @@ sub is_member { bindpw => $rowldap[4] ? $rowldap[4] : "", filter => "(".$rowldap[6]."=%s)" ); - $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass)); + my $method = $r->method; + $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass) && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/)); + } $sthldap->finish(); undef $sthldap; From 83f1ecb980b8c52a3d4101062340a4491603c7fb Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 8 Jul 2010 03:53:01 +0000 Subject: [PATCH 19/31] Update the CHANGELOG for 0.9.6 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3835 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- doc/CHANGELOG | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 8d23117fd..240b11609 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -8,7 +8,12 @@ http://www.redmine.org/ Adds context menu to the roadmap issue lists +== 2010-07-07 v0.9.6 + +Fixed: Redmine.pm access by unauthorized users + == 2010-06-24 v0.9.5 + Linkify folder names on revision view "fiters" and "options" should be hidden in print view via css Fixed: NoMethodError when no issue params are submitted From a84ea6866dd302a90b39de08baa5d1982da82585 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Thu, 8 Jul 2010 03:53:07 +0000 Subject: [PATCH 20/31] Version 0.9.6 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3836 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb index 3e84bd17c..65aaf4bd5 100644 --- a/lib/redmine/version.rb +++ b/lib/redmine/version.rb @@ -4,7 +4,7 @@ module Redmine module VERSION #:nodoc: MAJOR = 0 MINOR = 9 - TINY = 5 + TINY = 6 # Branch values: # * official release: nil From cd54efa0c937e18fa163d2d40d43e45f25050400 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 9 Jul 2010 13:46:20 +0000 Subject: [PATCH 21/31] Force the test RAILS_ENV to help prevent purging data when mistyping. #4572 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3840 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- test/test_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 1f735f5f6..c934e1bc2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -15,7 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -ENV["RAILS_ENV"] ||= "test" +ENV["RAILS_ENV"] = "test" require File.expand_path(File.dirname(__FILE__) + "/../config/environment") require 'test_help' require File.expand_path(File.dirname(__FILE__) + '/helper_testcase') From 5e259d41e2c1bccd3ffe7de7267ff8015c0df54f Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 16 Jul 2010 03:11:35 +0000 Subject: [PATCH 22/31] Fix typos in the examples. #5823 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3841 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/plugin.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb index 2be8ac8aa..11255e02d 100644 --- a/lib/redmine/plugin.rb +++ b/lib/redmine/plugin.rb @@ -202,10 +202,10 @@ module Redmine #:nodoc: # permission :say_hello, { :example => :say_hello } # # # A permission that can be given to registered users only - # permission :say_hello, { :example => :say_hello }, :require => loggedin + # permission :say_hello, { :example => :say_hello }, :require => :loggedin # # # A permission that can be given to project members only - # permission :say_hello, { :example => :say_hello }, :require => member + # permission :say_hello, { :example => :say_hello }, :require => :member def permission(name, actions, options = {}) if @project_module Redmine::AccessControl.map {|map| map.project_module(@project_module) {|map|map.permission(name, actions, options)}} From c6223864d061377331b0c8e53f94fe20cbe77084 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 16 Jul 2010 03:16:29 +0000 Subject: [PATCH 23/31] Add :view_issues_index_bottom hook. #5169 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3842 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/views/issues/index.rhtml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/issues/index.rhtml b/app/views/issues/index.rhtml index beece6275..1778f4d64 100644 --- a/app/views/issues/index.rhtml +++ b/app/views/issues/index.rhtml @@ -70,6 +70,7 @@ <% end %> <% end %> +<%= call_hook(:view_issues_index_bottom, { :issues => @issues, :project => @project, :query => @query }) %> <% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> From d064f272710a201c2dad2682e8ce05ed05143b74 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 16 Jul 2010 03:25:03 +0000 Subject: [PATCH 24/31] Updating CHANGELOG for 1.0 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3843 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- doc/CHANGELOG | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 240b11609..d6b81944d 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -4,9 +4,82 @@ Redmine - project management software Copyright (C) 2006-2010 Jean-Philippe Lang http://www.redmine.org/ -== v1.0.0 +== v1.0.0 (Release candidate) + +#443: Adds context menu to the roadmap issue lists +#443: Subtasking +#741: Description preview while editing an issue +#1131: Add support for alternate (non-LDAP) authentication +#1214: REST API for Issues +#1223: File upload on wiki edit form +#1755: add "blocked by" as a related issues option +#2420: Fetching emails from an POP server +#2482: Named scopes in Issue and ActsAsWatchable plus some view refactoring (logic extraction). +#2924: Make the right click menu more discoverable using a cursor property +#2985: Make syntax highlighting pluggable +#3201: Workflow Check/Uncheck All Rows/Columns +#3359: Update CodeRay 0.9 +#3706: Allow assigned_to field configuration on Issue creation by email +#3936: configurable list of models to include in search +#4480: Create a link to the user profile from the administration interface +#4482: Cache textile rendering +#4572: Make it harder to ruin your database +#4573: Move github gems to Gemcutter +#4664: Add pagination to forum threads +#4732: Make login case-insensitive also for PostgreSQL +#4812: Create links to other projects +#4819: Replace images with smushed ones for speed +#4945: Allow custom fields attached to project to be searchable +#5121: Fix issues list layout overflow +#5169: Issue list view hook request +#5208: Aibility to edit wiki sidebar +#5281: Remove empty ul tags in the issue history +#5291: Updated basque translations +#5328: Automatically add "Repository" menu_item after repository creation +#5415: Fewer SQL statements generated for watcher_recipients +#5416: Exclude "fields_for" from overridden methods in TabularFormBuilder +#5573: Allow issue assignment in email +#5595: Allow start date and due dates to be set via incoming email +#5752: The projects view (/projects) renders ul's wrong +#5781: Allow to use more macros on the welcome page and project list +Fixed #1288: Unable to past escaped wiki syntax in an issue description +Fixed #1334: Wiki formatting character *_ and _* +Fixed #1416: Inline code with less-then/greater-than produces @lt; and @gt; respectively +Fixed #2473: Login and mail should not be case sensitive +Fixed #2990: Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate +Fixed #3089: Text formatting sometimes breaks when combined +Fixed #3690: Status change info duplicates on the issue screen +Fixed #3691: Redmine allows two files with the same file name to be uploaded to the same issue +Fixed #3764: ApplicationHelperTest fails with JRuby +Fixed #4265: Unclosed code tags in issue descriptions affects main UI +Fixed #4745: Bug in index.xml.builder (issues) +Fixed #4852: changing user/roles of project member not possible without javascript +Fixed #4857: Week number calculation in date picker is wrong if a week starts with Sunday +Fixed #4883: Bottom "contextual" placement in issue with associated changeset +Fixed #4918: Revisions r3453 and r3454 broke On-the-fly user creation with LDAP +Fixed #4935: Navigation to the Master Timesheet page (time_entries) +Fixed #5043: Flash messages are not displayed after the project settings[module/activity] saved +Fixed #5081: Broken links on public/help/wiki_syntax_detailed.html +Fixed #5104: Description of document not wikified on documents index +Fixed #5108: Issue linking fails inside of []s +Fixed #5199: diff code coloring using coderay +Fixed #5233: Add a hook to the issue report (Summary) view +Fixed #5265: timetracking: subtasks time is added to the main task +Fixed #5343: acts_as_event Doesn't Accept Outside URLs +Fixed #5440: UI Inconsistency : Administration > Enumerations table row headers should be enclosed in +Fixed #5463: 0.9.4 INSTALL and/or UPGRADE, missing session_store.rb +Fixed #5524: Update_parent_attributes doesn't work for the old parent issue when reparenting +Fixed #5548: SVN Repository: Can not list content of a folder which includes square brackets. +Fixed #5589: "with subproject" malfunction +Fixed #5676: Search for Numeric Value +Fixed #5696: Redmine + PostgreSQL 8.4.4 fails on _dir_list_content.rhtml +Fixed #5698: redmine:email:receive_imap fails silently for mails with subject longer than 255 characters +Fixed #5700: TimelogController#destroy assumes success +Fixed #5751: developer role is mispelled +Fixed #5769: Popup Calendar doesn't Advance in Chrome +Fixed #5771: Problem when importing git repository +Fixed #5823: Error in comments in plugin.rb -Adds context menu to the roadmap issue lists == 2010-07-07 v0.9.6 From 9cfa15917daaf0641a6c52b72bbacf1463adad67 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 16 Jul 2010 03:45:50 +0000 Subject: [PATCH 25/31] Added an official favicon.ico git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3845 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- public/favicon.ico | Bin 0 -> 7886 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..51c1aeb09896dfa4de1de34d55fc062e9b6eb351 100644 GIT binary patch literal 7886 zcmeHMdu&rx82{#AecX;MptvZ|#Rp1EbiPpIWBegR@ktE&mx(4CA%L$$6OA&+d_W?> zs9=_`t*wZPNDLB!1~OpCqqpmv>j2l=c56G3fUqILkZs4`xu^H`uD$Eptwdw?C13Bk z=X~GqJFk6@JE8(Aq|#CXmD7T8L^IJUD--W4Y(#bFD=!!CUqf#C1fm=9%2jxGf%=Pv z75u*=*M~%&R>7`$!!OVMdQ#rK1MLAYOYoxM^*tXM5JUld~vxbZ1uS8m7HMRKV6$H!B2rbMw$al(jnFWe zcSb078BrDZ(hCXOj#V3B3A;;E%X3#BI^o17B2Mo;$wht|W$z z)rh`+*u|~X*nOO6-F3O+*WaJS(6QiyJ%0`E=YGAOU+)~rHD@pmx8Z&peZlnpy4!LD zhq&vhbe!7z(Dym)1Tel1&znVDXmI3?|MO&`%{XJe4%b#-?M8+%m8ceeetsblk0HJn z;q%?9zt7o#ZyWSJL9BaJsBQ!%CmsXj1z@bfhrQ>qNIoLQvi;o-&*Q^AQFVDd^nw$1 z;GW3$GWc&WuywvRTXdpdo;K)ljMLbM$CLWro6r|c$RMwfeq#4(_yf1@y7Ue7{razyx@A#GK|* z#Jq)whXZ(iPjuv}R7w3^ic~@kwZBH*_A^fruSnVcI72Cf5Dj`pV^{eC-RauJH?i&bG0aQ$rgDg9V6SGE<5s+ z8rV3H$XfziOmk@IMd4kYuH@g>{hNPCPrw$u7`&)=Z78QRilM zjQUt5buV>N_Z%nnHadw_18ezUJp55pId~RW&%=1f7>(_~*bW$Wz>R#s{Z%@9;79X8 zYmjr9;j4X!yPgZ_`J0*}B7e>Y)m>qZujaaq7#lDjclq;S9oUo2@m2dC>qvBN&{M%6yv-J8*_ME-!hxd!=GzKE}5!k$?qetMQv-OD%31|?Wx3bYk4QQ5BUhr!iW1YTJoI~STgRpZ@D>|w+v%lLQc>1 zVPEbrm(R9$FLHDvp4!Ga`*7z{iPtV^vY3Mxwcbd{|AaZF{9QVtcdfasANO;lq<(|s z=a|Ax52PcuVx2y|H<~Q|{=Huk@!WKzbO3i-ZpSy(egkgX&}i~@$niR?M%2|@GEj#4 zX7SKEW+SMTBn5RLue&($`{ivC_gY>g`pka!AXebJt431rS=1+@X0o=M?3pHLe4;L} zhu4VuNjW8IOl`cORBL5^wn(URw&*n&uk$!tLJvYOL*2pG9r}2Xo?5R4U%QeYz1aWZWVw%~e>fSPq} zYTZ{v5v2SLR?Go)Wn#ayrxeqyEvp z)AR56F~6C8-iKOwThdhGP9!_>&I&uI2 literal 0 HcmV?d00001 From 09a681db8bdd56af7057f57602a098289ac05a40 Mon Sep 17 00:00:00 2001 From: Azamat Hackimov Date: Fri, 16 Jul 2010 16:47:00 +0000 Subject: [PATCH 26/31] Translation updates * ru * sv (#5740) * pt-BR (#5785) * zh (#5158, #5883) * zh-TW (#5735) git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3847 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- config/locales/pt-BR.yml | 4 ++-- config/locales/ru.yml | 4 ++-- config/locales/sv.yml | 4 ++-- config/locales/zh-TW.yml | 4 ++-- config/locales/zh.yml | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index e3cf7d1c0..9365505d0 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -930,5 +930,5 @@ pt-BR: notice_failed_to_save_members: "Falha ao gravar membro(s): {{errors}}." text_zoom_out: Afastar zoom text_zoom_in: Aproximar zoom - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time + notice_unable_delete_time_entry: Não foi possível excluir a entrada no registro de horas trabalhadas. + label_overall_spent_time: Tempo gasto geral diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 5386c1fca..cce123622 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1022,5 +1022,5 @@ ru: field_principal: Глава text_zoom_out: Отдалить text_zoom_in: Приблизить - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time + notice_unable_delete_time_entry: Невозможно удалить запись журнала. + label_overall_spent_time: Всего затрачено времени diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 30ac17004..23450007a 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -203,6 +203,7 @@ sv: notice_account_pending: "Ditt konto skapades och avvaktar nu administratörens godkännande." notice_default_data_loaded: Standardkonfiguration inläst. notice_unable_delete_version: Denna version var inte möjlig att ta bort. + notice_unable_delete_time_entry: Tidloggning kunde inte tas bort. notice_issue_done_ratios_updated: % klart uppdaterade. error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: {{value}}" @@ -689,6 +690,7 @@ sv: label_changes_details: Detaljer om alla ändringar label_issue_tracking: Ärendeuppföljning label_spent_time: Spenderad tid + label_overall_spent_time: Total tid spenderad label_f_hour: "{{value}} timme" label_f_hour_plural: "{{value}} timmar" label_time_tracking: Tidsuppföljning @@ -951,5 +953,3 @@ sv: enumeration_doc_categories: Dokumentkategorier enumeration_activities: Aktiviteter (tidsuppföljning) enumeration_system_activity: Systemaktivitet - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 7d5c8091c..fc5f557d1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -243,6 +243,7 @@ notice_account_pending: "您的帳號已經建立,正在等待管理員的審核。" notice_default_data_loaded: 預設組態已載入成功。 notice_unable_delete_version: 無法刪除版本。 + notice_unable_delete_time_entry: 無法刪除工時記錄項目。 notice_issue_done_ratios_updated: 項目完成百分比已更新。 error_can_t_load_default_data: "無法載入預設組態: {{value}}" @@ -729,6 +730,7 @@ label_changes_details: 所有變更的明細 label_issue_tracking: 項目追蹤 label_spent_time: 耗用工時 + label_overall_spent_time: 整體耗用工時 label_f_hour: "{{value}} 小時" label_f_hour_plural: "{{value}} 小時" label_time_tracking: 工時追蹤 @@ -991,5 +993,3 @@ enumeration_doc_categories: 文件分類 enumeration_activities: 活動 (時間追蹤) enumeration_system_activity: 系統活動 - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 49725b0a6..6fdb33f52 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -428,7 +428,7 @@ zh: one: 1 个项目 other: "{{count}} 个项目" label_project_all: 所有的项目 - label_project_latest: 最近更新的项目 + label_project_latest: 最近的项目 label_issue: 问题 label_issue_new: 新建问题 label_issue_plural: 问题 @@ -592,10 +592,10 @@ zh: label_all_time: 全部时间 label_yesterday: 昨天 label_this_week: 本周 - label_last_week: 下周 + label_last_week: 上周 label_last_n_days: "最后 {{count}} 天" label_this_month: 本月 - label_last_month: 下月 + label_last_month: 上月 label_this_year: 今年 label_date_range: 日期范围 label_less_than_ago: 之前天数少于 From 6807d070da908e6858d36b461deb9311c6e6f342 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 18 Jul 2010 15:19:04 +0000 Subject: [PATCH 27/31] Updated the INSTALL and UPGRADING documents for the 1.0 release. Contributed by Mischa The Evil git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3848 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- doc/INSTALL | 80 +++++++++++++++++++++++++++++++++------------------ doc/UPGRADING | 60 +++++++++++++++++++++++++++----------- 2 files changed, 96 insertions(+), 44 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index a4e4312eb..7a0e1a12f 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -11,61 +11,85 @@ http://www.redmine.org/ * Ruby on Rails 2.3.5 (official downloadable Redmine releases are packaged with the appropriate Rails version) - + +* Rack 1.0.1 + +* RubyGems 1.3.1 + +* Rake 0.8.3 + * A database: * MySQL (tested with MySQL 5) * PostgreSQL (tested with PostgreSQL 8.1) * SQLite (tested with SQLite 3) Optional: -* SVN binaries >= 1.3 (needed for repository browsing, must be available in PATH) -* RMagick (gantt export to png) +* SCM binaries (e.g. svn), for repository browsing (must be available in PATH) +* RMagick (to enable Gantt export to png images) +* Ruby OpenID Library >= version 2 (to enable OpenID support) == Installation 1. Uncompress the program archive - + 2. Create an empty database: "redmine" for example -3. Configure database parameters in config/database.yml - for "production" environment (default database is MySQL) +3. Configure the database parameters in config/database.yml + for the "production" environment (default database is MySQL) 4. Generate a session store secret + Redmine stores session data in cookies by default, which requires - a secret to be generated. Run: - rake generate_session_store + a secret to be generated. Under the application main directory run: + rake generate_session_store + +5. Create the database structure -5. Create the database structure. Under the application main directory: - rake db:migrate RAILS_ENV="production" - It will create tables and an administrator account. + Under the application main directory run: + rake db:migrate RAILS_ENV="production" + + It will create all the tables and an administrator account. + +6. Setting up permissions (Windows users have to skip this section) -6. Setting up permissions The user who runs Redmine must have write permission on the following - subdirectories: files, log, tmp (create the last one if not present). + subdirectories: files, log, tmp & public/plugin_assets (create the last + two if they are not yet present). + + Assuming you run Redmine with a user named "redmine": + mkdir tmp public/plugin_assets + sudo chown -R redmine:redmine files log tmp public/plugin_assets + sudo chmod -R 755 files log tmp public/plugin_assets - Assuming you run Redmine with a user named redmine: - mkdir tmp - sudo chown -R redmine:redmine files log tmp - sudo chmod -R 755 files log tmp - -7. Test the installation by running WEBrick web server: - ruby script/server -e production - +7. Test the installation by running the WEBrick web server + + Under the main application directory run: + ruby script/server -e production + Once WEBrick has started, point your browser to http://localhost:3000/ - You should now see the application welcome page + You should now see the application welcome page. -8. Use default administrator account to log in: +8. Use the default administrator account to log in: login: admin password: admin - Go to "Administration" to load the default configuration data (roles, - trackers, statuses, workflow) and adjust application settings + Go to "Administration" to load the default configuration data (roles, + trackers, statuses, workflow) and to adjust the application settings - -== Email delivery Configuration +== SMTP server Configuration Copy config/email.yml.example to config/email.yml and edit this file to adjust your SMTP settings. -Don't forget to restart the application after any change to this file. +Do not forget to restart the application after any change to this file. Please do not enter your SMTP settings in environment.rb. + +== References + +* http://www.redmine.org/wiki/redmine/RedmineInstall +* http://www.redmine.org/wiki/redmine/EmailConfiguration +* http://www.redmine.org/wiki/redmine/RedmineSettings +* http://www.redmine.org/wiki/redmine/RedmineRepositories +* http://www.redmine.org/wiki/redmine/RedmineReceivingEmails +* http://www.redmine.org/wiki/redmine/RedmineReminderEmails +* http://www.redmine.org/wiki/redmine/RedmineLDAP diff --git a/doc/UPGRADING b/doc/UPGRADING index a9b81d177..87f169c9d 100644 --- a/doc/UPGRADING +++ b/doc/UPGRADING @@ -1,4 +1,4 @@ -== Redmine upgrade procedure +== Redmine upgrade Redmine - project management software Copyright (C) 2006-2010 Jean-Philippe Lang @@ -8,26 +8,54 @@ http://www.redmine.org/ == Upgrading 1. Uncompress the program archive in a new directory - + 2. Copy your database settings (RAILS_ROOT/config/database.yml) - and SMTP settings (RAILS_ROOT/config/email.yml) - into the new config directory + and SMTP settings (RAILS_ROOT/config/email.yml) into the new + config directory + +3. Copy the RAILS_ROOT/files directory content into your new installation + This directory contains all the attached files. + +4. Copy the folders of the installed plugins and themes into new installation + +5. Generate a session store secret + + Redmine stores session data in cookies by default, which requires + a secret to be generated. Under the new application directory run: + rake generate_session_store + DO NOT REPLACE OR EDIT ANY OTHER FILES. -3. Generate a session store secret - Redmine stores session data in cookies by default, which requires - a secret to be generated. Run: - rake generate_session_store - -4. Migrate your database (please make a backup before doing this): - rake db:migrate RAILS_ENV="production" +6. Migrate your database -5. Copy the RAILS_ROOT/files directory content into your new installation - This directory contains all the attached files + If you are upgrading to Rails 2.3.5 as part of this migration, you + need to upgrade the plugin migrations before running the plugin migrations + using: + rake db:migrate:upgrade_plugin_migrations RAILS_ENV="production" + + Please make a backup before doing this! Under the new application + directory run: + rake db:migrate RAILS_ENV="production" + + If you have installed any plugins, you should also run their database + migrations using: + rake db:migrate_plugins RAILS_ENV="production" + +7. Clean up + + Clear the cache and the existing sessions by running: + rake tmp:cache:clear + rake tmp:sessions:clear + +8. Restart the application server (e.g. mongrel, thin, passenger) + +9. Finally go to "Administration -> Roles & permissions" to check/set permissions + for new features, if any == Notes -1. Rails 2.3.5 is required for version 0.9. +* Rails 2.3.5 is required for versions 0.9.x and 1.0.x. -2. When upgrading your code with svn update, don't forget to clear - the application cache (RAILS_ROOT/tmp/cache) before restarting. +== References + +* http://www.redmine.org/wiki/redmine/RedmineUpgrade From c087e6f89561df032f983212a2b023fac8d078be Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 18 Jul 2010 15:49:24 +0000 Subject: [PATCH 28/31] Readme update. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3849 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index fb70acaac..10c170474 100644 --- a/README.rdoc +++ b/README.rdoc @@ -2,4 +2,4 @@ Redmine is a flexible project management web application written using Ruby on Rails framework. -More details can be found at http://www.redmine.org +More details can be found at in the doc directory or on the official website http://www.redmine.org From 854ba2a8d26e461923b909a036b6ebbb122dc1c7 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 18 Jul 2010 16:35:37 +0000 Subject: [PATCH 29/31] Adding 1.0.0's release date. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3853 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- doc/CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index d6b81944d..4a100bfce 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -4,7 +4,7 @@ Redmine - project management software Copyright (C) 2006-2010 Jean-Philippe Lang http://www.redmine.org/ -== v1.0.0 (Release candidate) +== 2010-07-18 v1.0.0 (Release candidate) #443: Adds context menu to the roadmap issue lists #443: Subtasking From fa8d0c5c6fe036916eb49779e82d9d5cf05de315 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Sun, 18 Jul 2010 16:35:43 +0000 Subject: [PATCH 30/31] Bump version to 1.0.0 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3854 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/version.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb index 65aaf4bd5..5ea62f3e0 100644 --- a/lib/redmine/version.rb +++ b/lib/redmine/version.rb @@ -2,9 +2,9 @@ require 'rexml/document' module Redmine module VERSION #:nodoc: - MAJOR = 0 - MINOR = 9 - TINY = 6 + MAJOR = 1 + MINOR = 0 + TINY = 0 # Branch values: # * official release: nil From 4fef8b601d3b4095dc353d917828d09b297a17b1 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 20 Jul 2010 23:50:15 +0000 Subject: [PATCH 31/31] Added icon for the LDAP authentication menu item. #5775 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3859 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/views/admin/_menu.rhtml | 2 +- app/views/settings/_authentication.rhtml | 2 +- public/images/server_key.png | Bin 0 -> 746 bytes public/stylesheets/application.css | 2 ++ 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 public/images/server_key.png diff --git a/app/views/admin/_menu.rhtml b/app/views/admin/_menu.rhtml index 9b3bc66b4..4fc08d888 100644 --- a/app/views/admin/_menu.rhtml +++ b/app/views/admin/_menu.rhtml @@ -3,7 +3,7 @@
  • <%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %>
  • <%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %>
  • <%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %>
  • -
  • <%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %>
  • +
  • <%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'server_authentication' %>
  • <%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %>
  • <%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %>
  • <%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %>
  • diff --git a/app/views/settings/_authentication.rhtml b/app/views/settings/_authentication.rhtml index 7e8e693df..da29bb704 100644 --- a/app/views/settings/_authentication.rhtml +++ b/app/views/settings/_authentication.rhtml @@ -20,7 +20,7 @@
    - <%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %> + <%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'icon icon-server-authentication' %>
    <%= submit_tag l(:button_save) %> diff --git a/public/images/server_key.png b/public/images/server_key.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd517425f0cf0a573f091656a0c69e294b6197f GIT binary patch literal 746 zcmVR5;6} zlS@n!Q51&%dDs?eX$!L{YO$aaAT^% z8wrtxVNvT!(-=&NwM9+Zn#dzTR2m+|($3p^r?x7Vm6P0@nLFqI&VSCGVRT)`|6Kge zjaV!eR1{@UmSvtqkZ3GPl4zXp`~BxC0uqUYod_N{91g$PTn&+kplLAt5tmM<1L1J! zEP47D5Rb=CQn4Ti`>a+g<`U7ws?&F_ zfzvp|MzQqNH!H3#j~%}BVf-%##aZb_G6l4GJB;cj7tG=`j&}>Nw_Z7xnHjztyK`i@ z<3{><*+B_lKuBdOqW7yc^Z1f_jE;l*VQ=n3ZZU*Cw&q%gTbv4AZ5(1tfU;QqJva(_ zn7WS!r2xBk0P6N9ScH1;)qty~y}GH@J!&|h!zq1{)G}>Brx3Dtt?nj-%`oKk1+ZKO z44Z?gCIb|<@nc2g$}P}S;5e?>w@Rn3!6Yu>fc6sRS^`$SgVipF07*qoM6N<$f~LGuF8}}l literal 0 HcmV?d00001 diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 2067bf3db..60c50d2b2 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -64,6 +64,7 @@ h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; bord #admin-menu a.settings { background-image: url(../images/changeset.png); } #admin-menu a.plugins { background-image: url(../images/plugin.png); } #admin-menu a.info { background-image: url(../images/help.png); } +#admin-menu a.server_authentication { background-image: url(../images/server_key.png); } #main {background-color:#EEEEEE;} @@ -837,6 +838,7 @@ padding-bottom: 3px; .icon-report { background-image: url(../images/report.png); } .icon-comment { background-image: url(../images/comment.png); } .icon-summary { background-image: url(../images/lightning.png); } +.icon-server-authentication { background-image: url(../images/server_key.png); } .icon-file { background-image: url(../images/files/default.png); } .icon-file.text-plain { background-image: url(../images/files/text.png); }