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
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
diff --git a/app/controllers/timelog_controller.rb b/app/controllers/timelog_controller.rb
index 73ff58b82..7addff78c 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,54 @@ 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
+
+ call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
+ @available_criterias
+ end
end
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/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/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/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/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' %>
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/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 %>
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..9365505d0 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
@@ -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/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..cce123622 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: Ошибка
@@ -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/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..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
@@ -926,7 +928,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
@@ -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/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..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: 工時追蹤
@@ -966,7 +968,7 @@
text_zoom_out: 縮小
default_role_manager: 管理人員
- default_role_developper: 開發人員
+ default_role_developer: 開發人員
default_role_reporter: 報告人員
default_tracker_bug: 臭蟲
default_tracker_feature: 功能
@@ -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 27a48578a..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: 之前天数少于
@@ -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/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..62ba4ec22
--- /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, :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/doc/CHANGELOG b/doc/CHANGELOG
index 2393282e4..4a100bfce 100644
--- a/doc/CHANGELOG
+++ b/doc/CHANGELOG
@@ -4,9 +4,99 @@ Redmine - project management software
Copyright (C) 2006-2010 Jean-Philippe Lang
http://www.redmine.org/
-== v1.0.0
+== 2010-07-18 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
+
+
+== 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
+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
-Adds context menu to the roadmap issue lists
== 2010-05-01 v0.9.4
diff --git a/doc/INSTALL b/doc/INSTALL
index eb7669c60..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 config/initializers/session_store.rb
+ 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 fe69676a2..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
- DO NOT REPLACE ANY OTHERS FILES.
+ and SMTP settings (RAILS_ROOT/config/email.yml) into the new
+ config directory
-3. Generate a session store secret
+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. Run:
- rake config/initializers/session_store.rb
-
-4. Migrate your database (please make a backup before doing this):
- rake db:migrate RAILS_ENV="production"
+ a secret to be generated. Under the new application directory run:
+ rake generate_session_store
+
+ DO NOT REPLACE OR EDIT ANY OTHER FILES.
-5. Copy the RAILS_ROOT/files directory content into your new installation
- This directory contains all the attached files
+6. Migrate your database
+
+ 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
diff --git a/extra/svn/Redmine.pm b/extra/svn/Redmine.pm
index 1b3b0910f..091e21930 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(
@@ -309,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;
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
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
}
}
}
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)}}
diff --git a/lib/redmine/version.rb b/lib/redmine/version.rb
index f9f536032..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 = 4
+ MAJOR = 1
+ MINOR = 0
+ TINY = 0
# Branch values:
# * official release: nil
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/public/favicon.ico b/public/favicon.ico
index e69de29bb..51c1aeb09 100644
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/public/images/server_key.png b/public/images/server_key.png
new file mode 100644
index 000000000..ecd517425
Binary files /dev/null and b/public/images/server_key.png differ
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;
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index 46fc8a88a..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;}
@@ -343,10 +344,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%; }
@@ -838,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); }
diff --git a/test/fixtures/repositories/git_repository.tar.gz b/test/fixtures/repositories/git_repository.tar.gz
index 48966da30..8158d5832 100644
Binary files a/test/fixtures/repositories/git_repository.tar.gz and b/test/fixtures/repositories/git_repository.tar.gz differ
diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb
index 37c6fb848..317261a13 100644
--- a/test/functional/repositories_git_controller_test.rb
+++ b/test/functional/repositories_git_controller_test.rb
@@ -50,8 +50,9 @@ class RepositoriesGitControllerTest < ActionController::TestCase
assert_response :success
assert_template 'show'
assert_not_nil assigns(:entries)
- assert_equal 6, assigns(:entries).size
+ assert_equal 7, assigns(:entries).size
assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
+ assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'}
assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
assert assigns(:entries).detect {|e| e.name == 'copied_README' && e.kind == 'file'}
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')
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
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!
diff --git a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
index e3c633749..2dc5d3e8e 100644
--- a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
+++ b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
@@ -13,7 +13,7 @@ class GitAdapterTest < ActiveSupport::TestCase
end
def test_getting_all_revisions
- assert_equal 12, @adapter.revisions('',nil,nil,:all => 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 !!!"
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)