diff -Nru redmine-2.3.3/.gitignore redmine-2.4.2/.gitignore --- redmine-2.3.3/.gitignore 2013-09-14 06:48:49.000000000 +0000 +++ redmine-2.4.2/.gitignore 2013-12-23 08:48:42.000000000 +0000 @@ -1,5 +1,7 @@ /.project /.loadpath +/.powrc +/.rvmrc /config/additional_environment.rb /config/configuration.yml /config/database.yml @@ -15,8 +17,14 @@ /lib/redmine/scm/adapters/mercurial/redminehelper.pyo /log/*.log* /log/mongrel_debug +/plugins/* +!/plugins/README /public/dispatch.* /public/plugin_assets +/public/themes/* +!/public/themes/alternate +!/public/themes/classic +!/public/themes/README /tmp/* /tmp/cache/* /tmp/pdf/* diff -Nru redmine-2.3.3/.hgignore redmine-2.4.2/.hgignore --- redmine-2.3.3/.hgignore 2013-09-14 06:48:49.000000000 +0000 +++ redmine-2.4.2/.hgignore 2013-12-23 08:48:42.000000000 +0000 @@ -2,6 +2,8 @@ .project .loadpath +.powrc +.rvmrc config/additional_environment.rb config/configuration.yml config/database.yml diff -Nru redmine-2.3.3/CONTRIBUTING.md redmine-2.4.2/CONTRIBUTING.md --- redmine-2.3.3/CONTRIBUTING.md 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/CONTRIBUTING.md 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,8 @@ + +**Do not send a pull requst to this github repository**. + +For more detail, please see [official website] wiki [Contribute]. + +[official website]: http://www.redmine.org +[Contribute]: http://www.redmine.org/projects/redmine/wiki/Contribute + diff -Nru redmine-2.3.3/Gemfile redmine-2.4.2/Gemfile --- redmine-2.3.3/Gemfile 2013-09-14 06:48:49.000000000 +0000 +++ redmine-2.4.2/Gemfile 2013-12-23 08:48:42.000000000 +0000 @@ -1,9 +1,8 @@ source 'https://rubygems.org' -gem "rails", "3.2.13" +gem "rails", "3.2.16" gem "jquery-rails", "~> 2.0.2" -gem "i18n", "~> 0.6.0" -gem "coderay", "~> 1.0.9" +gem "coderay", "~> 1.1.0" gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "builder", "3.0.0" @@ -14,7 +13,7 @@ # Optional gem for OpenID authentication group :openid do - gem "ruby-openid", "~> 2.2.3", :require => "openid" + gem "ruby-openid", "~> 2.3.0", :require => "openid" gem "rack-openid" end @@ -31,7 +30,7 @@ platforms :jruby do # jruby-openssl is bundled with JRuby 1.7.0 gem "jruby-openssl" if Object.const_defined?(:JRUBY_VERSION) && JRUBY_VERSION < '1.7.0' - gem "activerecord-jdbc-adapter", "1.2.5" + gem "activerecord-jdbc-adapter", "~> 1.3.2" end # Include database gems for the adapters found in the database @@ -78,9 +77,12 @@ group :test do gem "shoulda", "~> 3.3.2" - gem "mocha", "~> 0.13.3" - gem 'capybara', '~> 2.0.0' - gem 'nokogiri', '< 1.6.0' + gem "mocha", ">= 0.14", :require => 'mocha/api' + if RUBY_VERSION >= '1.9.3' + gem "capybara", "~> 2.1.0" + gem "selenium-webdriver" + gem "database_cleaner" + end end local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") @@ -92,5 +94,6 @@ # Load plugins' Gemfiles Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file| puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v` - instance_eval File.read(file) + #TODO: switch to "eval_gemfile file" when bundler >= 1.2.0 will be required (rails 4) + instance_eval File.read(file), file end diff -Nru redmine-2.3.3/app/controllers/account_controller.rb redmine-2.4.2/app/controllers/account_controller.rb --- redmine-2.3.3/app/controllers/account_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/account_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -20,7 +20,15 @@ include CustomFieldsHelper # prevents login action to be filtered by check_if_login_required application scope filter - skip_before_filter :check_if_login_required + skip_before_filter :check_if_login_required, :check_password_change + + # Overrides ApplicationController#verify_authenticity_token to disable + # token verification on openid callbacks + def verify_authenticity_token + unless using_open_id? + super + end + end # Login request and validation def login @@ -75,11 +83,15 @@ else if request.post? user = User.find_by_mail(params[:mail].to_s) - # user not found or not active - unless user && user.active? + # user not found + unless user flash.now[:error] = l(:notice_account_unknown_email) return end + unless user.active? + handle_inactive_user(user, lost_password_path) + return + end # user cannot change its password unless user.change_password_allowed? flash.now[:error] = l(:notice_can_t_change_password) @@ -152,6 +164,19 @@ redirect_to signin_path end + # Sends a new account activation email + def activation_email + if session[:registered_user_id] && Setting.self_registration == '1' + user_id = session.delete(:registered_user_id).to_i + user = User.find_by_id(user_id) + if user && user.registered? + register_by_email_activation(user) + return + end + end + redirect_to(home_url) + end + private def authenticate_user @@ -163,7 +188,7 @@ end def password_authentication - user = User.try_to_login(params[:username], params[:password]) + user = User.try_to_login(params[:username], params[:password], false) if user.nil? invalid_credentials @@ -171,27 +196,31 @@ onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id }) else # Valid user - successful_authentication(user) + if user.active? + successful_authentication(user) + else + handle_inactive_user(user) + end end end def open_id_authenticate(openid_url) back_url = signin_url(:autologin => params[:autologin]) - - authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => back_url, :method => :post) do |result, identity_url, registration| + authenticate_with_open_id( + openid_url, :required => [:nickname, :fullname, :email], + :return_to => back_url, :method => :post + ) do |result, identity_url, registration| if result.successful? user = User.find_or_initialize_by_identity_url(identity_url) if user.new_record? # Self-registration off (redirect_to(home_url); return) unless Setting.self_registration? - # Create on the fly user.login = registration['nickname'] unless registration['nickname'].nil? user.mail = registration['email'] unless registration['email'].nil? user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? user.random_password user.register - case Setting.self_registration when '1' register_by_email_activation(user) do @@ -211,7 +240,7 @@ if user.active? successful_authentication(user) else - account_pending + handle_inactive_user(user) end end end @@ -261,7 +290,7 @@ token = Token.new(:user => user, :action => "register") if user.save and token.save Mailer.register(token).deliver - flash[:notice] = l(:notice_account_register_done) + flash[:notice] = l(:notice_account_register_done, :email => user.mail) redirect_to signin_path else yield if block_given? @@ -291,14 +320,32 @@ if user.save # Sends an email to the administrators Mailer.account_activation_request(user).deliver - account_pending + account_pending(user) else yield if block_given? end end - def account_pending - flash[:notice] = l(:notice_account_pending) - redirect_to signin_path + def handle_inactive_user(user, redirect_path=signin_path) + if user.registered? + account_pending(user, redirect_path) + else + account_locked(user, redirect_path) + end + end + + def account_pending(user, redirect_path=signin_path) + if Setting.self_registration == '1' + flash[:error] = l(:notice_account_not_activated_yet, :url => activation_email_path) + session[:registered_user_id] = user.id + else + flash[:error] = l(:notice_account_pending) + end + redirect_to redirect_path + end + + def account_locked(user, redirect_path=signin_path) + flash[:error] = l(:notice_account_locked) + redirect_to redirect_path end end diff -Nru redmine-2.3.3/app/controllers/admin_controller.rb redmine-2.4.2/app/controllers/admin_controller.rb --- redmine-2.3.3/app/controllers/admin_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/admin_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -65,7 +65,7 @@ @test = Mailer.test_email(User.current).deliver flash[:notice] = l(:notice_email_sent, User.current.mail) rescue Exception => e - flash[:error] = l(:notice_email_error, e.message) + flash[:error] = l(:notice_email_error, Redmine::CodesetUtil.replace_invalid_utf8(e.message)) end ActionMailer::Base.raise_delivery_errors = raise_delivery_errors redirect_to settings_path(:tab => 'notifications') @@ -77,7 +77,8 @@ [:text_default_administrator_account_changed, User.default_admin_account_changed?], [:text_file_repository_writable, File.writable?(Attachment.storage_path)], [:text_plugin_assets_writable, File.writable?(Redmine::Plugin.public_directory)], - [:text_rmagick_available, Object.const_defined?(:Magick)] + [:text_rmagick_available, Object.const_defined?(:Magick)], + [:text_convert_available, Redmine::Thumbnail.convert_available?] ] end end diff -Nru redmine-2.3.3/app/controllers/application_controller.rb redmine-2.4.2/app/controllers/application_controller.rb --- redmine-2.3.3/app/controllers/application_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/application_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,14 +33,23 @@ layout 'base' protect_from_forgery + + def verify_authenticity_token + unless api_request? + super + end + end + def handle_unverified_request - super - cookies.delete(autologin_cookie_name) + unless api_request? + super + cookies.delete(autologin_cookie_name) + render_error :status => 422, :message => "Invalid form authenticity token." + end end - before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization + before_filter :session_expiration, :user_setup, :check_if_login_required, :check_password_change, :set_localization - rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token rescue_from ::Unauthorized, :with => :deny_access rescue_from ::ActionView::MissingTemplate, :with => :missing_template @@ -78,6 +87,9 @@ session[:user_id] = user.id session[:ctime] = Time.now.utc.to_i session[:atime] = Time.now.utc.to_i + if user.must_change_password? + session[:pwd] = '1' + end end def user_setup @@ -112,6 +124,10 @@ authenticate_with_http_basic do |username, password| user = User.try_to_login(username, password) || User.find_by_api_key(username) end + if user && user.must_change_password? + render_error :message => 'You must change your password', :status => 403 + return + end end # Switch user if requested by an admin user if user && user.admin? && (username = api_switch_user_from_request) @@ -170,6 +186,16 @@ require_login if Setting.login_required? end + def check_password_change + if session[:pwd] + if User.current.must_change_password? + redirect_to my_password_path + else + session.delete(:pwd) + end + end + end + def set_localization lang = nil if User.current.logged? @@ -195,7 +221,13 @@ url = url_for(:controller => params[:controller], :action => params[:action], :id => params[:id], :project_id => params[:project_id]) end respond_to do |format| - format.html { redirect_to :controller => "account", :action => "login", :back_url => url } + format.html { + if request.xhr? + head :unauthorized + else + redirect_to :controller => "account", :action => "login", :back_url => url + end + } 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"' } @@ -298,7 +330,7 @@ # Find issues with a single :id param or :ids array param # Raises a Unauthorized exception if one of the issues is not visible def find_issues - @issues = Issue.find_all_by_id(params[:id] || params[:ids]) + @issues = Issue.where(:id => (params[:id] || params[:ids])).preload(:project, :status, :tracker, :priority, :author, :assigned_to, :relations_to).to_a raise ActiveRecord::RecordNotFound if @issues.empty? raise Unauthorized unless @issues.all?(&:visible?) @projects = @issues.collect(&:project).compact.uniq @@ -427,13 +459,6 @@ request.xhr? ? false : 'base' end - def invalid_authenticity_token - if api_request? - logger.error "Form authenticity token is missing or is invalid. API calls must include a proper Content-type header (text/xml or text/json)." - end - render_error "Invalid form authenticity token." - end - def render_feed(items, options={}) @items = items || [] @items.sort! {|x,y| y.event_datetime <=> x.event_datetime } @@ -555,21 +580,6 @@ flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present? end - # Sets the `flash` notice or error based the number of issues that did not save - # - # @param [Array, Issue] issues all of the saved and unsaved Issues - # @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved - def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids) - if unsaved_issue_ids.empty? - flash[:notice] = l(:notice_successful_update) unless issues.empty? - else - flash[:error] = l(:notice_failed_to_save_issues, - :count => unsaved_issue_ids.size, - :total => issues.size, - :ids => '#' + unsaved_issue_ids.join(', #')) - end - end - # Rescues an invalid query statement. Just in case... def query_statement_invalid(exception) logger.error "Query::StatementInvalid: #{exception.message}" if logger diff -Nru redmine-2.3.3/app/controllers/boards_controller.rb redmine-2.4.2/app/controllers/boards_controller.rb --- redmine-2.3.3/app/controllers/boards_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/boards_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -25,7 +25,7 @@ helper :watchers def index - @boards = @project.boards.includes(:last_message => :author).all + @boards = @project.boards.includes(:project, :last_message => :author).all # show the board if there is only one if @boards.size == 1 @board = @boards.first diff -Nru redmine-2.3.3/app/controllers/context_menus_controller.rb redmine-2.4.2/app/controllers/context_menus_controller.rb --- redmine-2.3.3/app/controllers/context_menus_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/context_menus_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -19,17 +19,15 @@ helper :watchers helper :issues + before_filter :find_issues, :only => :issues + def issues - @issues = Issue.visible.all(:conditions => {:id => params[:ids]}, :include => :project) - (render_404; return) unless @issues.present? if (@issues.size == 1) @issue = @issues.first end @issue_ids = @issues.map(&:id).sort @allowed_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&) - @projects = @issues.collect(&:project).compact.uniq - @project = @projects.first if @projects.size == 1 @can = {:edit => User.current.allowed_to?(:edit_issues, @projects), :log_time => (@project && User.current.allowed_to?(:log_time, @project)), @@ -73,8 +71,7 @@ end def time_entries - @time_entries = TimeEntry.all( - :conditions => {:id => params[:ids]}, :include => :project) + @time_entries = TimeEntry.where(:id => params[:ids]).preload(:project).to_a (render_404; return) unless @time_entries.present? @projects = @time_entries.collect(&:project).compact.uniq diff -Nru redmine-2.3.3/app/controllers/custom_fields_controller.rb redmine-2.4.2/app/controllers/custom_fields_controller.rb --- redmine-2.3.3/app/controllers/custom_fields_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/custom_fields_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -21,10 +21,18 @@ before_filter :require_admin before_filter :build_new_custom_field, :only => [:new, :create] before_filter :find_custom_field, :only => [:edit, :update, :destroy] + accept_api_auth :index def index - @custom_fields_by_type = CustomField.all.group_by {|f| f.class.name } - @tab = params[:tab] || 'IssueCustomField' + respond_to do |format| + format.html { + @custom_fields_by_type = CustomField.all.group_by {|f| f.class.name } + @tab = params[:tab] || 'IssueCustomField' + } + format.api { + @custom_fields = CustomField.all + } + end end def new diff -Nru redmine-2.3.3/app/controllers/issue_statuses_controller.rb redmine-2.4.2/app/controllers/issue_statuses_controller.rb --- redmine-2.3.3/app/controllers/issue_statuses_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/issue_statuses_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -40,7 +40,7 @@ def create @issue_status = IssueStatus.new(params[:issue_status]) - if request.post? && @issue_status.save + if @issue_status.save flash[:notice] = l(:notice_successful_create) redirect_to issue_statuses_path else @@ -54,7 +54,7 @@ def update @issue_status = IssueStatus.find(params[:id]) - if request.put? && @issue_status.update_attributes(params[:issue_status]) + if @issue_status.update_attributes(params[:issue_status]) flash[:notice] = l(:notice_successful_update) redirect_to issue_statuses_path else diff -Nru redmine-2.3.3/app/controllers/issues_controller.rb redmine-2.4.2/app/controllers/issues_controller.rb --- redmine-2.3.3/app/controllers/issues_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/issues_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -103,6 +103,9 @@ @journals = @issue.journals.includes(:user, :details).reorder("#{Journal.table_name}.id ASC").all @journals.each_with_index {|j,i| j.indice = i+1} @journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project) + Journal.preload_journals_details_custom_fields(@journals) + # TODO: use #select! when ruby1.8 support is dropped + @journals.reject! {|journal| !journal.notes? && journal.visible_details.empty?} @journals.reverse! if User.current.wants_comments_in_reverse_order? @changesets = @issue.changesets.visible.all @@ -113,6 +116,8 @@ @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @priorities = IssuePriority.active @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) + @relation = IssueRelation.new + respond_to do |format| format.html { retrieve_previous_and_next_issue_ids @@ -176,7 +181,7 @@ @issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads])) saved = false begin - saved = @issue.save_issue_with_child_records(params, @time_entry) + saved = save_issue_with_child_records rescue ActiveRecord::StaleObjectError @conflict = true if params[:last_journal_id] @@ -228,7 +233,7 @@ else @available_statuses = @issues.map(&:new_statuses_allowed_to).reduce(:&) end - @custom_fields = target_projects.map{|p|p.all_issue_custom_fields}.reduce(:&) + @custom_fields = target_projects.map{|p|p.all_issue_custom_fields.visible}.reduce(:&) @assignables = target_projects.map(&:assignable_users).reduce(:&) @trackers = target_projects.map(&:trackers).reduce(:&) @versions = target_projects.map {|p| p.shared_versions.open}.reduce(:&) @@ -239,7 +244,9 @@ end @safe_attributes = @issues.map(&:safe_attribute_names).reduce(:&) - render :layout => false if request.xhr? + + @issue_params = params[:issue] || {} + @issue_params[:custom_field_values] ||= {} end def bulk_update @@ -247,8 +254,8 @@ @copy = params[:copy].present? attributes = parse_params_for_bulk_issue_attributes(params) - unsaved_issue_ids = [] - moved_issues = [] + unsaved_issues = [] + saved_issues = [] if @copy && params[:copy_subtasks].present? # Descendant issues will be copied with the parent task @@ -256,39 +263,48 @@ @issues.reject! {|issue| @issues.detect {|other| issue.is_descendant_of?(other)}} end - @issues.each do |issue| - issue.reload + @issues.each do |orig_issue| + orig_issue.reload if @copy - issue = issue.copy({}, + issue = orig_issue.copy({}, :attachments => params[:copy_attachments].present?, :subtasks => params[:copy_subtasks].present? ) + else + issue = orig_issue end journal = issue.init_journal(User.current, params[:notes]) issue.safe_attributes = attributes call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue }) if issue.save - moved_issues << issue + saved_issues << issue else - # Keep unsaved issue ids to display them in flash error - unsaved_issue_ids << issue.id + unsaved_issues << orig_issue end end - set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) - if params[:follow] - if @issues.size == 1 && moved_issues.size == 1 - redirect_to issue_path(moved_issues.first) - elsif moved_issues.map(&:project).uniq.size == 1 - redirect_to project_issues_path(moved_issues.map(&:project).first) + if unsaved_issues.empty? + flash[:notice] = l(:notice_successful_update) unless saved_issues.empty? + if params[:follow] + if @issues.size == 1 && saved_issues.size == 1 + redirect_to issue_path(saved_issues.first) + elsif saved_issues.map(&:project).uniq.size == 1 + redirect_to project_issues_path(saved_issues.map(&:project).first) + end + else + redirect_back_or_default _project_issues_path(@project) end else - redirect_back_or_default _project_issues_path(@project) + @saved_issues = @issues + @unsaved_issues = unsaved_issues + @issues = Issue.visible.find_all_by_id(@unsaved_issues.map(&:id)) + bulk_edit + render :action => 'bulk_edit' end end def destroy - @hours = TimeEntry.sum(:hours, :conditions => ['issue_id IN (?)', @issues]).to_f + @hours = TimeEntry.where(:issue_id => @issues.map(&:id)).sum(:hours).to_f if @hours > 0 case params[:todo] when 'destroy' @@ -410,7 +426,7 @@ @issue.safe_attributes = params[:issue] @priorities = IssuePriority.active - @allowed_statuses = @issue.new_statuses_allowed_to(User.current, true) + @allowed_statuses = @issue.new_statuses_allowed_to(User.current, @issue.new_record?) @available_watchers = (@issue.project.users.sort + @issue.watcher_users).uniq end @@ -436,4 +452,26 @@ end attributes end + + # Saves @issue and a time_entry from the parameters + def save_issue_with_child_records + Issue.transaction do + if params[:time_entry] && (params[:time_entry][:hours].present? || params[:time_entry][:comments].present?) && User.current.allowed_to?(:log_time, @issue.project) + time_entry = @time_entry || TimeEntry.new + time_entry.project = @issue.project + time_entry.issue = @issue + time_entry.user = User.current + time_entry.spent_on = User.current.today + time_entry.attributes = params[:time_entry] + @issue.time_entries << time_entry + end + + call_hook(:controller_issues_edit_before_save, { :params => params, :issue => @issue, :time_entry => time_entry, :journal => @issue.current_journal}) + if @issue.save + call_hook(:controller_issues_edit_after_save, { :params => params, :issue => @issue, :time_entry => time_entry, :journal => @issue.current_journal}) + else + raise ActiveRecord::Rollback + end + end + end end diff -Nru redmine-2.3.3/app/controllers/messages_controller.rb redmine-2.4.2/app/controllers/messages_controller.rb --- redmine-2.3.3/app/controllers/messages_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/messages_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -35,7 +35,7 @@ page = params[:page] # Find the page of the requested reply if params[:r] && page.nil? - offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) + offset = @topic.children.where("#{Message.table_name}.id < ?", params[:r].to_i).count page = 1 + offset / REPLIES_PER_PAGE end diff -Nru redmine-2.3.3/app/controllers/my_controller.rb redmine-2.4.2/app/controllers/my_controller.rb --- redmine-2.3.3/app/controllers/my_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/my_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,6 +17,8 @@ class MyController < ApplicationController before_filter :require_login + # let user change user's password when user has to + skip_before_filter :check_password_change, :only => :password helper :issues helper :users @@ -55,7 +57,6 @@ @user.pref.attributes = params[:pref] if @user.save @user.pref.save - @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) set_language_if_valid @user.language flash[:notice] = l(:notice_account_updated) redirect_to my_account_path @@ -91,14 +92,17 @@ return end if request.post? - if @user.check_password?(params[:password]) + if !@user.check_password?(params[:password]) + flash.now[:error] = l(:notice_account_wrong_password) + elsif params[:password] == params[:new_password] + flash.now[:error] = l(:notice_new_password_must_be_different) + else @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] + @user.must_change_passwd = false if @user.save flash[:notice] = l(:notice_account_password_updated) redirect_to my_account_path end - else - flash[:error] = l(:notice_account_wrong_password) end end end diff -Nru redmine-2.3.3/app/controllers/projects_controller.rb redmine-2.4.2/app/controllers/projects_controller.rb --- redmine-2.3.3/app/controllers/projects_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/projects_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -82,7 +82,7 @@ if validate_parent_id && @project.save @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') - # Add current user as a project member if he is not admin + # Add current user as a project member if current user is not admin unless User.current.admin? r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first m = Member.new(:user => User.current, :roles => [r]) @@ -155,7 +155,7 @@ @total_issues_by_tracker = Issue.visible.where(cond).count(:group => :tracker) if User.current.allowed_to?(:view_time_entries, @project) - @total_hours = TimeEntry.visible.sum(:hours, :include => :project, :conditions => cond).to_f + @total_hours = TimeEntry.visible.where(cond).sum(:hours).to_f end @key = User.current.rss_key diff -Nru redmine-2.3.3/app/controllers/queries_controller.rb redmine-2.4.2/app/controllers/queries_controller.rb --- redmine-2.3.3/app/controllers/queries_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/queries_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -45,7 +45,7 @@ @query = IssueQuery.new @query.user = User.current @query.project = @project - @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? @query.build_from_params(params) end @@ -53,13 +53,13 @@ @query = IssueQuery.new(params[:query]) @query.user = User.current @query.project = params[:query_is_for_all] ? nil : @project - @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? @query.build_from_params(params) @query.column_names = nil if params[:default_columns] if @query.save flash[:notice] = l(:notice_successful_create) - redirect_to _project_issues_path(@project, :query_id => @query) + redirect_to_issues(:query_id => @query) else render :action => 'new', :layout => !request.xhr? end @@ -71,13 +71,13 @@ def update @query.attributes = params[:query] @query.project = nil if params[:query_is_for_all] - @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + @query.visibility = IssueQuery::VISIBILITY_PRIVATE unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? @query.build_from_params(params) @query.column_names = nil if params[:default_columns] if @query.save flash[:notice] = l(:notice_successful_update) - redirect_to _project_issues_path(@project, :query_id => @query) + redirect_to_issues(:query_id => @query) else render :action => 'edit' end @@ -85,7 +85,7 @@ def destroy @query.destroy - redirect_to _project_issues_path(@project, :set_filter => 1) + redirect_to_issues(:set_filter => 1) end private @@ -103,4 +103,16 @@ rescue ActiveRecord::RecordNotFound render_404 end + + def redirect_to_issues(options) + if params[:gantt] + if @project + redirect_to project_gantt_path(@project, options) + else + redirect_to issues_gantt_path(options) + end + else + redirect_to _project_issues_path(@project, options) + end + end end diff -Nru redmine-2.3.3/app/controllers/repositories_controller.rb redmine-2.4.2/app/controllers/repositories_controller.rb --- redmine-2.3.3/app/controllers/repositories_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/repositories_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,7 @@ require 'SVG/Graph/Bar' require 'SVG/Graph/BarHorizontal' require 'digest/sha1' -require 'redmine/scm/adapters/abstract_adapter' +require 'redmine/scm/adapters' class ChangesetNotFound < Exception; end class InvalidRevisionParam < Exception; end @@ -111,7 +111,7 @@ end def show - @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty? + @repository.fetch_changesets if @project.active? && Setting.autofetch_changesets? && @path.empty? @entries = @repository.entries(@path, @rev) @changeset = @repository.find_changeset_by_name(@rev) @@ -229,7 +229,8 @@ # Adds a related issue to a changeset # POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues def add_related_issue - @issue = @changeset.find_referenced_issue_by_id(params[:issue_id]) + issue_id = params[:issue_id].to_s.sub(/^#/,'') + @issue = @changeset.find_referenced_issue_by_id(issue_id) if @issue && (!@issue.visible? || @changeset.issues.include?(@issue)) @issue = nil end @@ -352,15 +353,18 @@ @date_to = Date.today @date_from = @date_to << 11 @date_from = Date.civil(@date_from.year, @date_from.month, 1) - commits_by_day = Changeset.count( - :all, :group => :commit_date, - :conditions => ["repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) + commits_by_day = Changeset. + where("repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to). + group(:commit_date). + count commits_by_month = [0] * 12 commits_by_day.each {|c| commits_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } - changes_by_day = Change.count( - :all, :group => :commit_date, :include => :changeset, - :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to]) + changes_by_day = Change. + joins(:changeset). + where("#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to). + group(:commit_date). + count changes_by_month = [0] * 12 changes_by_day.each {|c| changes_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last } @@ -393,10 +397,10 @@ end def graph_commits_per_author(repository) - commits_by_author = Changeset.count(:all, :group => :committer, :conditions => ["repository_id = ?", repository.id]) + commits_by_author = Changeset.where("repository_id = ?", repository.id).group(:committer).count commits_by_author.to_a.sort! {|x, y| x.last <=> y.last} - changes_by_author = Change.count(:all, :group => :committer, :include => :changeset, :conditions => ["#{Changeset.table_name}.repository_id = ?", repository.id]) + changes_by_author = Change.joins(:changeset).where("#{Changeset.table_name}.repository_id = ?", repository.id).group(:committer).count h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o} fields = commits_by_author.collect {|r| r.first} @@ -411,7 +415,7 @@ fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') } graph = SVG::Graph::BarHorizontal.new( - :height => 400, + :height => 30 * commits_data.length, :width => 800, :fields => fields, :stack => :side, diff -Nru redmine-2.3.3/app/controllers/settings_controller.rb redmine-2.4.2/app/controllers/settings_controller.rb --- redmine-2.3.3/app/controllers/settings_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/settings_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,9 +33,7 @@ if request.post? && params[:settings] && params[:settings].is_a?(Hash) settings = (params[:settings] || {}).dup.symbolize_keys settings.each do |name, value| - # remove blank values in array settings - value.delete_if {|v| v.blank? } if value.is_a?(Array) - Setting[name] = value + Setting.set_from_params name, value end flash[:notice] = l(:notice_successful_update) redirect_to settings_path(:tab => params[:tab]) @@ -48,6 +46,9 @@ @guessed_host_and_path = request.host_with_port.dup @guessed_host_and_path << ('/'+ Redmine::Utils.relative_url_root.gsub(%r{^\/}, '')) unless Redmine::Utils.relative_url_root.blank? + @commit_update_keywords = Setting.commit_update_keywords.dup + @commit_update_keywords = [{}] unless @commit_update_keywords.is_a?(Array) && @commit_update_keywords.any? + Redmine::Themes.rescan end end diff -Nru redmine-2.3.3/app/controllers/sys_controller.rb redmine-2.4.2/app/controllers/sys_controller.rb --- redmine-2.3.3/app/controllers/sys_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/sys_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -19,11 +19,7 @@ before_filter :check_enabled def projects - p = Project.active.has_module(:repository).find( - :all, - :include => :repository, - :order => "#{Project.table_name}.identifier" - ) + p = Project.active.has_module(:repository).order("#{Project.table_name}.identifier").preload(:repository).all # extra_info attribute from repository breaks activeresource client render :xml => p.to_xml( :only => [:id, :identifier, :name, :is_public, :status], diff -Nru redmine-2.3.3/app/controllers/timelog_controller.rb redmine-2.4.2/app/controllers/timelog_controller.rb --- redmine-2.3.3/app/controllers/timelog_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/timelog_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -46,18 +46,15 @@ sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria) sort_update(@query.sortable_columns) - scope = time_entry_scope(:order => sort_clause) + scope = time_entry_scope(:order => sort_clause). + includes(:project, :user, :issue). + preload(:issue => [:project, :tracker, :status, :assigned_to, :priority]) respond_to do |format| format.html { - # Paginate results @entry_count = scope.count @entry_pages = Paginator.new @entry_count, per_page_option, params['page'] - @entries = scope.all( - :include => [:project, :activity, :user, {:issue => :tracker}], - :limit => @entry_pages.per_page, - :offset => @entry_pages.offset - ) + @entries = scope.offset(@entry_pages.offset).limit(@entry_pages.per_page).all @total_hours = scope.sum(:hours).to_f render :layout => !request.xhr? @@ -65,24 +62,15 @@ format.api { @entry_count = scope.count @offset, @limit = api_offset_and_limit - @entries = scope.all( - :include => [:project, :activity, :user, {:issue => :tracker}], - :limit => @limit, - :offset => @offset - ) + @entries = scope.offset(@offset).limit(@limit).preload(:custom_values => :custom_field).all } format.atom { - entries = scope.reorder("#{TimeEntry.table_name}.created_on DESC").all( - :include => [:project, :activity, :user, {:issue => :tracker}], - :limit => Setting.feeds_limit.to_i - ) + entries = scope.limit(Setting.feeds_limit.to_i).reorder("#{TimeEntry.table_name}.created_on DESC").all render_feed(entries, :title => l(:label_spent_time)) } format.csv { # Export all entries - @entries = scope.all( - :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}] - ) + @entries = scope.all send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv') } end @@ -194,6 +182,7 @@ time_entry.safe_attributes = attributes call_hook(:controller_time_entries_bulk_edit_before_save, { :params => params, :time_entry => time_entry }) unless time_entry.save + logger.info "time entry could not be updated: #{time_entry.errors.full_messages}" if logger && logger.info # Keep unsaved time_entry ids to display them in flash error unsaved_time_entry_ids << time_entry.id end diff -Nru redmine-2.3.3/app/controllers/users_controller.rb redmine-2.4.2/app/controllers/users_controller.rb --- redmine-2.3.3/app/controllers/users_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/users_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -60,7 +60,7 @@ def show # show projects based on current user visibility - @memberships = @user.memberships.all(:conditions => Project.visible_condition(User.current)) + @memberships = @user.memberships.where(Project.visible_condition(User.current)).all events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10) @events_by_day = events.group_by(&:event_date) @@ -80,6 +80,7 @@ def new @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) + @user.safe_attributes = params[:user] @auth_sources = AuthSource.all end @@ -93,15 +94,15 @@ if @user.save @user.pref.attributes = params[:pref] @user.pref.save - @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) - Mailer.account_information(@user, params[:user][:password]).deliver if params[:send_information] + Mailer.account_information(@user, @user.password).deliver if params[:send_information] respond_to do |format| format.html { flash[:notice] = l(:notice_user_successful_create, :id => view_context.link_to(@user.login, user_path(@user))) if params[:continue] - redirect_to new_user_path + attrs = params[:user].slice(:generate_password) + redirect_to new_user_path(:user => attrs) else redirect_to edit_user_path(@user) end @@ -139,12 +140,11 @@ if @user.save @user.pref.save - @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) if was_activated Mailer.account_activated(@user).deliver - elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil? - Mailer.account_information(@user, params[:user][:password]).deliver + elsif @user.active? && params[:send_information] && @user.password.present? && @user.auth_source_id.nil? + Mailer.account_information(@user, @user.password).deliver end respond_to do |format| diff -Nru redmine-2.3.3/app/controllers/versions_controller.rb redmine-2.4.2/app/controllers/versions_controller.rb --- redmine-2.3.3/app/controllers/versions_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/versions_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -46,11 +46,11 @@ @issues_by_version = {} if @selected_tracker_ids.any? && @versions.any? - issues = Issue.visible.all( - :include => [:project, :status, :tracker, :priority, :fixed_version], - :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)}, - :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id" - ) + issues = Issue.visible. + includes(:project, :tracker). + preload(:status, :priority, :fixed_version). + where(:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)). + order("#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id") @issues_by_version = issues.group_by(&:fixed_version) end @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?} diff -Nru redmine-2.3.3/app/controllers/wiki_controller.rb redmine-2.4.2/app/controllers/wiki_controller.rb --- redmine-2.3.3/app/controllers/wiki_controller.rb 2013-09-14 06:48:16.000000000 +0000 +++ redmine-2.4.2/app/controllers/wiki_controller.rb 2013-12-23 08:48:37.000000000 +0000 @@ -15,8 +15,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -require 'diff' - # The WikiController follows the Rails REST controller pattern but with # a few differences # @@ -64,7 +62,12 @@ # display a page (in editing mode if it doesn't exist) def show - if @page.new_record? + if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project) + deny_access + return + end + @content = @page.content_for_version(params[:version]) + if @content.nil? if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request? edit render :action => 'edit' @@ -73,11 +76,6 @@ end return end - if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project) - deny_access - return - end - @content = @page.content_for_version(params[:version]) if User.current.allowed_to?(:export_wiki_pages, @project) if params[:format] == 'pdf' send_data(wiki_page_to_pdf(@page, @project), :type => 'application/pdf', :filename => "#{@page.title}.pdf") @@ -106,19 +104,19 @@ def edit return render_403 unless editable? if @page.new_record? - @page.content = WikiContent.new(:page => @page) if params[:parent].present? @page.parent = @page.wiki.find_page(params[:parent].to_s) end end @content = @page.content_for_version(params[:version]) + @content ||= WikiContent.new(:page => @page) @content.text = initial_page_content(@page) if @content.text.blank? # don't keep previous comment @content.comments = nil # To prevent StaleObjectError exception when reverting to a previous version - @content.version = @page.content.version + @content.version = @page.content.version if @page.content @text = @content.text if params[:section].present? && Redmine::WikiFormatting.supports_section_edit? @@ -132,10 +130,9 @@ def update return render_403 unless editable? was_new_page = @page.new_record? - @page.content = WikiContent.new(:page => @page) if @page.new_record? @page.safe_attributes = params[:wiki_page] - @content = @page.content + @content = @page.content || WikiContent.new(:page => @page) content_params = params[:content] if content_params.nil? && params[:wiki_page].is_a?(Hash) content_params = params[:wiki_page].slice(:text, :comments, :version) @@ -147,20 +144,23 @@ if params[:section].present? && Redmine::WikiFormatting.supports_section_edit? @section = params[:section].to_i @section_hash = params[:section_hash] - @content.text = Redmine::WikiFormatting.formatter.new(@content.text).update_section(params[:section].to_i, @text, @section_hash) + @content.text = Redmine::WikiFormatting.formatter.new(@content.text).update_section(@section, @text, @section_hash) else @content.version = content_params[:version] if content_params[:version] @content.text = @text end @content.author = User.current - if @page.save_with_content + if @page.save_with_content(@content) attachments = Attachment.attach_files(@page, params[:attachments]) render_attachment_warning_if_needed(@page) call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page}) respond_to do |format| - format.html { redirect_to project_wiki_page_path(@project, @page.title) } + format.html { + anchor = @section ? "section-#{@section}" : nil + redirect_to project_wiki_page_path(@project, @page.title, :anchor => anchor) + } format.api { if was_new_page render :action => 'show', :status => :created, :location => project_wiki_page_path(@project, @page.title) diff -Nru redmine-2.3.3/app/helpers/application_helper.rb redmine-2.4.2/app/helpers/application_helper.rb --- redmine-2.3.3/app/helpers/application_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/application_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -79,7 +79,8 @@ subject = truncate(subject, :length => options[:truncate]) end end - s = link_to text, issue_path(issue), :class => issue.css_classes, :title => title + only_path = options[:only_path].nil? ? true : options[:only_path] + s = link_to text, issue_path(issue, :only_path => only_path), :class => issue.css_classes, :title => title s << h(": #{subject}") if subject s = h("#{issue.project} - ") + s if options[:project] s @@ -330,7 +331,7 @@ end groups = '' collection.sort.each do |element| - selected_attribute = ' selected="selected"' if option_value_selected?(element, selected) + selected_attribute = ' selected="selected"' if option_value_selected?(element, selected) || element.id.to_s == selected (element.is_a?(Group) ? groups : s) << %() end unless groups.empty? @@ -348,6 +349,10 @@ options end + def option_tag(name, text, value, selected=nil, options={}) + content_tag 'option', value, options.merge(:value => value, :selected => (value == selected)) + end + # Truncates and returns the string as a single line def truncate_single_line(string, *args) truncate(string.to_s, *args).gsub(%r{[\r\n]+}m, ' ') @@ -380,7 +385,7 @@ if @project link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => User.current.time_to_date(time)}, :title => format_time(time)) else - content_tag('acronym', text, :title => format_time(time)) + content_tag('abbr', text, :title => format_time(time)) end end @@ -445,12 +450,31 @@ end end + # Returns a h2 tag and sets the html title with the given arguments + def title(*args) + strings = args.map do |arg| + if arg.is_a?(Array) && arg.size >= 2 + link_to(*arg) + else + h(arg.to_s) + end + end + html_title args.reverse.map {|s| (s.is_a?(Array) ? s.first : s).to_s} + content_tag('h2', strings.join(' » ').html_safe) + end + + # Sets the html title + # Returns the html title when called without arguments + # Current project name and app_title and automatically appended + # Exemples: + # html_title 'Foo', 'Bar' + # html_title # => 'Foo - Bar - My Project - Redmine' def html_title(*args) if args.empty? title = @html_title || [] title << @project.name if @project title << Setting.app_title unless Setting.app_title == title.last - title.select {|t| !t.blank? }.join(' - ') + title.reject(&:blank?).join(' - ') else @html_title ||= [] @html_title += args @@ -465,6 +489,7 @@ css << 'theme-' + theme.name end + css << 'project-' + @project.identifier if @project && @project.identifier.present? css << 'controller-' + controller_name css << 'action-' + action_name css.join(' ') @@ -615,7 +640,7 @@ else wiki_page_id = page.present? ? Wiki.titleize(page) : nil parent = wiki_page.nil? && obj.is_a?(WikiContent) && obj.page && project == link_project ? obj.page.title : nil - url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, + url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, :id => wiki_page_id, :version => nil, :anchor => anchor, :parent => parent) end end @@ -656,6 +681,9 @@ # export:some/file -> Force the download of the file # Forum messages: # message#1218 -> Link to message with id 1218 + # Projects: + # project:someproject -> Link to project named "someproject" + # project#3 -> Link to project with id 3 # # Links can refer other objects from other projects, using project identifier: # identifier:r52 @@ -692,7 +720,7 @@ when nil if oid.to_s == identifier && issue = Issue.visible.find_by_id(oid, :include => :status) anchor = comment_id ? "note-#{comment_id}" : nil - link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid, :anchor => anchor}, + link = link_to(h("##{oid}#{comment_suffix}"), {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid, :anchor => anchor}, :class => issue.css_classes, :title => "#{truncate(issue.subject, :length => 100)} (#{issue.status.name})") end @@ -804,7 +832,8 @@ content_tag('div', link_to(image_tag('edit.png'), options[:edit_section_links].merge(:section => @current_section)), :class => 'contextual', - :title => l(:button_edit_section)) + heading.html_safe + :title => l(:button_edit_section), + :id => "section-#{@current_section}") + heading.html_safe else heading end @@ -975,7 +1004,7 @@ html << "\n" end html.html_safe - end + end def delete_link(url, options={}) options = { @@ -989,8 +1018,8 @@ def preview_link(url, form, target='preview', options={}) content_tag 'a', l(:label_preview), { - :href => "#", - :onclick => %|submitPreview("#{escape_javascript url_for(url)}", "#{escape_javascript form}", "#{escape_javascript target}"); return false;|, + :href => "#", + :onclick => %|submitPreview("#{escape_javascript url_for(url)}", "#{escape_javascript form}", "#{escape_javascript target}"); return false;|, :accesskey => accesskey(:preview) }.merge(options) end @@ -1035,7 +1064,7 @@ (pcts[0] > 0 ? content_tag('td', '', :style => "width: #{pcts[0]}%;", :class => 'closed') : ''.html_safe) + (pcts[1] > 0 ? content_tag('td', '', :style => "width: #{pcts[1]}%;", :class => 'done') : ''.html_safe) + (pcts[2] > 0 ? content_tag('td', '', :style => "width: #{pcts[2]}%;", :class => 'todo') : ''.html_safe) - ), :class => 'progress', :style => "width: #{width};").html_safe + + ), :class => "progress progress-#{pcts[0]}", :style => "width: #{width};").html_safe + content_tag('p', legend, :class => 'percent').html_safe end @@ -1068,6 +1097,7 @@ def include_calendar_headers_tags unless @calendar_headers_tags_included + tags = javascript_include_tag("datepicker") @calendar_headers_tags_included = true content_for :header_tags do start_of_week = Setting.start_of_week @@ -1075,15 +1105,16 @@ # Redmine uses 1..7 (monday..sunday) in settings and locales # JQuery uses 0..6 (sunday..saturday), 7 needs to be changed to 0 start_of_week = start_of_week.to_i % 7 - - tags = javascript_tag( + tags << javascript_tag( "var datepickerOptions={dateFormat: 'yy-mm-dd', firstDay: #{start_of_week}, " + - "showOn: 'button', buttonImageOnly: true, buttonImage: '" + + "showOn: 'button', buttonImageOnly: true, buttonImage: '" + path_to_image('/images/calendar.png') + - "', showButtonPanel: true, showWeek: true, showOtherMonths: true, selectOtherMonths: true};") + "', showButtonPanel: true, showWeek: true, showOtherMonths: true, " + + "selectOtherMonths: true, changeMonth: true, changeYear: true, " + + "beforeShow: beforeShowDatePicker};") jquery_locale = l('jquery.locale', :default => current_language.to_s) unless jquery_locale == 'en' - tags << javascript_include_tag("i18n/jquery.ui.datepicker-#{jquery_locale}.js") + tags << javascript_include_tag("i18n/jquery.ui.datepicker-#{jquery_locale}.js") end tags end @@ -1143,18 +1174,13 @@ super sources, options end - def content_for(name, content = nil, &block) - @has_content ||= {} - @has_content[name] = true - super(name, content, &block) - end - + # TODO: remove this in 2.5.0 def has_content?(name) - (@has_content && @has_content[name]) || false + content_for?(name) end def sidebar_content? - has_content?(:sidebar) || view_layouts_base_sidebar_hook_response.present? + content_for?(:sidebar) || view_layouts_base_sidebar_hook_response.present? end def view_layouts_base_sidebar_hook_response diff -Nru redmine-2.3.3/app/helpers/custom_fields_helper.rb redmine-2.4.2/app/helpers/custom_fields_helper.rb --- redmine-2.3.3/app/helpers/custom_fields_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/custom_fields_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -19,8 +19,29 @@ module CustomFieldsHelper + CUSTOM_FIELDS_TABS = [ + {:name => 'IssueCustomField', :partial => 'custom_fields/index', + :label => :label_issue_plural}, + {:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', + :label => :label_spent_time}, + {:name => 'ProjectCustomField', :partial => 'custom_fields/index', + :label => :label_project_plural}, + {:name => 'VersionCustomField', :partial => 'custom_fields/index', + :label => :label_version_plural}, + {:name => 'UserCustomField', :partial => 'custom_fields/index', + :label => :label_user_plural}, + {:name => 'GroupCustomField', :partial => 'custom_fields/index', + :label => :label_group_plural}, + {:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', + :label => TimeEntryActivity::OptionName}, + {:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', + :label => IssuePriority::OptionName}, + {:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', + :label => DocumentCategory::OptionName} + ] + def custom_fields_tabs - CustomField::CUSTOM_FIELDS_TABS + CUSTOM_FIELDS_TABS end # Return custom field html tag corresponding to its format @@ -77,32 +98,44 @@ custom_field_label_tag(name, custom_value, options) + custom_field_tag(name, custom_value) end - def custom_field_tag_for_bulk_edit(name, custom_field, projects=nil) + def custom_field_tag_for_bulk_edit(name, custom_field, projects=nil, value='') field_name = "#{name}[custom_field_values][#{custom_field.id}]" field_name << "[]" if custom_field.multiple? field_id = "#{name}_custom_field_values_#{custom_field.id}" tag_options = {:id => field_id, :class => "#{custom_field.field_format}_cf"} + unset_tag = '' + unless custom_field.is_required? + unset_tag = content_tag('label', + check_box_tag(field_name, '__none__', (value == '__none__'), :id => nil, :data => {:disables => "##{field_id}"}) + l(:button_clear), + :class => 'inline' + ) + end + field_format = Redmine::CustomFieldFormat.find_by_name(custom_field.field_format) case field_format.try(:edit_as) when "date" - text_field_tag(field_name, '', tag_options.merge(:size => 10)) + - calendar_for(field_id) + text_field_tag(field_name, value, tag_options.merge(:size => 10)) + + calendar_for(field_id) + + unset_tag when "text" - text_area_tag(field_name, '', tag_options.merge(:rows => 3)) + text_area_tag(field_name, value, tag_options.merge(:rows => 3)) + + '
'.html_safe + + unset_tag when "bool" select_tag(field_name, options_for_select([[l(:label_no_change_option), ''], [l(:general_text_yes), '1'], - [l(:general_text_no), '0']]), tag_options) + [l(:general_text_no), '0']], value), tag_options) when "list" options = [] options << [l(:label_no_change_option), ''] unless custom_field.multiple? options << [l(:label_none), '__none__'] unless custom_field.is_required? options += custom_field.possible_values_options(projects) - select_tag(field_name, options_for_select(options), tag_options.merge(:multiple => custom_field.multiple?)) + select_tag(field_name, options_for_select(options, value), tag_options.merge(:multiple => custom_field.multiple?)) else - text_field_tag(field_name, '', tag_options) + text_field_tag(field_name, value, tag_options) + + unset_tag end end diff -Nru redmine-2.3.3/app/helpers/issues_helper.rb redmine-2.4.2/app/helpers/issues_helper.rb --- redmine-2.3.3/app/helpers/issues_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/issues_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -94,6 +94,20 @@ s.html_safe end + # Returns an array of error messages for bulk edited issues + def bulk_edit_error_messages(issues) + messages = {} + issues.each do |issue| + issue.errors.full_messages.each do |message| + messages[message] ||= [] + messages[message] << issue + end + end + messages.map { |message, issues| + "#{message}: " + issues.map {|i| "##{i.id}"}.join(', ') + } + end + # Returns a link for adding a new subtask to the given issue def link_to_new_subtask(issue) attrs = { @@ -146,12 +160,13 @@ end def render_custom_fields_rows(issue) - return if issue.custom_field_values.empty? + values = issue.visible_custom_field_values + return if values.empty? ordered_values = [] - half = (issue.custom_field_values.size / 2.0).ceil + half = (values.size / 2.0).ceil half.times do |i| - ordered_values << issue.custom_field_values[i] - ordered_values << issue.custom_field_values[i + half] + ordered_values << values[i] + ordered_values << values[i + half] end s = "\n" n = 0 @@ -184,51 +199,53 @@ def sidebar_queries unless @sidebar_queries - @sidebar_queries = IssueQuery.visible.all( - :order => "#{Query.table_name}.name ASC", + @sidebar_queries = IssueQuery.visible. + order("#{Query.table_name}.name ASC"). # Project specific queries and global queries - :conditions => (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id]) - ) + where(@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id]). + all end @sidebar_queries end def query_links(title, queries) + return '' if queries.empty? # links to #index on issues/show url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : params - content_tag('h3', h(title)) + - queries.collect {|query| - css = 'query' - css << ' selected' if query == @query - link_to(h(query.name), url_params.merge(:query_id => query), :class => css) - }.join('
').html_safe + content_tag('h3', title) + "\n" + + content_tag('ul', + queries.collect {|query| + css = 'query' + css << ' selected' if query == @query + content_tag('li', link_to(query.name, url_params.merge(:query_id => query), :class => css)) + }.join("\n").html_safe, + :class => 'queries' + ) + "\n" end def render_sidebar_queries out = ''.html_safe - queries = sidebar_queries.select {|q| !q.is_public?} - out << query_links(l(:label_my_queries), queries) if queries.any? - queries = sidebar_queries.select {|q| q.is_public?} - out << query_links(l(:label_query_plural), queries) if queries.any? + out << query_links(l(:label_my_queries), sidebar_queries.select(&:is_private?)) + out << query_links(l(:label_query_plural), sidebar_queries.reject(&:is_private?)) out end - def email_issue_attributes(issue) + def email_issue_attributes(issue, user) items = [] %w(author status priority assigned_to category fixed_version).each do |attribute| unless issue.disabled_core_fields.include?(attribute+"_id") items << "#{l("field_#{attribute}")}: #{issue.send attribute}" end end - issue.custom_field_values.each do |value| + issue.visible_custom_field_values(user).each do |value| items << "#{value.custom_field.name}: #{show_value(value)}" end items end - def render_email_issue_attributes(issue, html=false) - items = email_issue_attributes(issue) + def render_email_issue_attributes(issue, user, html=false) + items = email_issue_attributes(issue, user) if html content_tag('ul', items.map{|s| content_tag('li', s)}.join("\n").html_safe) else @@ -244,23 +261,23 @@ values_by_field = {} details.each do |detail| if detail.property == 'cf' - field_id = detail.prop_key - field = CustomField.find_by_id(field_id) + field = detail.custom_field if field && field.multiple? - values_by_field[field_id] ||= {:added => [], :deleted => []} + values_by_field[field] ||= {:added => [], :deleted => []} if detail.old_value - values_by_field[field_id][:deleted] << detail.old_value + values_by_field[field][:deleted] << detail.old_value end if detail.value - values_by_field[field_id][:added] << detail.value + values_by_field[field][:added] << detail.value end next end end strings << show_detail(detail, no_html, options) end - values_by_field.each do |field_id, changes| - detail = JournalDetail.new(:property => 'cf', :prop_key => field_id) + values_by_field.each do |field, changes| + detail = JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s) + detail.instance_variable_set "@custom_field", field if changes[:added].any? detail.value = changes[:added] strings << show_detail(detail, no_html, options) @@ -303,7 +320,7 @@ old_value = l(detail.old_value == "0" ? :general_text_No : :general_text_Yes) unless detail.old_value.blank? end when 'cf' - custom_field = CustomField.find_by_id(detail.prop_key) + custom_field = detail.custom_field if custom_field multiple = custom_field.multiple? label = custom_field.name @@ -312,6 +329,17 @@ end when 'attachment' label = l(:label_attachment) + when 'relation' + if detail.value && !detail.old_value + rel_issue = Issue.visible.find_by_id(detail.value) + value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.value}" : + (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path])) + elsif detail.old_value && !detail.value + rel_issue = Issue.visible.find_by_id(detail.old_value) + old_value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.old_value}" : + (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path])) + end + label = l(detail.prop_key.to_sym) end call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value }) @@ -323,7 +351,9 @@ unless no_html label = content_tag('strong', label) old_value = content_tag("i", h(old_value)) if detail.old_value - old_value = content_tag("del", old_value) if detail.old_value and detail.value.blank? + if detail.old_value && detail.value.blank? && detail.property != 'relation' + old_value = content_tag("del", old_value) + end if detail.property == 'attachment' && !value.blank? && atta = Attachment.find_by_id(detail.prop_key) # Link to the attachment if it has not been removed value = link_to_attachment(atta, :download => true, :only_path => options[:only_path]) @@ -359,7 +389,7 @@ else l(:text_journal_set_to, :label => label, :value => value).html_safe end - when 'attachment' + when 'attachment', 'relation' l(:text_journal_added, :label => label, :value => value).html_safe end else diff -Nru redmine-2.3.3/app/helpers/projects_helper.rb redmine-2.4.2/app/helpers/projects_helper.rb --- redmine-2.3.3/app/helpers/projects_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/projects_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -46,7 +46,7 @@ end options = '' - options << "" if project.allowed_parents.include?(nil) + options << "" if project.allowed_parents.include?(nil) options << project_tree_options_for_select(project.allowed_parents.compact, :selected => selected) content_tag('select', options.html_safe, :name => 'project[parent_id]', :id => 'project_parent_id') end @@ -69,10 +69,11 @@ grouped[version.project.name] << [version.name, version.id] end + selected = selected.is_a?(Version) ? selected.id : selected if grouped.keys.size > 1 - grouped_options_for_select(grouped, selected && selected.id) + grouped_options_for_select(grouped, selected) else - options_for_select((grouped.values.first || []), selected && selected.id) + options_for_select((grouped.values.first || []), selected) end end diff -Nru redmine-2.3.3/app/helpers/queries_helper.rb redmine-2.4.2/app/helpers/queries_helper.rb --- redmine-2.3.3/app/helpers/queries_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/queries_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -185,7 +185,7 @@ if !params[:query_id].blank? cond = "project_id IS NULL" cond << " OR project_id = #{@project.id}" if @project - @query = IssueQuery.find(params[:query_id], :conditions => cond) + @query = IssueQuery.where(cond).find(params[:query_id]) raise ::Unauthorized unless @query.visible? @query.project = @project session[:query] = {:id => @query.id, :project_id => @query.project_id} @@ -198,6 +198,7 @@ session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names} else # retrieve from session + @query = nil @query = IssueQuery.find_by_id(session[:query][:id]) if session[:query][:id] @query ||= IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names]) @query.project = @project diff -Nru redmine-2.3.3/app/helpers/versions_helper.rb redmine-2.4.2/app/helpers/versions_helper.rb --- redmine-2.3.3/app/helpers/versions_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/versions_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -35,12 +35,9 @@ h = Hash.new {|k,v| k[v] = [0, 0]} begin # Total issue count - Issue.count(:group => criteria, - :conditions => ["#{Issue.table_name}.fixed_version_id = ?", version.id]).each {|c,s| h[c][0] = s} + Issue.where(:fixed_version_id => version.id).group(criteria).count.each {|c,s| h[c][0] = s} # Open issues count - Issue.count(:group => criteria, - :include => :status, - :conditions => ["#{Issue.table_name}.fixed_version_id = ? AND #{IssueStatus.table_name}.is_closed = ?", version.id, false]).each {|c,s| h[c][1] = s} + Issue.open.where(:fixed_version_id => version.id).group(criteria).count.each {|c,s| h[c][1] = s} rescue ActiveRecord::RecordNotFound # When grouping by an association, Rails throws this exception if there's no result (bug) end diff -Nru redmine-2.3.3/app/helpers/watchers_helper.rb redmine-2.4.2/app/helpers/watchers_helper.rb --- redmine-2.3.3/app/helpers/watchers_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/watchers_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -28,7 +28,7 @@ return '' unless user && user.logged? objects = Array.wrap(objects) - watched = objects.any? {|object| object.watched_by?(user)} + watched = Watcher.any_watched?(objects, user) css = [watcher_css(objects), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') text = watched ? l(:button_unwatch) : l(:button_watch) url = watch_path( diff -Nru redmine-2.3.3/app/helpers/workflows_helper.rb redmine-2.4.2/app/helpers/workflows_helper.rb --- redmine-2.3.3/app/helpers/workflows_helper.rb 2013-09-14 06:48:11.000000000 +0000 +++ redmine-2.4.2/app/helpers/workflows_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -22,11 +22,20 @@ field.is_a?(CustomField) ? field.is_required? : %w(project_id tracker_id subject priority_id is_private).include?(field) end - def field_permission_tag(permissions, status, field) + def field_permission_tag(permissions, status, field, role) name = field.is_a?(CustomField) ? field.id.to_s : field options = [["", ""], [l(:label_readonly), "readonly"]] options << [l(:label_required), "required"] unless field_required?(field) + html_options = {} + selected = permissions[status.id][name] - select_tag("permissions[#{name}][#{status.id}]", options_for_select(options, permissions[status.id][name])) + hidden = field.is_a?(CustomField) && !field.visible? && !role.custom_fields.to_a.include?(field) + if hidden + options[0][0] = l(:label_hidden) + selected = '' + html_options[:disabled] = true + end + + select_tag("permissions[#{name}][#{status.id}]", options_for_select(options, selected), html_options) end end diff -Nru redmine-2.3.3/app/models/attachment.rb redmine-2.4.2/app/models/attachment.rb --- redmine-2.3.3/app/models/attachment.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/attachment.rb 2013-12-23 08:48:37.000000000 +0000 @@ -102,7 +102,7 @@ if @temp_file && (@temp_file.size > 0) self.disk_directory = target_directory self.disk_filename = Attachment.disk_filename(filename, disk_directory) - logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)") + logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)") if logger path = File.dirname(diskfile) unless File.directory?(path) FileUtils.mkdir_p(path) @@ -265,14 +265,25 @@ # Moves an existing attachment to its target directory def move_to_target_directory! - if !new_record? & readable? - src = diskfile - self.disk_directory = target_directory - dest = diskfile - if src != dest && FileUtils.mkdir_p(File.dirname(dest)) && FileUtils.mv(src, dest) - update_column :disk_directory, disk_directory - end + return unless !new_record? & readable? + + src = diskfile + self.disk_directory = target_directory + dest = diskfile + + return if src == dest + + if !FileUtils.mkdir_p(File.dirname(dest)) + logger.error "Could not create directory #{File.dirname(dest)}" if logger + return + end + + if !FileUtils.mv(src, dest) + logger.error "Could not move attachment from #{src} to #{dest}" if logger + return end + + update_column :disk_directory, disk_directory end # Moves existing attachments that are stored at the root of the files @@ -294,10 +305,10 @@ def sanitize_filename(value) # get only the filename, not the whole path - just_filename = value.gsub(/^.*(\\|\/)/, '') + just_filename = value.gsub(/\A.*(\\|\/)/m, '') # Finally, replace invalid characters with underscore - @filename = just_filename.gsub(/[\/\?\%\*\:\|\"\'<>]+/, '_') + @filename = just_filename.gsub(/[\/\?\%\*\:\|\"\'<>\n\r]+/, '_') end # Returns the subdirectory in which the attachment will be saved diff -Nru redmine-2.3.3/app/models/changeset.rb redmine-2.4.2/app/models/changeset.rb --- redmine-2.3.3/app/models/changeset.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/changeset.rb 2013-12-23 08:48:37.000000000 +0000 @@ -118,22 +118,25 @@ ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) ref_keywords_any = ref_keywords.delete('*') # keywords used to fix issues - fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip) + fix_keywords = Setting.commit_update_keywords_array.map {|r| r['keywords']}.flatten.compact kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") referenced_issues = [] comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match| - action, refs = match[2], match[3] + action, refs = match[2].to_s.downcase, match[3] next unless action.present? || ref_keywords_any refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m| issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2] if issue referenced_issues << issue - fix_issue(issue) if fix_keywords.include?(action.to_s.downcase) - log_time(issue, hours) if hours && Setting.commit_logtime_enabled? + # Don't update issues or log time when importing old commits + unless repository.created_on && committed_on && committed_on < repository.created_on + fix_issue(issue, action) if fix_keywords.include?(action) + log_time(issue, hours) if hours && Setting.commit_logtime_enabled? + end end end end @@ -210,25 +213,26 @@ private - def fix_issue(issue) - status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) - if status.nil? - logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger - return issue - end - + # Updates the +issue+ according to +action+ + def fix_issue(issue, action) # the issue may have been updated by the closure of another one (eg. duplicate) issue.reload # don't change the status is the issue is closed return if issue.status && issue.status.is_closed? - journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag(issue.project))) - issue.status = status - unless Setting.commit_fix_done_ratio.blank? - issue.done_ratio = Setting.commit_fix_done_ratio.to_i + journal = issue.init_journal(user || User.anonymous, + ll(Setting.default_language, + :text_status_changed_by_changeset, + text_tag(issue.project))) + rule = Setting.commit_update_keywords_array.detect do |rule| + rule['keywords'].include?(action) && + (rule['if_tracker_id'].blank? || rule['if_tracker_id'] == issue.tracker_id.to_s) + end + if rule + issue.assign_attributes rule.slice(*Issue.attribute_names) end Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, - { :changeset => self, :issue => issue }) + { :changeset => self, :issue => issue, :action => action }) unless issue.save logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger end diff -Nru redmine-2.3.3/app/models/comment.rb redmine-2.4.2/app/models/comment.rb --- redmine-2.3.3/app/models/comment.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/comment.rb 2013-12-23 08:48:37.000000000 +0000 @@ -22,5 +22,16 @@ validates_presence_of :commented, :author, :comments + after_create :send_notification + safe_attributes 'comments' + + private + + def send_notification + mailer_method = "#{commented.class.name.underscore}_comment_added" + if Setting.notified_events.include?(mailer_method) + Mailer.send(mailer_method, self).deliver + end + end end diff -Nru redmine-2.3.3/app/models/comment_observer.rb redmine-2.4.2/app/models/comment_observer.rb --- redmine-2.3.3/app/models/comment_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/comment_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class CommentObserver < ActiveRecord::Observer - def after_create(comment) - if comment.commented.is_a?(News) && Setting.notified_events.include?('news_comment_added') - Mailer.news_comment_added(comment).deliver - end - end -end diff -Nru redmine-2.3.3/app/models/custom_field.rb redmine-2.4.2/app/models/custom_field.rb --- redmine-2.3.3/app/models/custom_field.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/custom_field.rb 2013-12-23 08:48:37.000000000 +0000 @@ -19,42 +19,43 @@ include Redmine::SubclassFactory has_many :custom_values, :dependent => :delete_all + has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "custom_field_id" acts_as_list :scope => 'type = \'#{self.class}\'' serialize :possible_values validates_presence_of :name, :field_format validates_uniqueness_of :name, :scope => :type validates_length_of :name, :maximum => 30 - validates_inclusion_of :field_format, :in => Redmine::CustomFieldFormat.available_formats - + validates_inclusion_of :field_format, :in => Proc.new { Redmine::CustomFieldFormat.available_formats } validate :validate_custom_field + before_validation :set_searchable after_save :handle_multiplicity_change + after_save do |field| + if field.visible_changed? && field.visible + field.roles.clear + end + end scope :sorted, lambda { order("#{table_name}.position ASC") } + scope :visible, lambda {|*args| + user = args.shift || User.current + if user.admin? + # nop + elsif user.memberships.any? + where("#{table_name}.visible = ? OR #{table_name}.id IN (SELECT DISTINCT cfr.custom_field_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = ?)", + true, user.id) + else + where(:visible => true) + end + } - CUSTOM_FIELDS_TABS = [ - {:name => 'IssueCustomField', :partial => 'custom_fields/index', - :label => :label_issue_plural}, - {:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', - :label => :label_spent_time}, - {:name => 'ProjectCustomField', :partial => 'custom_fields/index', - :label => :label_project_plural}, - {:name => 'VersionCustomField', :partial => 'custom_fields/index', - :label => :label_version_plural}, - {:name => 'UserCustomField', :partial => 'custom_fields/index', - :label => :label_user_plural}, - {:name => 'GroupCustomField', :partial => 'custom_fields/index', - :label => :label_group_plural}, - {:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', - :label => TimeEntryActivity::OptionName}, - {:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', - :label => IssuePriority::OptionName}, - {:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', - :label => DocumentCategory::OptionName} - ] - - CUSTOM_FIELDS_NAMES = CUSTOM_FIELDS_TABS.collect{|v| v[:name]} + def visible_by?(project, user=User.current) + visible? || user.admin? + end def field_format=(arg) # cannot change format of a saved custom field @@ -122,8 +123,10 @@ values.each do |value| value.force_encoding('UTF-8') if value.respond_to?(:force_encoding) end + values + else + [] end - values || [] end end @@ -215,6 +218,7 @@ " ON #{join_alias}.customized_type = '#{self.class.customized_class.base_class.name}'" + " AND #{join_alias}.customized_id = #{self.class.customized_class.table_name}.id" + " AND #{join_alias}.custom_field_id = #{id}" + + " AND (#{visibility_by_project_condition})" + " AND #{join_alias}.value <> ''" + " AND #{join_alias}.id = (SELECT max(#{join_alias}_2.id) FROM #{CustomValue.table_name} #{join_alias}_2" + " WHERE #{join_alias}_2.customized_type = #{join_alias}.customized_type" + @@ -227,6 +231,7 @@ " ON #{join_alias}.customized_type = '#{self.class.customized_class.base_class.name}'" + " AND #{join_alias}.customized_id = #{self.class.customized_class.table_name}.id" + " AND #{join_alias}.custom_field_id = #{id}" + + " AND (#{visibility_by_project_condition})" + " AND #{join_alias}.value <> ''" + " AND #{join_alias}.id = (SELECT max(#{join_alias}_2.id) FROM #{CustomValue.table_name} #{join_alias}_2" + " WHERE #{join_alias}_2.customized_type = #{join_alias}.customized_type" + @@ -237,6 +242,7 @@ " ON #{join_alias}.customized_type = '#{self.class.customized_class.base_class.name}'" + " AND #{join_alias}.customized_id = #{self.class.customized_class.table_name}.id" + " AND #{join_alias}.custom_field_id = #{id}" + + " AND (#{visibility_by_project_condition})" + " AND #{join_alias}.id = (SELECT max(#{join_alias}_2.id) FROM #{CustomValue.table_name} #{join_alias}_2" + " WHERE #{join_alias}_2.customized_type = #{join_alias}.customized_type" + " AND #{join_alias}_2.customized_id = #{join_alias}.customized_id" + @@ -254,6 +260,33 @@ join_alias + "_" + field_format end + def visibility_by_project_condition(project_key=nil, user=User.current) + if visible? || user.admin? + "1=1" + elsif user.anonymous? + "1=0" + else + project_key ||= "#{self.class.customized_class.table_name}.project_id" + "#{project_key} IN (SELECT DISTINCT m.project_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = #{user.id} AND cfr.custom_field_id = #{id})" + end + end + + def self.visibility_condition + if user.admin? + "1=1" + elsif user.anonymous? + "#{table_name}.visible" + else + "#{project_key} IN (SELECT DISTINCT m.project_id FROM #{Member.table_name} m" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.member_id = m.id" + + " INNER JOIN #{table_name_prefix}custom_fields_roles#{table_name_suffix} cfr ON cfr.role_id = mr.role_id" + + " WHERE m.user_id = #{user.id} AND cfr.custom_field_id = #{id})" + end + end + def <=>(field) position <=> field.position end @@ -270,7 +303,7 @@ def self.customized_class self.name =~ /^(.+)CustomField$/ - begin; $1.constantize; rescue nil; end + $1.constantize rescue nil end # to move in project_custom_field diff -Nru redmine-2.3.3/app/models/document.rb redmine-2.4.2/app/models/document.rb --- redmine-2.3.3/app/models/document.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/document.rb 2013-12-23 08:48:37.000000000 +0000 @@ -30,6 +30,8 @@ validates_presence_of :project, :title, :category validates_length_of :title, :maximum => 60 + after_create :send_notification + scope :visible, lambda {|*args| includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args)) } @@ -54,4 +56,12 @@ end @updated_on end + + private + + def send_notification + if Setting.notified_events.include?('document_added') + Mailer.document_added(self).deliver + end + end end diff -Nru redmine-2.3.3/app/models/document_observer.rb redmine-2.4.2/app/models/document_observer.rb --- redmine-2.3.3/app/models/document_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/document_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class DocumentObserver < ActiveRecord::Observer - def after_create(document) - Mailer.document_added(document).deliver if Setting.notified_events.include?('document_added') - end -end diff -Nru redmine-2.3.3/app/models/issue.rb redmine-2.4.2/app/models/issue.rb --- redmine-2.3.3/app/models/issue.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/issue.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,6 +18,7 @@ class Issue < ActiveRecord::Base include Redmine::SafeAttributes include Redmine::Utils::DateCalculation + include Redmine::I18n belongs_to :project belongs_to :tracker @@ -91,12 +92,17 @@ } before_create :default_assign - before_save :close_duplicates, :update_done_ratio_from_issue_status, :force_updated_on_change, :update_closed_on + before_save :close_duplicates, :update_done_ratio_from_issue_status, + :force_updated_on_change, :update_closed_on, :set_assigned_to_was after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} - after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal + after_save :reschedule_following_issues, :update_nested_set_attributes, + :update_parent_attributes, :create_journal # Should be after_create but would be called before previous after_save callbacks after_save :after_create_from_copy after_destroy :update_parent_attributes + after_create :send_notification + # Keep it at the end of after_save callbacks + after_save :clear_assigned_to_was # Returns a SQL conditions string used to find all issues visible by the specified user def self.visible_condition(user, options={}) @@ -106,10 +112,10 @@ when 'all' nil when 'default' - user_ids = [user.id] + user.groups.map(&:id) + user_ids = [user.id] + user.groups.map(&:id).compact "(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" when 'own' - user_ids = [user.id] + user.groups.map(&:id) + user_ids = [user.id] + user.groups.map(&:id).compact "(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" else '1=0' @@ -197,6 +203,13 @@ (project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : [] end + def visible_custom_field_values(user=nil) + user_real = user || User.current + custom_field_values.select do |value| + value.custom_field.visible_by?(project, user_real) + end + end + # Copies attributes from another issue, arg can be an id or an Issue def copy_from(arg, options={}) issue = arg.is_a?(Issue) ? arg : Issue.visible.find(arg) @@ -347,8 +360,7 @@ if issue.new_record? issue.copy? elsif user.allowed_to?(:move_issues, issue.project) - projects = Issue.allowed_target_projects_on_move(user) - projects.include?(issue.project) && projects.size > 1 + Issue.allowed_target_projects_on_move.count > 1 end } @@ -415,7 +427,7 @@ # Project and Tracker must be set before since new_statuses_allowed_to depends on it. if (p = attrs.delete('project_id')) && safe_attribute?('project_id') - if allowed_target_projects(user).collect(&:id).include?(p.to_i) + if allowed_target_projects(user).where(:id => p.to_i).exists? self.project_id = p end end @@ -445,11 +457,15 @@ end if attrs['custom_field_values'].present? - attrs['custom_field_values'] = attrs['custom_field_values'].reject {|k, v| read_only_attribute_names(user).include? k.to_s} + editable_custom_field_ids = editable_custom_field_values(user).map {|v| v.custom_field_id.to_s} + # TODO: use #select when ruby1.8 support is dropped + attrs['custom_field_values'] = attrs['custom_field_values'].reject {|k, v| !editable_custom_field_ids.include?(k.to_s)} end if attrs['custom_fields'].present? - attrs['custom_fields'] = attrs['custom_fields'].reject {|c| read_only_attribute_names(user).include? c['id'].to_s} + editable_custom_field_ids = editable_custom_field_values(user).map {|v| v.custom_field_id.to_s} + # TODO: use #select when ruby1.8 support is dropped + attrs['custom_fields'] = attrs['custom_fields'].reject {|c| !editable_custom_field_ids.include?(c['id'].to_s)} end # mass-assignment security bypass @@ -462,7 +478,7 @@ # Returns the custom_field_values that can be edited by the given user def editable_custom_field_values(user=nil) - custom_field_values.reject do |value| + visible_custom_field_values(user).reject do |value| read_only_attribute_names(user).include?(value.custom_field_id.to_s) end end @@ -547,12 +563,12 @@ end def validate_issue - if due_date && start_date && due_date < start_date + if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date errors.add :due_date, :greater_than_start_date end - if start_date && soonest_start && start_date < soonest_start - errors.add :start_date, :invalid + if start_date && start_date_changed? && soonest_start && start_date < soonest_start + errors.add :start_date, :earlier_than_minimum_start_date, :date => format_date(soonest_start) end if fixed_version @@ -691,7 +707,7 @@ # Is the amount of work done less than it should for the due date def behind_schedule? return false if start_date.nil? || due_date.nil? - done_date = start_date + ((due_date - start_date+1)* done_ratio/100).floor + done_date = start_date + ((due_date - start_date + 1) * done_ratio / 100).floor return done_date <= Date.today end @@ -762,9 +778,12 @@ end end + # Returns the previous assignee if changed def assigned_to_was - if assigned_to_id_changed? && assigned_to_id_was.present? - @assigned_to_was ||= User.find_by_id(assigned_to_id_was) + # assigned_to_id_was is reset before after_save callbacks + user_id = @previous_assigned_to_id || assigned_to_id_was + if user_id && user_id != assigned_to_id + @assigned_to_was ||= User.find_by_id(user_id) end end @@ -794,6 +813,21 @@ notified_users.collect(&:mail) end + def each_notification(users, &block) + if users.any? + if custom_field_values.detect {|value| !value.custom_field.visible?} + users_by_custom_field_visibility = users.group_by do |user| + visible_custom_field_values(user).map(&:custom_field_id).sort + end + users_by_custom_field_visibility.values.each do |users| + yield(users) + end + else + yield(users) + end + end + end + # Returns the number of hours spent on this issue def spent_hours @spent_hours ||= time_entries.sum(:hours) || 0 @@ -816,7 +850,7 @@ # Preloads relations for a collection of issues def self.load_relations(issues) if issues.any? - relations = IssueRelation.all(:conditions => ["issue_from_id IN (:ids) OR issue_to_id IN (:ids)", {:ids => issues.map(&:id)}]) + relations = IssueRelation.where("issue_from_id IN (:ids) OR issue_to_id IN (:ids)", :ids => issues.map(&:id)).all issues.each do |issue| issue.instance_variable_set "@relations", relations.select {|r| r.issue_from_id == issue.id || r.issue_to_id == issue.id} end @@ -826,7 +860,7 @@ # Preloads visible spent time for a collection of issues def self.load_visible_spent_hours(issues, user=User.current) if issues.any? - hours_by_issue_id = TimeEntry.visible(user).sum(:hours, :group => :issue_id) + hours_by_issue_id = TimeEntry.visible(user).group(:issue_id).sum(:hours) issues.each do |issue| issue.instance_variable_set "@spent_hours", (hours_by_issue_id[issue.id] || 0) end @@ -854,7 +888,7 @@ # Finds an issue relation given its id. def find_relation(relation_id) - IssueRelation.find(relation_id, :conditions => ["issue_to_id = ? OR issue_from_id = ?", id, id]) + IssueRelation.where("issue_to_id = ? OR issue_from_id = ?", id, id).find(relation_id) end # Returns all the other issues that depend on the issue @@ -1045,40 +1079,19 @@ end # Returns a string of css classes that apply to the issue - def css_classes + def css_classes(user=User.current) s = "issue tracker-#{tracker_id} status-#{status_id} #{priority.try(:css_classes)}" s << ' closed' if closed? s << ' overdue' if overdue? s << ' child' if child? s << ' parent' unless leaf? s << ' private' if is_private? - s << ' created-by-me' if User.current.logged? && author_id == User.current.id - s << ' assigned-to-me' if User.current.logged? && assigned_to_id == User.current.id - s - end - - # Saves an issue and a time_entry from the parameters - def save_issue_with_child_records(params, existing_time_entry=nil) - Issue.transaction do - if params[:time_entry] && (params[:time_entry][:hours].present? || params[:time_entry][:comments].present?) && User.current.allowed_to?(:log_time, project) - @time_entry = existing_time_entry || TimeEntry.new - @time_entry.project = project - @time_entry.issue = self - @time_entry.user = User.current - @time_entry.spent_on = User.current.today - @time_entry.attributes = params[:time_entry] - self.time_entries << @time_entry - end - - # TODO: Rename hook - Redmine::Hook.call_hook(:controller_issues_edit_before_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal}) - if save - # TODO: Rename hook - Redmine::Hook.call_hook(:controller_issues_edit_after_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal}) - else - raise ActiveRecord::Rollback - end + if user.logged? + s << ' created-by-me' if author_id == user.id + s << ' assigned-to-me' if assigned_to_id == user.id + s << ' assigned-to-my-group' if user.groups.any? {|g| g.id = assigned_to_id} end + s end # Unassigns issues from +version+ if it's no longer shared with issue's project @@ -1099,6 +1112,10 @@ s = arg.to_s.strip.presence if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1])) @parent_issue.id + @invalid_parent_issue_id = nil + elsif s.blank? + @parent_issue = nil + @invalid_parent_issue_id = nil else @parent_issue = nil @invalid_parent_issue_id = arg @@ -1187,18 +1204,18 @@ end # End ReportsController extraction - # Returns an array of projects that user can assign the issue to + # Returns a scope of projects that user can assign the issue to def allowed_target_projects(user=User.current) if new_record? - Project.all(:conditions => Project.allowed_to_condition(user, :add_issues)) + Project.where(Project.allowed_to_condition(user, :add_issues)) else self.class.allowed_target_projects_on_move(user) end end - # Returns an array of projects that user can move issues to + # Returns a scope of projects that user can move issues to def self.allowed_target_projects_on_move(user=User.current) - Project.all(:conditions => Project.allowed_to_condition(user, :move_issues)) + Project.where(Project.allowed_to_condition(user, :move_issues)) end private @@ -1269,46 +1286,48 @@ # issue was just created self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id) set_default_left_and_right - Issue.update_all("root_id = #{root_id}, lft = #{lft}, rgt = #{rgt}", ["id = ?", id]) + Issue.update_all(["root_id = ?, lft = ?, rgt = ?", root_id, lft, rgt], ["id = ?", id]) if @parent_issue move_to_child_of(@parent_issue) 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 + update_nested_set_attributes_on_parent_change + end + remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue) + end + + # Updates the nested set for when an existing issue is moved + def update_nested_set_attributes_on_parent_change + former_parent_id = parent_id + # moving an existing issue + if @parent_issue && @parent_issue.root_id == root_id + # inside the same tree + move_to_child_of(@parent_issue) + else + # to another tree + unless root? + move_to_right_of(root) + end + old_root_id = root_id + self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id ) + target_maxright = nested_set_scope.maximum(right_column_name) || 0 + offset = target_maxright + 1 - lft + Issue.update_all(["root_id = ?, lft = lft + ?, rgt = rgt + ?", root_id, offset, offset], + ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]) + self[left_column_name] = lft + offset + self[right_column_name] = rgt + offset + if @parent_issue move_to_child_of(@parent_issue) - else - # to another tree - unless root? - move_to_right_of(root) - reload - end - old_root_id = root_id - self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id ) - target_maxright = nested_set_scope.maximum(right_column_name) || 0 - offset = target_maxright + 1 - lft - Issue.update_all("root_id = #{root_id}, lft = lft + #{offset}, rgt = rgt + #{offset}", - ["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt]) - self[left_column_name] = lft + offset - self[right_column_name] = rgt + offset - if @parent_issue - move_to_child_of(@parent_issue) - end end - reload - # delete invalid relations of all descendants - self_and_descendants.each do |issue| - issue.relations.each do |relation| - relation.destroy unless relation.valid? - end + end + # delete invalid relations of all descendants + self_and_descendants.each do |issue| + issue.relations.each do |relation| + relation.destroy unless relation.valid? 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) + # update former parent + recalculate_attributes_for(former_parent_id) if former_parent_id end def update_parent_attributes @@ -1358,12 +1377,11 @@ def self.update_versions(conditions=nil) # Only need to update issues with a fixed_version from # a different project and that is not systemwide shared - Issue.scoped(:conditions => conditions).all( - :conditions => "#{Issue.table_name}.fixed_version_id IS NOT NULL" + + Issue.includes(:project, :fixed_version). + where("#{Issue.table_name}.fixed_version_id IS NOT NULL" + " AND #{Issue.table_name}.project_id <> #{Version.table_name}.project_id" + - " AND #{Version.table_name}.sharing <> 'system'", - :include => [:project, :fixed_version] - ).each do |issue| + " AND #{Version.table_name}.sharing <> 'system'"). + where(conditions).each do |issue| next if issue.project.nil? || issue.fixed_version.nil? unless issue.project.shared_versions.include?(issue.fixed_version) issue.init_journal(User.current) @@ -1496,6 +1514,24 @@ end end + def send_notification + if Setting.notified_events.include?('issue_added') + Mailer.deliver_issue_add(self) + end + end + + # Stores the previous assignee so we can still have access + # to it during after_save callbacks (assigned_to_id_was is reset) + def set_assigned_to_was + @previous_assigned_to_id = assigned_to_id_was + end + + # Clears the previous assignee at the end of after_save callbacks + def clear_assigned_to_was + @assigned_to_was = nil + @previous_assigned_to_id = nil + end + # Query generator for selecting groups of issue counts for a project # based on specific criteria # diff -Nru redmine-2.3.3/app/models/issue_custom_field.rb redmine-2.4.2/app/models/issue_custom_field.rb --- redmine-2.3.3/app/models/issue_custom_field.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/issue_custom_field.rb 2013-12-23 08:48:37.000000000 +0000 @@ -23,5 +23,22 @@ def type_name :label_issue_plural end -end + def visible_by?(project, user=User.current) + super || (roles & user.roles_for_project(project)).present? + end + + def visibility_by_project_condition(*args) + sql = super + additional_sql = "#{Issue.table_name}.tracker_id IN (SELECT tracker_id FROM #{table_name_prefix}custom_fields_trackers#{table_name_suffix} WHERE custom_field_id = #{id})" + unless is_for_all? + additional_sql << " AND #{Issue.table_name}.project_id IN (SELECT project_id FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} WHERE custom_field_id = #{id})" + end + "((#{sql}) AND (#{additional_sql}))" + end + + def validate_custom_field + super + errors.add(:base, l(:label_role_plural) + ' ' + l('activerecord.errors.messages.blank')) unless visible? || roles.present? + end +end diff -Nru redmine-2.3.3/app/models/issue_observer.rb redmine-2.4.2/app/models/issue_observer.rb --- redmine-2.3.3/app/models/issue_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/issue_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class IssueObserver < ActiveRecord::Observer - def after_create(issue) - Mailer.issue_add(issue).deliver if Setting.notified_events.include?('issue_added') - end -end diff -Nru redmine-2.3.3/app/models/issue_query.rb redmine-2.4.2/app/models/issue_query.rb --- redmine-2.3.3/app/models/issue_query.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/issue_query.rb 2013-12-23 08:48:37.000000000 +0000 @@ -45,9 +45,25 @@ scope :visible, lambda {|*args| user = args.shift || User.current base = Project.allowed_to_condition(user, :view_issues, *args) - user_id = user.logged? ? user.id : 0 + scope = includes(:project).where("#{table_name}.project_id IS NULL OR (#{base})") - includes(:project).where("(#{table_name}.project_id IS NULL OR (#{base})) AND (#{table_name}.is_public = ? OR #{table_name}.user_id = ?)", true, user_id) + if user.admin? + scope.where("#{table_name}.visibility <> ? OR #{table_name}.user_id = ?", VISIBILITY_PRIVATE, user.id) + elsif user.memberships.any? + scope.where("#{table_name}.visibility = ?" + + " OR (#{table_name}.visibility = ? AND #{table_name}.id IN (" + + "SELECT DISTINCT q.id FROM #{table_name} q" + + " INNER JOIN #{table_name_prefix}queries_roles#{table_name_suffix} qr on qr.query_id = q.id" + + " INNER JOIN #{MemberRole.table_name} mr ON mr.role_id = qr.role_id" + + " INNER JOIN #{Member.table_name} m ON m.id = mr.member_id AND m.user_id = ?" + + " WHERE q.project_id IS NULL OR q.project_id = m.project_id))" + + " OR #{table_name}.user_id = ?", + VISIBILITY_PUBLIC, VISIBILITY_ROLES, user.id, user.id) + elsif user.logged? + scope.where("#{table_name}.visibility = ? OR #{table_name}.user_id = ?", VISIBILITY_PUBLIC, user.id) + else + scope.where("#{table_name}.visibility = ?", VISIBILITY_PUBLIC) + end } def initialize(attributes=nil, *args) @@ -57,7 +73,53 @@ # Returns true if the query is visible to +user+ or the current user. def visible?(user=User.current) - (project.nil? || user.allowed_to?(:view_issues, project)) && (self.is_public? || self.user_id == user.id) + return true if user.admin? + return false unless project.nil? || user.allowed_to?(:view_issues, project) + case visibility + when VISIBILITY_PUBLIC + true + when VISIBILITY_ROLES + if project + (user.roles_for_project(project) & roles).any? + else + Member.where(:user_id => user.id).joins(:roles).where(:member_roles => {:role_id => roles.map(&:id)}).any? + end + else + user == self.user + end + end + + def is_private? + visibility == VISIBILITY_PRIVATE + end + + def is_public? + !is_private? + end + + def draw_relations + r = options[:draw_relations] + r.nil? || r == '1' + end + + def draw_relations=(arg) + options[:draw_relations] = (arg == '0' ? '0' : nil) + end + + def draw_progress_line + r = options[:draw_progress_line] + r == '1' + end + + def draw_progress_line=(arg) + options[:draw_progress_line] = (arg == '1' ? '1' : nil) + end + + def build_from_params(params) + super + self.draw_relations = params[:draw_relations] || (params[:query] && params[:query][:draw_relations]) + self.draw_progress_line = params[:draw_progress_line] || (params[:query] && params[:query][:draw_progress_line]) + self end def initialize_available_filters @@ -66,7 +128,7 @@ versions = [] categories = [] issue_custom_fields = [] - + if project principals += project.principals.sort unless project.leaf? @@ -81,13 +143,12 @@ principals += Principal.member_of(all_projects) end versions = Version.visible.find_all_by_sharing('system') - issue_custom_fields = IssueCustomField.where(:is_filter => true, :is_for_all => true).all + issue_custom_fields = IssueCustomField.where(:is_for_all => true) end principals.uniq! principals.sort! users = principals.select {|p| p.is_a?(User)} - add_available_filter "status_id", :type => :list_status, :values => IssueStatus.sorted.all.collect{|s| [s.name, s.id.to_s] } @@ -189,8 +250,8 @@ @available_columns = self.class.available_columns.dup @available_columns += (project ? project.all_issue_custom_fields : - IssueCustomField.all - ).collect {|cf| QueryCustomFieldColumn.new(cf) } + IssueCustomField + ).visible.collect {|cf| QueryCustomFieldColumn.new(cf) } if User.current.allowed_to?(:view_time_entries, project, :global => true) index = nil @@ -227,7 +288,7 @@ # Returns the issue count def issue_count - Issue.visible.count(:include => [:status, :project], :conditions => statement) + Issue.visible.joins(:status, :project).where(statement).count rescue ::ActiveRecord::StatementInvalid => e raise StatementInvalid.new(e.message) end @@ -238,7 +299,12 @@ if grouped? begin # Rails3 will raise an (unexpected) RecordNotFound if there's only a nil group value - r = Issue.visible.count(:joins => joins_for_order_statement(group_by_statement), :group => group_by_statement, :include => [:status, :project], :conditions => statement) + r = Issue.visible. + joins(:status, :project). + where(statement). + joins(joins_for_order_statement(group_by_statement)). + group(group_by_statement). + count rescue ActiveRecord::RecordNotFound r = {nil => issue_count} end @@ -257,14 +323,21 @@ def issues(options={}) order_option = [group_by_sort_order, options[:order]].flatten.reject(&:blank?) - issues = Issue.visible.where(options[:conditions]).all( - :include => ([:status, :project] + (options[:include] || [])).uniq, - :conditions => statement, - :order => order_option, - :joins => joins_for_order_statement(order_option.join(',')), - :limit => options[:limit], - :offset => options[:offset] - ) + scope = Issue.visible. + joins(:status, :project). + where(statement). + includes(([:status, :project] + (options[:include] || [])).uniq). + where(options[:conditions]). + order(order_option). + joins(joins_for_order_statement(order_option.join(','))). + limit(options[:limit]). + offset(options[:offset]) + + if has_custom_field_column? + scope = scope.preload(:custom_values) + end + + issues = scope.all if has_column?(:spent_hours) Issue.load_visible_spent_hours(issues) @@ -281,12 +354,16 @@ def issue_ids(options={}) order_option = [group_by_sort_order, options[:order]].flatten.reject(&:blank?) - Issue.visible.scoped(:conditions => options[:conditions]).scoped(:include => ([:status, :project] + (options[:include] || [])).uniq, - :conditions => statement, - :order => order_option, - :joins => joins_for_order_statement(order_option.join(',')), - :limit => options[:limit], - :offset => options[:offset]).find_ids + Issue.visible. + joins(:status, :project). + where(statement). + includes(([:status, :project] + (options[:include] || [])).uniq). + where(options[:conditions]). + order(order_option). + joins(joins_for_order_statement(order_option.join(','))). + limit(options[:limit]). + offset(options[:offset]). + find_ids rescue ::ActiveRecord::StatementInvalid => e raise StatementInvalid.new(e.message) end @@ -294,13 +371,14 @@ # Returns the journals # Valid options are :order, :offset, :limit def journals(options={}) - Journal.visible.all( - :include => [:details, :user, {:issue => [:project, :author, :tracker, :status]}], - :conditions => statement, - :order => options[:order], - :limit => options[:limit], - :offset => options[:offset] - ) + Journal.visible. + joins(:issue => [:project, :status]). + where(statement). + order(options[:order]). + limit(options[:limit]). + offset(options[:offset]). + preload(:details, :user, {:issue => [:project, :author, :tracker, :status]}). + all rescue ::ActiveRecord::StatementInvalid => e raise StatementInvalid.new(e.message) end @@ -308,10 +386,11 @@ # Returns the versions # Valid options are :conditions def versions(options={}) - Version.visible.where(options[:conditions]).all( - :include => :project, - :conditions => project_statement - ) + Version.visible. + where(project_statement). + where(options[:conditions]). + includes(:project). + all rescue ::ActiveRecord::StatementInvalid => e raise StatementInvalid.new(e.message) end diff -Nru redmine-2.3.3/app/models/issue_relation.rb redmine-2.4.2/app/models/issue_relation.rb --- redmine-2.3.3/app/models/issue_relation.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/issue_relation.rb 2013-12-23 08:48:37.000000000 +0000 @@ -72,6 +72,8 @@ attr_protected :issue_from_id, :issue_to_id before_save :handle_issue_order + after_create :create_journal_after_create + after_destroy :create_journal_after_delete def visible?(user=User.current) (issue_from.nil? || issue_from.visible?(user)) && (issue_to.nil? || issue_to.visible?(user)) @@ -179,4 +181,30 @@ self.relation_type = TYPES[relation_type][:reverse] end end + + def create_journal_after_create + journal = issue_from.init_journal(User.current) + journal.details << JournalDetail.new(:property => 'relation', + :prop_key => label_for(issue_from).to_s, + :value => issue_to.id) + journal.save + journal = issue_to.init_journal(User.current) + journal.details << JournalDetail.new(:property => 'relation', + :prop_key => label_for(issue_to).to_s, + :value => issue_from.id) + journal.save + end + + def create_journal_after_delete + journal = issue_from.init_journal(User.current) + journal.details << JournalDetail.new(:property => 'relation', + :prop_key => label_for(issue_from).to_s, + :old_value => issue_to.id) + journal.save + journal = issue_to.init_journal(User.current) + journal.details << JournalDetail.new(:property => 'relation', + :prop_key => label_for(issue_to).to_s, + :old_value => issue_from.id) + journal.save + end end diff -Nru redmine-2.3.3/app/models/journal.rb redmine-2.4.2/app/models/journal.rb --- redmine-2.3.3/app/models/journal.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/journal.rb 2013-12-23 08:48:37.000000000 +0000 @@ -39,6 +39,7 @@ " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"} before_create :split_private_notes + after_create :send_notification scope :visible, lambda {|*args| user = args.shift || User.current @@ -53,6 +54,32 @@ (details.empty? && notes.blank?) ? false : super end + # Returns journal details that are visible to user + def visible_details(user=User.current) + details.select do |detail| + if detail.property == 'cf' + detail.custom_field && detail.custom_field.visible_by?(project, user) + elsif detail.property == 'relation' + Issue.find_by_id(detail.value || detail.old_value).try(:visible?, user) + else + true + end + end + end + + def each_notification(users, &block) + if users.any? + users_by_details_visibility = users.group_by do |user| + visible_details(user) + end + users_by_details_visibility.each do |visible_details, users| + if notes? || visible_details.any? + yield(users) + end + end + end + end + # Returns the new status if the journal contains a status change, otherwise nil def new_status c = details.detect {|detail| detail.prop_key == 'status_id'} @@ -93,20 +120,44 @@ @notify = arg end - def recipients + def notified_users notified = journalized.notified_users if private_notes? notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)} end - notified.map(&:mail) + notified end - def watcher_recipients + def recipients + notified_users.map(&:mail) + end + + def notified_watchers notified = journalized.notified_watchers if private_notes? notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)} end - notified.map(&:mail) + notified + end + + def watcher_recipients + notified_watchers.map(&:mail) + end + + # Sets @custom_field instance variable on journals details using a single query + def self.preload_journals_details_custom_fields(journals) + field_ids = journals.map(&:details).flatten.select {|d| d.property == 'cf'}.map(&:prop_key).uniq + if field_ids.any? + fields_by_id = CustomField.find_all_by_id(field_ids).inject({}) {|h, f| h[f.id] = f; h} + journals.each do |journal| + journal.details.each do |detail| + if detail.property == 'cf' + detail.instance_variable_set "@custom_field", fields_by_id[detail.prop_key.to_i] + end + end + end + end + journals end private @@ -129,4 +180,14 @@ end true end + + def send_notification + if notify? && (Setting.notified_events.include?('issue_updated') || + (Setting.notified_events.include?('issue_note_added') && notes.present?) || + (Setting.notified_events.include?('issue_status_updated') && new_status.present?) || + (Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?) + ) + Mailer.deliver_issue_edit(self) + end + end end diff -Nru redmine-2.3.3/app/models/journal_detail.rb redmine-2.4.2/app/models/journal_detail.rb --- redmine-2.3.3/app/models/journal_detail.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/journal_detail.rb 2013-12-23 08:48:37.000000000 +0000 @@ -19,6 +19,12 @@ belongs_to :journal before_save :normalize_values + def custom_field + if property == 'cf' + @custom_field ||= CustomField.find_by_id(prop_key) + end + end + private def normalize_values diff -Nru redmine-2.3.3/app/models/journal_observer.rb redmine-2.4.2/app/models/journal_observer.rb --- redmine-2.3.3/app/models/journal_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/journal_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class JournalObserver < ActiveRecord::Observer - def after_create(journal) - if journal.notify? && - (Setting.notified_events.include?('issue_updated') || - (Setting.notified_events.include?('issue_note_added') && journal.notes.present?) || - (Setting.notified_events.include?('issue_status_updated') && journal.new_status.present?) || - (Setting.notified_events.include?('issue_priority_updated') && journal.new_value_for('priority_id').present?) - ) - Mailer.issue_edit(journal).deliver - end - end -end diff -Nru redmine-2.3.3/app/models/mail_handler.rb redmine-2.4.2/app/models/mail_handler.rb --- redmine-2.3.3/app/models/mail_handler.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/mail_handler.rb 2013-12-23 08:48:37.000000000 +0000 @@ -46,6 +46,19 @@ super(email) end + # Extracts MailHandler options from environment variables + # Use when receiving emails with rake tasks + def self.extract_options_from_env(env) + options = {:issue => {}} + %w(project status tracker category priority).each do |option| + options[:issue][option.to_sym] = env[option] if env[option] + end + %w(allow_override unknown_user no_permission_check no_account_notice default_group).each do |option| + options[option.to_sym] = env[option] if env[option] + end + options + end + def logger Rails.logger end @@ -63,7 +76,7 @@ sender_email = email.from.to_a.first.to_s.strip # Ignore emails received from the application emission address to avoid hell cycles if sender_email.downcase == Setting.mail_from.to_s.strip.downcase - if logger && logger.info + if logger logger.info "MailHandler: ignoring email from Redmine emission address [#{sender_email}]" end return false @@ -74,7 +87,7 @@ if value value = value.to_s.downcase if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value - if logger && logger.info + if logger logger.info "MailHandler: ignoring email with #{key}:#{value} header" end return false @@ -83,7 +96,7 @@ end @user = User.find_by_mail(sender_email) if sender_email.present? if @user && !@user.active? - if logger && logger.info + if logger logger.info "MailHandler: ignoring email from non-active user [#{@user.login}]" end return false @@ -96,7 +109,7 @@ when 'create' @user = create_user_from_email if @user - if logger && logger.info + if logger logger.info "MailHandler: [#{@user.login}] account created" end add_user_to_group(@@handler_options[:default_group]) @@ -104,14 +117,14 @@ Mailer.account_information(@user, @user.password).deliver end else - if logger && logger.error + if logger logger.error "MailHandler: could not create account for [#{sender_email}]" end return false end else # Default behaviour, emails from unknown users are ignored - if logger && logger.info + if logger logger.info "MailHandler: ignoring email from unknown user [#{sender_email}]" end return false @@ -123,7 +136,7 @@ private - MESSAGE_ID_RE = %r{^ obj, :file => attachment.decoded, :filename => attachment.filename, @@ -263,6 +277,19 @@ end end + # Returns false if the +attachment+ of the incoming email should be ignored + def accept_attachment?(attachment) + @excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?) + @excluded.each do |pattern| + regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i + if attachment.filename.to_s =~ regexp + logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}" + return false + end + end + true + end + # Adds To and Cc as watchers of the given object if the sender has the # appropriate permission def add_watchers(obj) @@ -320,6 +347,13 @@ # * parse the email To field # * specific project (eg. Setting.mail_handler_target_project) target = Project.find_by_identifier(get_keyword(:project)) + if target.nil? + # Invalid project keyword, use the project specified as the default one + default_project = @@handler_options[:issue][:project] + if default_project.present? + target = Project.find_by_identifier(default_project) + end + end raise MissingInformation.new('Unable to determine target project') if target.nil? target end @@ -364,12 +398,26 @@ def plain_text_body return @plain_text_body unless @plain_text_body.nil? - part = email.text_part || email.html_part || email - @plain_text_body = Redmine::CodesetUtil.to_utf8(part.body.decoded, part.charset) + parts = if (text_parts = email.all_parts.select {|p| p.mime_type == 'text/plain'}).present? + text_parts + elsif (html_parts = email.all_parts.select {|p| p.mime_type == 'text/html'}).present? + html_parts + else + [email] + end + + parts.reject! do |part| + part.header[:content_disposition].try(:disposition_type) == 'attachment' + end + + @plain_text_body = parts.map {|p| Redmine::CodesetUtil.to_utf8(p.body.decoded, p.charset)}.join("\r\n") # strip html tags and remove doctype directive - @plain_text_body = strip_tags(@plain_text_body.strip) - @plain_text_body.sub! %r{^ Setting.host_name, :protocol => Setting.protocol } end - # Builds a Mail::Message object used to email recipients of the added issue. - # - # Example: - # issue_add(issue) => Mail::Message object - # Mailer.issue_add(issue).deliver => sends an email to issue recipients - def issue_add(issue) + # Builds a mail for notifying to_users and cc_users about a new issue + def issue_add(issue, to_users, cc_users) redmine_headers 'Project' => issue.project.identifier, 'Issue-Id' => issue.id, 'Issue-Author' => issue.author.login redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to message_id issue + references issue @author = issue.author @issue = issue + @users = to_users + cc_users @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue) - recipients = issue.recipients - cc = issue.watcher_recipients - recipients - mail :to => recipients, - :cc => cc, + mail :to => to_users.map(&:mail), + :cc => cc_users.map(&:mail), :subject => "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}" end - # Builds a Mail::Message object used to email recipients of the edited issue. - # - # Example: - # issue_edit(journal) => Mail::Message object - # Mailer.issue_edit(journal).deliver => sends an email to issue recipients - def issue_edit(journal) - issue = journal.journalized.reload + # Notifies users about a new issue + def self.deliver_issue_add(issue) + to = issue.notified_users + cc = issue.notified_watchers - to + issue.each_notification(to + cc) do |users| + Mailer.issue_add(issue, to & users, cc & users).deliver + end + end + + # Builds a mail for notifying to_users and cc_users about an issue update + def issue_edit(journal, to_users, cc_users) + issue = journal.journalized redmine_headers 'Project' => issue.project.identifier, 'Issue-Id' => issue.id, 'Issue-Author' => issue.author.login @@ -62,20 +63,31 @@ message_id journal references issue @author = journal.user - recipients = journal.recipients - # Watchers in cc - cc = journal.watcher_recipients - recipients s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] " s << "(#{issue.status.name}) " if journal.new_value_for('status_id') s << issue.subject @issue = issue + @users = to_users + cc_users @journal = journal + @journal_details = journal.visible_details(@users.first) @issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue, :anchor => "change-#{journal.id}") - mail :to => recipients, - :cc => cc, + mail :to => to_users.map(&:mail), + :cc => cc_users.map(&:mail), :subject => s end + # Notifies users about an issue update + def self.deliver_issue_edit(journal) + issue = journal.journalized.reload + to = journal.notified_users + cc = journal.notified_watchers + journal.each_notification(to + cc) do |users| + issue.each_notification(users) do |users2| + Mailer.issue_edit(journal, to & users2, cc & users2).deliver + end + end + end + def reminder(user, issues, days) set_language_if_valid user.language @issues = issues @@ -142,6 +154,7 @@ redmine_headers 'Project' => news.project.identifier @author = news.author message_id news + references news @news = news @news_url = url_for(:controller => 'news', :action => 'show', :id => news) mail :to => news.recipients, @@ -158,6 +171,7 @@ redmine_headers 'Project' => news.project.identifier @author = comment.author message_id comment + references news @news = news @comment = comment @news_url = url_for(:controller => 'news', :action => 'show', :id => news) @@ -176,7 +190,7 @@ 'Topic-Id' => (message.parent_id || message.id) @author = message.author message_id message - references message.parent unless message.parent.nil? + references message.root recipients = message.recipients cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients) @message = message @@ -297,31 +311,6 @@ :subject => 'Redmine test' end - # Overrides default deliver! method to prevent from sending an email - # with no recipient, cc or bcc - def deliver!(mail = @mail) - set_language_if_valid @initial_language - return false if (recipients.nil? || recipients.empty?) && - (cc.nil? || cc.empty?) && - (bcc.nil? || bcc.empty?) - - - # Log errors when raise_delivery_errors is set to false, Rails does not - raise_errors = self.class.raise_delivery_errors - self.class.raise_delivery_errors = true - begin - return super(mail) - rescue Exception => e - if raise_errors - raise e - elsif mylogger - mylogger.error "The following error occured while sending email notification: \"#{e.message}\". Check your configuration in config/configuration.yml." - end - ensure - self.class.raise_delivery_errors = raise_errors - end - end - # Sends reminders to issue assignees # Available options: # * :days => how many days in the future to remind about (defaults to 7) @@ -379,7 +368,7 @@ ActionMailer::Base.delivery_method = saved_method end - def mail(headers={}) + def mail(headers={}, &block) headers.merge! 'X-Mailer' => 'Redmine', 'X-Redmine-Host' => Setting.host_name, 'X-Redmine-Site' => Setting.app_title, @@ -389,7 +378,8 @@ 'List-Id' => "<#{Setting.mail_from.to_s.gsub('@', '.')}>" # Removes the author from the recipients and cc - # if he doesn't want to receive notifications about what he does + # if the author does not want to receive notifications + # about what the author do if @author && @author.logged? && @author.pref.no_self_notified headers[:to].delete(@author.mail) if headers[:to].is_a?(Array) headers[:cc].delete(@author.mail) if headers[:cc].is_a?(Array) @@ -410,15 +400,20 @@ headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>" end if @references_objects - headers[:references] = @references_objects.collect {|o| "<#{self.class.message_id_for(o)}>"}.join(' ') + headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ') end - super headers do |format| - format.text - format.html unless Setting.plain_text_mail? + m = if block_given? + super headers, &block + else + super headers do |format| + format.text + format.html unless Setting.plain_text_mail? + end end - set_language_if_valid @initial_language + + m end def initialize(*args) @@ -426,10 +421,20 @@ set_language_if_valid Setting.default_language super end - + def self.deliver_mail(mail) return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank? - super + begin + # Log errors when raise_delivery_errors is set to false, Rails does not + mail.raise_delivery_errors = true + super + rescue Exception => e + if ActionMailer::Base.raise_delivery_errors + raise e + else + Rails.logger.error "Email delivery error: #{e.message}" + end + end end def self.method_missing(method, *args, &block) @@ -448,15 +453,30 @@ h.each { |k,v| headers["X-Redmine-#{k}"] = v.to_s } end - # Returns a predictable Message-Id for the given object - def self.message_id_for(object) - # id + timestamp should reduce the odds of a collision - # as far as we don't send multiple emails for the same object + def self.token_for(object, rand=true) timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) - hash = "redmine.#{object.class.name.demodulize.underscore}-#{object.id}.#{timestamp.strftime("%Y%m%d%H%M%S")}" + hash = [ + "redmine", + "#{object.class.name.demodulize.underscore}-#{object.id}", + timestamp.strftime("%Y%m%d%H%M%S") + ] + if rand + hash << Redmine::Utils.random_hex(8) + end host = Setting.mail_from.to_s.gsub(%r{^.*@}, '') host = "#{::Socket.gethostname}.redmine" if host.empty? - "#{hash}@#{host}" + "#{hash.join('.')}@#{host}" + end + + # Returns a Message-Id for the given object + def self.message_id_for(object) + token_for(object, true) + end + + # Returns a uniq token for a given object referenced by all notifications + # related to this object + def self.references_for(object) + token_for(object, false) end def message_id(object) diff -Nru redmine-2.3.3/app/models/message.rb redmine-2.4.2/app/models/message.rb --- redmine-2.3.3/app/models/message.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/message.rb 2013-12-23 08:48:37.000000000 +0000 @@ -45,6 +45,7 @@ after_create :add_author_as_watcher, :reset_counters! after_update :update_messages_board after_destroy :reset_counters! + after_create :send_notification scope :visible, lambda {|*args| includes(:board => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_messages, *args)) @@ -105,4 +106,10 @@ def add_author_as_watcher Watcher.create(:watchable => self.root, :user => author) end + + def send_notification + if Setting.notified_events.include?('message_posted') + Mailer.message_posted(self).deliver + end + end end diff -Nru redmine-2.3.3/app/models/message_observer.rb redmine-2.4.2/app/models/message_observer.rb --- redmine-2.3.3/app/models/message_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/message_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class MessageObserver < ActiveRecord::Observer - def after_create(message) - Mailer.message_posted(message).deliver if Setting.notified_events.include?('message_posted') - end -end diff -Nru redmine-2.3.3/app/models/news.rb redmine-2.4.2/app/models/news.rb --- redmine-2.3.3/app/models/news.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/news.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,6 +33,7 @@ acts_as_watchable after_create :add_author_as_watcher + after_create :send_notification scope :visible, lambda {|*args| includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args)) @@ -63,4 +64,10 @@ def add_author_as_watcher Watcher.create(:watchable => self, :user => author) end + + def send_notification + if Setting.notified_events.include?('news_added') + Mailer.news_added(self).deliver + end + end end diff -Nru redmine-2.3.3/app/models/news_observer.rb redmine-2.4.2/app/models/news_observer.rb --- redmine-2.3.3/app/models/news_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/news_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class NewsObserver < ActiveRecord::Observer - def after_create(news) - Mailer.news_added(news).deliver if Setting.notified_events.include?('news_added') - end -end diff -Nru redmine-2.3.3/app/models/project.rb redmine-2.4.2/app/models/project.rb --- redmine-2.3.3/app/models/project.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/project.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,8 +33,6 @@ has_many :member_principals, :class_name => 'Member', :include => :principal, :conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})" - has_many :users, :through => :members - has_many :principals, :through => :member_principals, :source => :principal has_many :enabled_modules, :dependent => :delete_all has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position" @@ -92,7 +90,7 @@ scope :status, lambda {|arg| where(arg.blank? ? nil : {:status => arg.to_i}) } scope :all_public, lambda { where(:is_public => true) } scope :visible, lambda {|*args| where(Project.visible_condition(args.shift || User.current, *args)) } - scope :allowed_to, lambda {|*args| + scope :allowed_to, lambda {|*args| user = User.current permission = nil if args.first.is_a?(Symbol) @@ -188,7 +186,7 @@ else statement_by_role = {} unless options[:member] - role = user.logged? ? Role.non_member : Role.anonymous + role = user.builtin_role if role.allowed_to?(permission) statement_by_role[role] = "#{Project.table_name}.is_public = #{connection.quoted_true}" end @@ -215,6 +213,14 @@ end end + def principals + @principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).uniq + end + + def users + @users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).uniq + end + # Returns the Systemwide and project specific activities def activities(include_inactive=false) if include_inactive @@ -287,6 +293,8 @@ alias :base_reload :reload def reload(*args) + @principals = nil + @users = nil @shared_versions = nil @rolled_up_versions = nil @rolled_up_trackers = nil @@ -443,26 +451,29 @@ # Returns a scope of the Versions on subprojects def rolled_up_versions @rolled_up_versions ||= - Version.scoped(:include => :project, - :conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> #{STATUS_ARCHIVED}", lft, rgt]) + Version. + includes(:project). + where("#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status <> ?", lft, rgt, STATUS_ARCHIVED) end # Returns a scope of the Versions used by the project def shared_versions if new_record? - Version.scoped(:include => :project, - :conditions => "#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND #{Version.table_name}.sharing = 'system'") + Version. + includes(:project). + where("#{Project.table_name}.status <> ? AND #{Version.table_name}.sharing = 'system'", STATUS_ARCHIVED) else @shared_versions ||= begin r = root? ? self : root - Version.scoped(:include => :project, - :conditions => "#{Project.table_name}.id = #{id}" + - " OR (#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND (" + - " #{Version.table_name}.sharing = 'system'" + - " OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" + - " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" + - " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + - "))") + Version. + includes(:project). + where("#{Project.table_name}.id = #{id}" + + " OR (#{Project.table_name}.status <> #{Project::STATUS_ARCHIVED} AND (" + + " #{Version.table_name}.sharing = 'system'" + + " OR (#{Project.table_name}.lft >= #{r.lft} AND #{Project.table_name}.rgt <= #{r.rgt} AND #{Version.table_name}.sharing = 'tree')" + + " OR (#{Project.table_name}.lft < #{lft} AND #{Project.table_name}.rgt > #{rgt} AND #{Version.table_name}.sharing IN ('hierarchy', 'descendants'))" + + " OR (#{Project.table_name}.lft > #{lft} AND #{Project.table_name}.rgt < #{rgt} AND #{Version.table_name}.sharing = 'hierarchy')" + + "))") end end end @@ -502,10 +513,14 @@ members.select {|m| m.principal.present? && (m.mail_notification? || m.principal.mail_notification == 'all')}.collect {|m| m.principal} end - # Returns an array of all custom fields enabled for project issues + # Returns a scope of all custom fields enabled for project issues # (explictly associated custom fields and custom fields enabled for all projects) def all_issue_custom_fields - @all_issue_custom_fields ||= (IssueCustomField.for_all + issue_custom_fields).uniq.sort + @all_issue_custom_fields ||= IssueCustomField. + sorted. + where("is_for_all = ? OR id IN (SELECT DISTINCT cfp.custom_field_id" + + " FROM #{table_name_prefix}custom_fields_projects#{table_name_suffix} cfp" + + " WHERE cfp.project_id = ?)", true, id) end # Returns an array of all custom fields enabled for project time entries @@ -946,7 +961,7 @@ def allowed_permissions @allowed_permissions ||= begin - module_names = enabled_modules.all(:select => :name).collect {|m| m.name} + module_names = enabled_modules.loaded? ? enabled_modules.map(&:name) : enabled_modules.pluck(:name) Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name} end end diff -Nru redmine-2.3.3/app/models/query.rb redmine-2.4.2/app/models/query.rb --- redmine-2.3.3/app/models/query.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/query.rb 2013-12-23 08:48:37.000000000 +0000 @@ -81,8 +81,12 @@ end def value(object) - cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)} - cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first + if custom_field.visible_by?(object.project, User.current) + cv = object.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)} + cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first + else + nil + end end def css_classes @@ -116,17 +120,33 @@ class StatementInvalid < ::ActiveRecord::StatementInvalid end + VISIBILITY_PRIVATE = 0 + VISIBILITY_ROLES = 1 + VISIBILITY_PUBLIC = 2 + belongs_to :project belongs_to :user + has_and_belongs_to_many :roles, :join_table => "#{table_name_prefix}queries_roles#{table_name_suffix}", :foreign_key => "query_id" serialize :filters serialize :column_names serialize :sort_criteria, Array + serialize :options, Hash attr_protected :project_id, :user_id validates_presence_of :name validates_length_of :name, :maximum => 255 + validates :visibility, :inclusion => { :in => [VISIBILITY_PUBLIC, VISIBILITY_ROLES, VISIBILITY_PRIVATE] } validate :validate_query_filters + validate do |query| + errors.add(:base, l(:label_role_plural) + ' ' + l('activerecord.errors.messages.blank')) if query.visibility == VISIBILITY_ROLES && roles.blank? + end + + after_save do |query| + if query.visibility_changed? && query.visibility != VISIBILITY_ROLES + query.roles.clear + end + end class_attribute :operators self.operators = { @@ -245,9 +265,9 @@ def editable_by?(user) return false unless user # Admin can edit them all and regular users can edit their private queries - return true if user.admin? || (!is_public && self.user_id == user.id) + return true if user.admin? || (is_private? && self.user_id == user.id) # Members can not edit public queries that are for all project (only admin is allowed to) - is_public && !@is_for_all && user.allowed_to?(:manage_public_queries, project) + is_public? && !@is_for_all && user.allowed_to?(:manage_public_queries, project) end def trackers @@ -429,6 +449,10 @@ column_names && column_names.include?(column.is_a?(QueryColumn) ? column.name : column) end + def has_custom_field_column? + columns.any? {|column| column.is_a? QueryCustomFieldColumn} + end + def has_default_columns? column_names.nil? || column_names.empty? end @@ -545,6 +569,11 @@ end end if filters and valid? + if (c = group_by_column) && c.is_a?(QueryCustomFieldColumn) + # Excludes results for which the grouped custom field is not visible + filters_clauses << c.custom_field.visibility_by_project_condition + end + filters_clauses << project_statement filters_clauses.reject!(&:blank?) @@ -581,7 +610,10 @@ if operator =~ /[<>]/ where = "(#{where}) AND #{db_table}.#{db_field} <> ''" end - "#{queried_table_name}.#{customized_key} #{not_in} IN (SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE #{where})" + "#{queried_table_name}.#{customized_key} #{not_in} IN (" + + "SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name}" + + " LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id}" + + " WHERE (#{where}) AND (#{filter[:field].visibility_by_project_condition}))" end # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+ @@ -730,54 +762,61 @@ return sql end - def add_custom_fields_filters(custom_fields, assoc=nil) - return unless custom_fields.present? - - custom_fields.select(&:is_filter?).sort.each do |field| - case field.field_format - when "text" - options = { :type => :text } - when "list" - options = { :type => :list_optional, :values => field.possible_values } - when "date" - options = { :type => :date } - when "bool" - options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]] } - when "int" - options = { :type => :integer } - when "float" - options = { :type => :float } - when "user", "version" - next unless project - values = field.possible_values_options(project) - if User.current.logged? && field.field_format == 'user' - values.unshift ["<< #{l(:label_me)} >>", "me"] - end - options = { :type => :list_optional, :values => values } - else - options = { :type => :string } + # Adds a filter for the given custom field + def add_custom_field_filter(field, assoc=nil) + case field.field_format + when "text" + options = { :type => :text } + when "list" + options = { :type => :list_optional, :values => field.possible_values } + when "date" + options = { :type => :date } + when "bool" + options = { :type => :list, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]] } + when "int" + options = { :type => :integer } + when "float" + options = { :type => :float } + when "user", "version" + return unless project + values = field.possible_values_options(project) + if User.current.logged? && field.field_format == 'user' + values.unshift ["<< #{l(:label_me)} >>", "me"] end - filter_id = "cf_#{field.id}" - filter_name = field.name - if assoc.present? - filter_id = "#{assoc}.#{filter_id}" - filter_name = l("label_attribute_of_#{assoc}", :name => filter_name) - end - add_available_filter filter_id, options.merge({ - :name => filter_name, - :format => field.field_format, - :field => field - }) + options = { :type => :list_optional, :values => values } + else + options = { :type => :string } + end + filter_id = "cf_#{field.id}" + filter_name = field.name + if assoc.present? + filter_id = "#{assoc}.#{filter_id}" + filter_name = l("label_attribute_of_#{assoc}", :name => filter_name) end + add_available_filter filter_id, options.merge({ + :name => filter_name, + :format => field.field_format, + :field => field + }) end + # Adds filters for the given custom fields scope + def add_custom_fields_filters(scope, assoc=nil) + scope.visible.where(:is_filter => true).sorted.each do |field| + add_custom_field_filter(field, assoc) + end + end + + # Adds filters for the given associations custom fields def add_associations_custom_fields_filters(*associations) - fields_by_class = CustomField.where(:is_filter => true).group_by(&:class) + fields_by_class = CustomField.visible.where(:is_filter => true).group_by(&:class) associations.each do |assoc| association_klass = queried_class.reflect_on_association(assoc).klass fields_by_class.each do |field_class, fields| if field_class.customized_class <= association_klass - add_custom_fields_filters(fields, assoc) + fields.sort.each do |field| + add_custom_field_filter(field, assoc) + end end end end diff -Nru redmine-2.3.3/app/models/repository/bazaar.rb redmine-2.4.2/app/models/repository/bazaar.rb --- redmine-2.3.3/app/models/repository/bazaar.rb 2013-09-14 06:48:13.000000000 +0000 +++ redmine-2.4.2/app/models/repository/bazaar.rb 2013-12-23 08:48:37.000000000 +0000 @@ -68,15 +68,11 @@ full_path = File.join(root_url, e.path) e.size = File.stat(full_path).size if File.file?(full_path) end - c = Change.find( - :first, - :include => :changeset, - :conditions => [ - "#{Change.table_name}.revision = ? and #{Changeset.table_name}.repository_id = ?", - e.lastrev.revision, - id - ], - :order => "#{Changeset.table_name}.revision DESC") + c = Change. + includes(:changeset). + where("#{Change.table_name}.revision = ? and #{Changeset.table_name}.repository_id = ?", e.lastrev.revision, id). + order("#{Changeset.table_name}.revision DESC"). + first if c e.lastrev.identifier = c.changeset.revision e.lastrev.name = c.changeset.revision diff -Nru redmine-2.3.3/app/models/repository/cvs.rb redmine-2.4.2/app/models/repository/cvs.rb --- redmine-2.3.3/app/models/repository/cvs.rb 2013-09-14 06:48:13.000000000 +0000 +++ redmine-2.4.2/app/models/repository/cvs.rb 2013-12-23 08:48:37.000000000 +0000 @@ -143,14 +143,11 @@ ) cmt = Changeset.normalize_comments(revision.message, repo_log_encoding) author_utf8 = Changeset.to_utf8(revision.author, repo_log_encoding) - cs = changesets.find( - :first, - :conditions => { - :committed_on => tmp_time - time_delta .. tmp_time + time_delta, - :committer => author_utf8, - :comments => cmt - } - ) + cs = changesets.where( + :committed_on => tmp_time - time_delta .. tmp_time + time_delta, + :committer => author_utf8, + :comments => cmt + ).first # create a new changeset.... unless cs # we use a temporaray revision number here (just for inserting) @@ -185,10 +182,10 @@ end # Renumber new changesets in chronological order - Changeset.all( - :order => 'committed_on ASC, id ASC', - :conditions => ["repository_id = ? AND revision LIKE 'tmp%'", id] - ).each do |changeset| + Changeset. + order('committed_on ASC, id ASC'). + where("repository_id = ? AND revision LIKE 'tmp%'", id). + each do |changeset| changeset.update_attribute :revision, next_revision_number end end # transaction diff -Nru redmine-2.3.3/app/models/repository/git.rb redmine-2.4.2/app/models/repository/git.rb --- redmine-2.3.3/app/models/repository/git.rb 2013-09-14 06:48:13.000000000 +0000 +++ redmine-2.4.2/app/models/repository/git.rb 2013-12-23 08:48:37.000000000 +0000 @@ -191,13 +191,8 @@ offset = 0 revisions_copy = revisions.clone # revisions will change while offset < revisions_copy.size - recent_changesets_slice = changesets.find( - :all, - :conditions => [ - 'scmid IN (?)', - revisions_copy.slice(offset, limit).map{|x| x.scmid} - ] - ) + scmids = revisions_copy.slice(offset, limit).map{|x| x.scmid} + recent_changesets_slice = changesets.where(:scmid => scmids).all # Subtract revisions that redmine already knows about recent_revisions = recent_changesets_slice.map{|c| c.scmid} revisions.reject!{|r| recent_revisions.include?(r.scmid)} @@ -246,13 +241,7 @@ revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false) return [] if revisions.nil? || revisions.empty? - changesets.find( - :all, - :conditions => [ - "scmid IN (?)", - revisions.map!{|c| c.scmid} - ] - ) + changesets.where(:scmid => revisions.map {|c| c.scmid}).all end def clear_extra_info_of_changesets diff -Nru redmine-2.3.3/app/models/repository/subversion.rb redmine-2.4.2/app/models/repository/subversion.rb --- redmine-2.3.3/app/models/repository/subversion.rb 2013-09-14 06:48:13.000000000 +0000 +++ redmine-2.4.2/app/models/repository/subversion.rb 2013-12-23 08:48:37.000000000 +0000 @@ -20,7 +20,7 @@ class Repository::Subversion < Repository attr_protected :root_url validates_presence_of :url - validates_format_of :url, :with => /\A(http|https|svn(\+[^\s:\/\\]+)?|file):\/\/.+/i + validates_format_of :url, :with => %r{\A(http|https|svn(\+[^\s:\/\\]+)?|file):\/\/.+}i def self.scm_adapter_class Redmine::Scm::Adapters::SubversionAdapter diff -Nru redmine-2.3.3/app/models/repository.rb redmine-2.4.2/app/models/repository.rb --- redmine-2.3.3/app/models/repository.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/repository.rb 2013-12-23 08:48:37.000000000 +0000 @@ -249,19 +249,18 @@ # Default behaviour is to search in cached changesets def latest_changesets(path, rev, limit=10) if path.blank? - changesets.find( - :all, - :include => :user, - :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC", - :limit => limit) + changesets. + reorder("#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"). + limit(limit). + preload(:user). + all else - filechanges.find( - :all, - :include => {:changeset => :user}, - :conditions => ["path = ?", path.with_leading_slash], - :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC", - :limit => limit - ).collect(&:changeset) + filechanges. + where("path = ?", path.with_leading_slash). + reorder("#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"). + limit(limit). + preload(:changeset => :user). + collect(&:changeset) end end @@ -393,7 +392,7 @@ end def set_as_default? - new_record? && project && !Repository.first(:conditions => {:project_id => project.id}) + new_record? && project && Repository.where(:project_id => project.id).empty? end protected diff -Nru redmine-2.3.3/app/models/role.rb redmine-2.4.2/app/models/role.rb --- redmine-2.3.3/app/models/role.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/role.rb 2013-12-23 08:48:37.000000000 +0000 @@ -52,6 +52,7 @@ WorkflowRule.copy(nil, source_role, nil, proxy_association.owner) end end + has_and_belongs_to_many :custom_fields, :join_table => "#{table_name_prefix}custom_fields_roles#{table_name_suffix}", :foreign_key => "role_id" has_many :member_roles, :dependent => :destroy has_many :members, :through => :member_roles @@ -137,7 +138,7 @@ def anonymous? builtin == 2 end - + # Return true if the role is a project member role def member? !self.builtin? diff -Nru redmine-2.3.3/app/models/setting.rb redmine-2.4.2/app/models/setting.rb --- redmine-2.3.3/app/models/setting.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/setting.rb 2013-12-23 08:48:37.000000000 +0000 @@ -132,15 +132,87 @@ def self.#{name}=(value) self[:#{name}] = value end - END_SRC +END_SRC class_eval src, __FILE__, __LINE__ end + # Sets a setting value from params + def self.set_from_params(name, params) + params = params.dup + params.delete_if {|v| v.blank? } if params.is_a?(Array) + + m = "#{name}_from_params" + if respond_to? m + self[name.to_sym] = send m, params + else + self[name.to_sym] = params + end + end + + # Returns a hash suitable for commit_update_keywords setting + # + # Example: + # params = {:keywords => ['fixes', 'closes'], :status_id => ["3", "5"], :done_ratio => ["", "100"]} + # Setting.commit_update_keywords_from_params(params) + # # => [{'keywords => 'fixes', 'status_id' => "3"}, {'keywords => 'closes', 'status_id' => "5", 'done_ratio' => "100"}] + def self.commit_update_keywords_from_params(params) + s = [] + if params.is_a?(Hash) && params.key?(:keywords) && params.values.all? {|v| v.is_a? Array} + attributes = params.except(:keywords).keys + params[:keywords].each_with_index do |keywords, i| + next if keywords.blank? + s << attributes.inject({}) {|h, a| + value = params[a][i].to_s + h[a.to_s] = value if value.present? + h + }.merge('keywords' => keywords) + end + end + s + end + # Helper that returns an array based on per_page_options setting def self.per_page_options_array per_page_options.split(%r{[\s,]}).collect(&:to_i).select {|n| n > 0}.sort end + # Helper that returns a Hash with single update keywords as keys + def self.commit_update_keywords_array + a = [] + if commit_update_keywords.is_a?(Array) + commit_update_keywords.each do |rule| + next unless rule.is_a?(Hash) + rule = rule.dup + rule.delete_if {|k, v| v.blank?} + keywords = rule['keywords'].to_s.downcase.split(",").map(&:strip).reject(&:blank?) + next if keywords.empty? + a << rule.merge('keywords' => keywords) + end + end + a + end + + def self.commit_fix_keywords + ActiveSupport::Deprecation.warn "Setting.commit_fix_keywords is deprecated and will be removed in Redmine 3" + if commit_update_keywords.is_a?(Array) + commit_update_keywords.first && commit_update_keywords.first['keywords'] + end + end + + def self.commit_fix_status_id + ActiveSupport::Deprecation.warn "Setting.commit_fix_status_id is deprecated and will be removed in Redmine 3" + if commit_update_keywords.is_a?(Array) + commit_update_keywords.first && commit_update_keywords.first['status_id'] + end + end + + def self.commit_fix_done_ratio + ActiveSupport::Deprecation.warn "Setting.commit_fix_done_ratio is deprecated and will be removed in Redmine 3" + if commit_update_keywords.is_a?(Array) + commit_update_keywords.first && commit_update_keywords.first['done_ratio'] + end + end + def self.openid? Object.const_defined?(:OpenID) && self[:openid].to_i > 0 end @@ -154,7 +226,7 @@ clear_cache end end - + # Clears the settings cache def self.clear_cache @cached_settings.clear diff -Nru redmine-2.3.3/app/models/time_entry_query.rb redmine-2.4.2/app/models/time_entry_query.rb --- redmine-2.3.3/app/models/time_entry_query.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/time_entry_query.rb 2013-12-23 08:48:37.000000000 +0000 @@ -84,15 +84,15 @@ add_available_filter "comments", :type => :text add_available_filter "hours", :type => :float - add_custom_fields_filters(TimeEntryCustomField.where(:is_filter => true).all) + add_custom_fields_filters(TimeEntryCustomField) add_associations_custom_fields_filters :project, :issue, :user end def available_columns return @available_columns if @available_columns @available_columns = self.class.available_columns.dup - @available_columns += TimeEntryCustomField.all.map {|cf| QueryCustomFieldColumn.new(cf) } - @available_columns += IssueCustomField.all.map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf) } + @available_columns += TimeEntryCustomField.visible.all.map {|cf| QueryCustomFieldColumn.new(cf) } + @available_columns += IssueCustomField.visible.all.map {|cf| QueryAssociationCustomFieldColumn.new(:issue, cf) } @available_columns end @@ -106,7 +106,20 @@ TimeEntry.visible. where(statement). order(order_option). - joins(joins_for_order_statement(order_option.join(','))) + joins(joins_for_order_statement(order_option.join(','))). + includes(:activity) + end + + def sql_for_activity_id_field(field, operator, value) + condition_on_id = sql_for_field(field, operator, value, Enumeration.table_name, 'id') + condition_on_parent_id = sql_for_field(field, operator, value, Enumeration.table_name, 'parent_id') + ids = value.map(&:to_i).join(',') + table_name = Enumeration.table_name + if operator == '=' + "(#{table_name}.id IN (#{ids}) OR #{table_name}.parent_id IN (#{ids}))" + else + "(#{table_name}.id NOT IN (#{ids}) AND (#{table_name}.parent_id IS NULL OR #{table_name}.parent_id NOT IN (#{ids})))" + end end # Accepts :from/:to params as shortcut filters diff -Nru redmine-2.3.3/app/models/user.rb redmine-2.4.2/app/models/user.rb --- redmine-2.3.3/app/models/user.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/user.rb 2013-12-23 08:48:37.000000000 +0000 @@ -81,7 +81,7 @@ acts_as_customizable - attr_accessor :password, :password_confirmation + attr_accessor :password, :password_confirmation, :generate_password attr_accessor :last_before_login_on # Prevents unauthorized assignments attr_protected :login, :admin, :password, :password_confirmation, :hashed_password @@ -103,8 +103,9 @@ validate :validate_password_length before_create :set_mail_notification - before_save :update_hashed_password + before_save :generate_password_if_needed, :update_hashed_password before_destroy :remove_references_before_destroy + after_save :update_notified_project_ids scope :in_group, lambda {|group| group_id = group.is_a?(Group) ? group.id : group.to_i @@ -133,6 +134,9 @@ @name = nil @projects_by_role = nil @membership_by_project_id = nil + @notified_projects_ids = nil + @notified_projects_ids_changed = false + @builtin_role = nil base_reload(*args) end @@ -154,7 +158,7 @@ end # Returns the user that matches provided login and password, or nil - def self.try_to_login(login, password) + def self.try_to_login(login, password, active_only=true) login = login.to_s password = password.to_s @@ -163,8 +167,8 @@ user = find_by_login(login) if user # user is already in local database - return nil unless user.active? return nil unless user.check_password?(password) + return nil if !user.active? && active_only else # user is not yet registered, try to authenticate with available sources attrs = AuthSource.authenticate(login, password) @@ -178,7 +182,7 @@ end end end - user.update_column(:last_login_on, Time.now) if user && !user.new_record? + user.update_column(:last_login_on, Time.now) if user && !user.new_record? && user.active? user rescue => text raise text @@ -276,13 +280,20 @@ return auth_source.allow_password_changes? end - # Generate and set a random password. Useful for automated user creation - # Based on Token#generate_token_value - # - def random_password + def must_change_password? + must_change_passwd? && change_password_allowed? + end + + def generate_password? + generate_password == '1' || generate_password == true + end + + # Generate and set a random password on given length + def random_password(length=40) chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a + chars -= %w(0 O 1 l) password = '' - 40.times { |i| password << chars[rand(chars.size-1)] } + length.times {|i| password << chars[SecureRandom.random_number(chars.size)] } self.password = password self.password_confirmation = password self @@ -322,12 +333,20 @@ end def notified_project_ids=(ids) - Member.update_all("mail_notification = #{connection.quoted_false}", ['user_id = ?', id]) - Member.update_all("mail_notification = #{connection.quoted_true}", ['user_id = ? AND project_id IN (?)', id, ids]) if ids && !ids.empty? - @notified_projects_ids = nil - notified_projects_ids + @notified_projects_ids_changed = true + @notified_projects_ids = ids end + # Updates per project notifications (after_save callback) + def update_notified_project_ids + if @notified_projects_ids_changed + ids = (mail_notification == 'selected' ? Array.wrap(notified_projects_ids).reject(&:blank?) : []) + members.update_all(:mail_notification => false) + members.where(:project_id => ids).update_all(:mail_notification => true) if ids.any? + end + end + private :update_notified_project_ids + def valid_notification_options self.class.valid_notification_options(self) end @@ -428,23 +447,20 @@ @membership_by_project_id[project_id] end + # Returns the user's bult-in role + def builtin_role + @builtin_role ||= Role.non_member + end + # Return user's roles for project def roles_for_project(project) roles = [] # No role on archived projects return roles if project.nil? || project.archived? - if logged? - # Find project membership - membership = membership(project) - if membership - roles = membership.roles - else - @role_non_member ||= Role.non_member - roles << @role_non_member - end + if membership = membership(project) + roles = membership.roles else - @role_anonymous ||= Role.anonymous - roles << @role_anonymous + roles << builtin_role end roles end @@ -536,7 +552,7 @@ allowed_to?(action, nil, options.reverse_merge(:global => true), &block) end - # Returns true if the user is allowed to delete his own account + # Returns true if the user is allowed to delete the user's own account def own_account_deletable? Setting.unsubscribe? && (!admin? || User.active.where("admin = ? AND id <> ?", true, id).exists?) @@ -547,6 +563,7 @@ 'lastname', 'mail', 'mail_notification', + 'notified_project_ids', 'language', 'custom_field_values', 'custom_fields', @@ -554,6 +571,8 @@ safe_attributes 'status', 'auth_source_id', + 'generate_password', + 'must_change_passwd', :if => lambda {|user, current_user| current_user.admin?} safe_attributes 'group_ids', @@ -623,6 +642,7 @@ protected def validate_password_length + return if password.blank? && generate_password? # Password length validation based on setting if !password.nil? && password.size < Setting.password_min_length.to_i errors.add(:password, :too_short, :count => Setting.password_min_length.to_i) @@ -631,6 +651,13 @@ private + def generate_password_if_needed + if generate_password? && auth_source.nil? + length = [Setting.password_min_length.to_i + 2, 10].max + random_password(length) + end + end + # Removes references that are not handled by associations # Things that are not deleted are reassociated with the anonymous user def remove_references_before_destroy @@ -647,7 +674,7 @@ Message.update_all ['author_id = ?', substitute.id], ['author_id = ?', id] News.update_all ['author_id = ?', substitute.id], ['author_id = ?', id] # Remove private queries and keep public ones - ::Query.delete_all ['user_id = ? AND is_public = ?', id, false] + ::Query.delete_all ['user_id = ? AND visibility = ?', id, ::Query::VISIBILITY_PRIVATE] ::Query.update_all ['user_id = ?', substitute.id], ['user_id = ?', id] TimeEntry.update_all ['user_id = ?', substitute.id], ['user_id = ?', id] Token.delete_all ['user_id = ?', id] @@ -692,7 +719,16 @@ UserPreference.new(:user => self) end - def member_of?(project) + # Returns the user's bult-in role + def builtin_role + @builtin_role ||= Role.anonymous + end + + def membership(*args) + nil + end + + def member_of?(*args) false end diff -Nru redmine-2.3.3/app/models/user_preference.rb redmine-2.4.2/app/models/user_preference.rb --- redmine-2.3.3/app/models/user_preference.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/user_preference.rb 2013-12-23 08:48:37.000000000 +0000 @@ -22,7 +22,7 @@ attr_protected :others, :user_id before_save :set_others_hash - + def initialize(attributes=nil, *args) super self.others ||= {} diff -Nru redmine-2.3.3/app/models/version.rb redmine-2.4.2/app/models/version.rb --- redmine-2.3.3/app/models/version.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/version.rb 2013-12-23 08:48:37.000000000 +0000 @@ -40,7 +40,7 @@ includes(:project).where(Project.allowed_to_condition(args.first || User.current, :view_issues)) } - safe_attributes 'name', + safe_attributes 'name', 'description', 'effective_date', 'due_date', diff -Nru redmine-2.3.3/app/models/watcher.rb redmine-2.4.2/app/models/watcher.rb --- redmine-2.3.3/app/models/watcher.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/watcher.rb 2013-12-23 08:48:37.000000000 +0000 @@ -23,6 +23,19 @@ validates_uniqueness_of :user_id, :scope => [:watchable_type, :watchable_id] validate :validate_user + # Returns true if at least one object among objects is watched by user + def self.any_watched?(objects, user) + objects = objects.reject(&:new_record?) + if objects.any? + objects.group_by {|object| object.class.base_class}.each do |base_class, objects| + if Watcher.where(:watchable_type => base_class.name, :watchable_id => objects.map(&:id), :user_id => user.id).exists? + return true + end + end + end + false + end + # Unwatch things that users are no longer allowed to view def self.prune(options={}) if options.has_key?(:user) diff -Nru redmine-2.3.3/app/models/wiki.rb redmine-2.4.2/app/models/wiki.rb --- redmine-2.3.3/app/models/wiki.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/wiki.rb 2013-12-23 08:48:37.000000000 +0000 @@ -50,10 +50,10 @@ @page_found_with_redirect = false title = start_page if title.blank? title = Wiki.titleize(title) - page = pages.first(:conditions => ["LOWER(title) = LOWER(?)", title]) + page = pages.where("LOWER(title) = LOWER(?)", title).first if !page && !(options[:with_redirect] == false) # search for a redirect - redirect = redirects.first(:conditions => ["LOWER(title) = LOWER(?)", title]) + redirect = redirects.where("LOWER(title) = LOWER(?)", title).first if redirect page = find_page(redirect.redirects_to, :with_redirect => false) @page_found_with_redirect = true diff -Nru redmine-2.3.3/app/models/wiki_content.rb redmine-2.4.2/app/models/wiki_content.rb --- redmine-2.3.3/app/models/wiki_content.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/wiki_content.rb 2013-12-23 08:48:37.000000000 +0000 @@ -26,6 +26,8 @@ acts_as_versioned + after_save :send_notification + def visible?(user=User.current) page.visible?(user) end @@ -145,4 +147,19 @@ end end end + + private + + def send_notification + # new_record? returns false in after_save callbacks + if id_changed? + if Setting.notified_events.include?('wiki_content_added') + Mailer.wiki_content_added(self).deliver + end + elsif text_changed? + if Setting.notified_events.include?('wiki_content_updated') + Mailer.wiki_content_updated(self).deliver + end + end + end end diff -Nru redmine-2.3.3/app/models/wiki_content_observer.rb redmine-2.4.2/app/models/wiki_content_observer.rb --- redmine-2.3.3/app/models/wiki_content_observer.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/wiki_content_observer.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 Jean-Philippe Lang -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -class WikiContentObserver < ActiveRecord::Observer - def after_create(wiki_content) - Mailer.wiki_content_added(wiki_content).deliver if Setting.notified_events.include?('wiki_content_added') - end - - def after_update(wiki_content) - if wiki_content.text_changed? - Mailer.wiki_content_updated(wiki_content).deliver if Setting.notified_events.include?('wiki_content_updated') - end - end -end diff -Nru redmine-2.3.3/app/models/wiki_page.rb redmine-2.4.2/app/models/wiki_page.rb --- redmine-2.3.3/app/models/wiki_page.rb 2013-09-14 06:48:14.000000000 +0000 +++ redmine-2.4.2/app/models/wiki_page.rb 2013-12-23 08:48:37.000000000 +0000 @@ -175,9 +175,10 @@ end # Saves the page and its content if text was changed - def save_with_content + def save_with_content(content) ret = nil transaction do + self.content = content if new_record? # Rails automatically saves associated content ret = save diff -Nru redmine-2.3.3/app/views/account/login.html.erb redmine-2.4.2/app/views/account/login.html.erb --- redmine-2.3.3/app/views/account/login.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/account/login.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -4,34 +4,34 @@ <%= back_url_hidden_field_tag %> - - + + - - + + <% if Setting.openid? %> - - + + <% end %> - - - diff -Nru redmine-2.3.3/app/views/activities/index.html.erb redmine-2.4.2/app/views/activities/index.html.erb --- redmine-2.3.3/app/views/activities/index.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/activities/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -43,11 +43,17 @@ <% content_for :sidebar do %> <%= form_tag({}, :method => :get) do %>

<%= l(:label_activity) %>

-

<% @activity.event_types.each do |t| %> -<%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> - -
-<% end %>

+ <% if @project && @project.descendants.active.any? %> <%= hidden_field_tag 'with_subprojects', 0 %>

diff -Nru redmine-2.3.3/app/views/admin/info.html.erb redmine-2.4.2/app/views/admin/info.html.erb --- redmine-2.3.3/app/views/admin/info.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/admin/info.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -5,8 +5,8 @@
<%= text_field_tag 'username', params[:username], :tabindex => '1' %><%= text_field_tag 'username', params[:username], :tabindex => '1' %>
<%= password_field_tag 'password', nil, :tabindex => '2' %><%= password_field_tag 'password', nil, :tabindex => '2' %>
<%= text_field_tag "openid_url", nil, :tabindex => '3' %><%= text_field_tag "openid_url", nil, :tabindex => '3' %>
+ <% if Setting.autologin? %> <% end %>
+ <% if Setting.lost_password? %> <%= link_to l(:label_password_lost), lost_password_path %> <% end %> +
<% @checklist.each do |label, result| %> - - + <% end %> diff -Nru redmine-2.3.3/app/views/admin/plugins.html.erb redmine-2.4.2/app/views/admin/plugins.html.erb --- redmine-2.3.3/app/views/admin/plugins.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/admin/plugins.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,10 +1,10 @@ -

<%= l(:label_plugins) %>

+<%= title l(:label_plugins) %> <% if @plugins.any? %>
<%= l(label) %><%= image_tag((result ? 'true.png' : 'exclamation.png'), + <%= l(label) %><%= image_tag((result ? 'true.png' : 'exclamation.png'), :style => "vertical-align:bottom;") %>
<% @plugins.each do |plugin| %> - diff -Nru redmine-2.3.3/app/views/admin/projects.html.erb redmine-2.4.2/app/views/admin/projects.html.erb --- redmine-2.3.3/app/views/admin/projects.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/admin/projects.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -2,7 +2,7 @@ <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %> -

<%=l(:label_project_plural)%>

+<%= title l(:label_project_plural) %> <%= form_tag({}, :method => :get) do %>
<%= l(:label_filter_plural) %> @@ -28,8 +28,8 @@ <% project_tree(@projects) do |project, level| %>
<%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> - - + +
<%=h plugin.name %> + <%=h plugin.name %> <%= content_tag('span', h(plugin.description), :class => 'description') unless plugin.description.blank? %> <%= content_tag('span', link_to(h(plugin.url), plugin.url), :class => 'url') unless plugin.url.blank? %>
<%= link_to_project_settings(project, {}, :title => project.short_description) %><%= checked_image project.is_public? %><%= format_date(project.created_on) %><%= checked_image project.is_public? %><%= format_date(project.created_on) %> <%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-lock') unless project.archived? %> <%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if project.archived? && (project.parent.nil? || !project.parent.archived?) %> @@ -41,5 +41,3 @@
- -<% html_title(l(:label_project_plural)) -%> diff -Nru redmine-2.3.3/app/views/attachments/upload.js.erb redmine-2.4.2/app/views/attachments/upload.js.erb --- redmine-2.3.3/app/views/attachments/upload.js.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/attachments/upload.js.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,8 @@ var fileSpan = $('#attachments_<%= j params[:attachment_id] %>'); +<% if @attachment.new_record? %> + fileSpan.hide(); + alert("<%= escape_javascript @attachment.errors.full_messages.join(', ') %>"); +<% else %> $('', { type: 'hidden', name: 'attachments[<%= j params[:attachment_id] %>][token]' } ).val('<%= j @attachment.token %>').appendTo(fileSpan); fileSpan.find('a.remove-upload') .attr({ @@ -7,3 +11,4 @@ href: '<%= j attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>' }) .off('click'); +<% end %> diff -Nru redmine-2.3.3/app/views/auth_sources/edit.html.erb redmine-2.4.2/app/views/auth_sources/edit.html.erb --- redmine-2.3.3/app/views/auth_sources/edit.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/auth_sources/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

<%=l(:label_auth_source)%> (<%= h(@auth_source.auth_method_name) %>)

+<%= title [l(:label_auth_source_plural), auth_sources_path], @auth_source.name %> <%= labelled_form_for @auth_source, :as => :auth_source, :url => auth_source_path(@auth_source), :html => {:id => 'auth_source_form'} do |f| %> <%= render :partial => auth_source_partial_name(@auth_source), :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/auth_sources/index.html.erb redmine-2.4.2/app/views/auth_sources/index.html.erb --- redmine-2.3.3/app/views/auth_sources/index.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/auth_sources/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -2,7 +2,7 @@ <%= link_to l(:label_auth_source_new), {:action => 'new'}, :class => 'icon icon-add' %> -

<%=l(:label_auth_source_plural)%>

+<%= title l(:label_auth_source_plural) %> @@ -15,10 +15,10 @@ <% for source in @auth_sources %> "> - - - - + + + + <% Board.board_tree(@boards) do |board, level| %> - diff -Nru redmine-2.3.3/app/views/common/_file.html.erb redmine-2.4.2/app/views/common/_file.html.erb --- redmine-2.3.3/app/views/common/_file.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/common/_file.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -3,8 +3,8 @@ <% line_num = 1 %> <% syntax_highlight_lines(filename, Redmine::CodesetUtil.to_utf8_by_setting(content)).each do |line| %> - - + - @@ -32,7 +32,7 @@ - diff -Nru redmine-2.3.3/app/views/gantts/show.html.erb redmine-2.4.2/app/views/gantts/show.html.erb --- redmine-2.3.3/app/views/gantts/show.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/gantts/show.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,11 @@ <% @gantt.view = self %> +
+<% if !@query.new_record? && @query.editable_by?(User.current) %> + <%= link_to l(:button_edit), edit_query_path(@query, :gantt => 1), :class => 'icon icon-edit' %> + <%= delete_link query_path(@query, :gantt => 1) %> +<% end %> +
+

<%= @query.new_record? ? l(:label_gantt) : h(@query.name) %>

<%= form_tag({:controller => 'gantts', :action => 'show', @@ -6,6 +13,7 @@ :year => params[:year], :months => params[:months]}, :method => :get, :id => 'query_form') do %> <%= hidden_field_tag 'set_filter', '1' %> +<%= hidden_field_tag 'gantt', '1' %>
"> <%= l(:label_filter_plural) %>
"> @@ -20,8 +28,8 @@
<%= link_to(h(source.name), :action => 'edit', :id => source)%><%= h source.auth_method_name %><%= h source.host %><%= h source.users.count %><%= link_to(h(source.name), :action => 'edit', :id => source)%><%= h source.auth_method_name %><%= h source.host %><%= h source.users.count %> <%= link_to l(:button_test), try_connection_auth_source_path(source), :class => 'icon icon-test' %> <%= delete_link auth_source_path(source) %> diff -Nru redmine-2.3.3/app/views/auth_sources/new.html.erb redmine-2.4.2/app/views/auth_sources/new.html.erb --- redmine-2.3.3/app/views/auth_sources/new.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/auth_sources/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

<%=l(:label_auth_source_new)%> (<%= h(@auth_source.auth_method_name) %>)

+<%= title [l(:label_auth_source_plural), auth_sources_path], "#{l(:label_auth_source_new)} (#{@auth_source.auth_method_name})" %> <%= labelled_form_for @auth_source, :as => :auth_source, :url => auth_sources_path, :html => {:id => 'auth_source_form'} do |f| %> <%= hidden_field_tag 'type', @auth_source.type %> diff -Nru redmine-2.3.3/app/views/boards/index.html.erb redmine-2.4.2/app/views/boards/index.html.erb --- redmine-2.3.3/app/views/boards/index.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/boards/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -10,7 +10,7 @@
+ <%= link_to h(board.name), project_board_path(board.project, board), :class => "board" %>
<%=h board.description %>
+
<%= line_num %> diff -Nru redmine-2.3.3/app/views/common/_tabs.html.erb redmine-2.4.2/app/views/common/_tabs.html.erb --- redmine-2.3.3/app/views/common/_tabs.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/common/_tabs.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -6,7 +6,7 @@
  • <%= link_to l(tab[:label]), { :tab => tab[:name] }, :id => "tab-#{tab[:name]}", :class => (tab[:name] != selected_tab ? nil : 'selected'), - :onclick => "showTab('#{tab[:name]}'); this.blur(); return false;" %>
  • + :onclick => "showTab('#{tab[:name]}', this.href); this.blur(); return false;" %> <% end -%>
    + <%= link_to(h(container), {:controller => 'versions', :action => 'show', :id => container}, :class => "icon icon-package") %>
    <%= number_to_human_size(file.filesize) %> <%= file.downloads %> <%= file.digest %> + <%= link_to(image_tag('delete.png'), attachment_path(file), :data => {:confirm => l(:text_are_you_sure)}, :method => :delete) if delete_allowed %>
    <%= l(:label_related_issues) %> -
    <%= l(:label_gantt_progress_line) %> -
    @@ -62,6 +70,11 @@ :class => 'icon icon-checked' %> <%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, :class => 'icon icon-reload' %> +<% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> + <%= link_to_function l(:button_save), + "$('#query_form').attr('action', '#{ @project ? new_project_query_path(@project) : new_query_path }').submit();", + :class => 'icon icon-save' %> +<% end %>

    <% end %> @@ -280,11 +293,11 @@ - - @@ -313,7 +326,7 @@ $(document).ready(drawGanttHandler); $(window).resize(drawGanttHandler); $(function() { - $("#draw_rels").change(drawGanttHandler); + $("#draw_relations").change(drawGanttHandler); $("#draw_progress_line").change(drawGanttHandler); }); <% end %> diff -Nru redmine-2.3.3/app/views/groups/edit.html.erb redmine-2.4.2/app/views/groups/edit.html.erb --- redmine-2.3.3/app/views/groups/edit.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/groups/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,5 +1,3 @@ -

    <%= link_to l(:label_group_plural), groups_path %> » <%= h(@group) %>

    +<%= title [l(:label_group_plural), groups_path], @group.name %> <%= render_tabs group_settings_tabs %> - -<% html_title(l(:label_group), @group, l(:label_administration)) -%> diff -Nru redmine-2.3.3/app/views/groups/index.html.erb redmine-2.4.2/app/views/groups/index.html.erb --- redmine-2.3.3/app/views/groups/index.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/groups/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -2,7 +2,7 @@ <%= link_to l(:label_group_new), new_group_path, :class => 'icon icon-add' %> -

    <%= l(:label_group_plural) %>

    +<%= title l(:label_group_plural) %> <% if @groups.any? %>
    + <%= link_to_content_update("\xc2\xab " + l(:label_previous), params.merge(@gantt.params_previous)) %> + <%= link_to_content_update(l(:label_next) + " \xc2\xbb", params.merge(@gantt.params_next)) %>
    @@ -14,8 +14,8 @@ <% @groups.each do |group| %> - - + + <% end %> diff -Nru redmine-2.3.3/app/views/groups/new.html.erb redmine-2.4.2/app/views/groups/new.html.erb --- redmine-2.3.3/app/views/groups/new.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/groups/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_group_plural), groups_path %> » <%= l(:label_group_new) %>

    +<%= title [l(:label_group_plural), groups_path], l(:label_group_new) %> <%= labelled_form_for @group do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/groups/show.html.erb redmine-2.4.2/app/views/groups/show.html.erb --- redmine-2.3.3/app/views/groups/show.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/groups/show.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_group_plural), groups_path %> » <%=h @group %>

    +<%= title [l(:label_group_plural), groups_path], @group.name %>
      <% @group.users.each do |user| %> diff -Nru redmine-2.3.3/app/views/issue_relations/create.js.erb redmine-2.4.2/app/views/issue_relations/create.js.erb --- redmine-2.3.3/app/views/issue_relations/create.js.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/issue_relations/create.js.erb 2013-12-23 08:48:38.000000000 +0000 @@ -4,3 +4,4 @@ $('#relation_issue_to_id').val(''); $('#relation_issue_to_id').focus(); <% end %> +$('#new-relation-form').show(); diff -Nru redmine-2.3.3/app/views/issue_statuses/edit.html.erb redmine-2.4.2/app/views/issue_statuses/edit.html.erb --- redmine-2.3.3/app/views/issue_statuses/edit.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/issue_statuses/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

      <%= link_to l(:label_issue_status_plural), issue_statuses_path %> » <%=h @issue_status %>

      +<%= title [l(:label_issue_status_plural), issue_statuses_path], @issue_status.name %> <%= labelled_form_for @issue_status do |f| %> <%= render :partial => 'form', :locals => {:f => f} %> diff -Nru redmine-2.3.3/app/views/issue_statuses/index.html.erb redmine-2.4.2/app/views/issue_statuses/index.html.erb --- redmine-2.3.3/app/views/issue_statuses/index.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/issue_statuses/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -19,13 +19,13 @@
    <% for status in @issue_statuses %> "> - + <% if Issue.use_status_for_done_ratio? %> - + <% end %> - - - + + + diff -Nru redmine-2.3.3/app/views/issue_statuses/new.html.erb redmine-2.4.2/app/views/issue_statuses/new.html.erb --- redmine-2.3.3/app/views/issue_statuses/new.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/issue_statuses/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_issue_status_plural), issue_statuses_path %> » <%=l(:label_issue_status_new)%>

    +<%= title [l(:label_issue_status_plural), issue_statuses_path], l(:label_issue_status_new) %> <%= labelled_form_for @issue_status do |f| %> <%= render :partial => 'form', :locals => {:f => f} %> diff -Nru redmine-2.3.3/app/views/issues/_attributes.html.erb redmine-2.4.2/app/views/issues/_attributes.html.erb --- redmine-2.3.3/app/views/issues/_attributes.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/_attributes.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -47,11 +47,19 @@ <% end %> <% if @issue.safe_attribute? 'start_date' %> -

    <%= f.text_field :start_date, :size => 10, :disabled => !@issue.leaf?, :required => @issue.required_attribute?('start_date') %><%= calendar_for('issue_start_date') if @issue.leaf? %>

    +

    + <%= f.text_field(:start_date, :size => 10, :disabled => !@issue.leaf?, + :required => @issue.required_attribute?('start_date')) %> + <%= calendar_for('issue_start_date') if @issue.leaf? %> +

    <% end %> <% if @issue.safe_attribute? 'due_date' %> -

    <%= f.text_field :due_date, :size => 10, :disabled => !@issue.leaf?, :required => @issue.required_attribute?('due_date') %><%= calendar_for('issue_due_date') if @issue.leaf? %>

    +

    + <%= f.text_field(:due_date, :size => 10, :disabled => !@issue.leaf?, + :required => @issue.required_attribute?('due_date')) %> + <%= calendar_for('issue_due_date') if @issue.leaf? %> +

    <% end %> <% if @issue.safe_attribute? 'estimated_hours' %> diff -Nru redmine-2.3.3/app/views/issues/_form_custom_fields.html.erb redmine-2.4.2/app/views/issues/_form_custom_fields.html.erb --- redmine-2.3.3/app/views/issues/_form_custom_fields.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/_form_custom_fields.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,8 +1,9 @@ +<% custom_field_values = @issue.editable_custom_field_values %>
    <% i = 0 %> -<% split_on = (@issue.custom_field_values.size / 2.0).ceil - 1 %> -<% @issue.editable_custom_field_values.each do |value| %> +<% split_on = (custom_field_values.size / 2.0).ceil - 1 %> +<% custom_field_values.each do |value| %>

    <%= custom_field_tag_with_label :issue, value, :required => @issue.required_attribute?(value.custom_field_id) %>

    <% if i == split_on -%>
    diff -Nru redmine-2.3.3/app/views/issues/_history.html.erb redmine-2.4.2/app/views/issues/_history.html.erb --- redmine-2.3.3/app/views/issues/_history.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/_history.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -8,7 +8,7 @@ <% if journal.details.any? %>
      - <% details_to_strings(journal.details).each do |string| %> + <% details_to_strings(journal.visible_details).each do |string| %>
    • <%= string %>
    • <% end %>
    diff -Nru redmine-2.3.3/app/views/issues/_relations.html.erb redmine-2.4.2/app/views/issues/_relations.html.erb --- redmine-2.3.3/app/views/issues/_relations.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/_relations.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -38,7 +38,7 @@ :as => :relation, :remote => true, :url => issue_relations_path(@issue), :method => :post, - :html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')} + :html => {:id => 'new-relation-form', :style => 'display: none;'} } do |f| %> <%= render :partial => 'issue_relations/form', :locals => {:f => f}%> <% end %> diff -Nru redmine-2.3.3/app/views/issues/_sidebar.html.erb redmine-2.4.2/app/views/issues/_sidebar.html.erb --- redmine-2.3.3/app/views/issues/_sidebar.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/_sidebar.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,16 +1,20 @@

    <%= l(:label_issue_plural) %>

    -<%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %>
    + +
      +
    • <%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %>
    • <% if @project %> -<%= link_to l(:field_summary), project_issues_report_path(@project) %>
      +
    • <%= link_to l(:field_summary), project_issues_report_path(@project) %>
    • <% end %> -<%= call_hook(:view_issues_sidebar_issues_bottom) %> <% if User.current.allowed_to?(:view_calendar, @project, :global => true) %> - <%= link_to l(:label_calendar), _project_calendar_path(@project) %>
      +
    • <%= link_to l(:label_calendar), _project_calendar_path(@project) %>
    • <% end %> <% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> - <%= link_to l(:label_gantt), _project_gantt_path(@project) %>
      +
    • <%= link_to l(:label_gantt), _project_gantt_path(@project) %>
    • <% end %> +
    + +<%= call_hook(:view_issues_sidebar_issues_bottom) %> <%= call_hook(:view_issues_sidebar_planning_bottom) %> <%= render_sidebar_queries %> diff -Nru redmine-2.3.3/app/views/issues/bulk_edit.html.erb redmine-2.4.2/app/views/issues/bulk_edit.html.erb --- redmine-2.3.3/app/views/issues/bulk_edit.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/bulk_edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,5 +1,21 @@

    <%= @copy ? l(:button_copy) : l(:label_bulk_edit_selected_issues) %>

    +<% if @saved_issues && @unsaved_issues.present? %> +
    + + <%= l(:notice_failed_to_save_issues, + :count => @unsaved_issues.size, + :total => @saved_issues.size, + :ids => @unsaved_issues.map {|i| "##{i.id}"}.join(', ')) %> + +
      + <% bulk_edit_error_messages(@unsaved_issues).each do |message| %> +
    • <%= message %>
    • + <% end %> +
    +
    +<% end %> +
      <% @issues.each do |issue| %> <%= content_tag 'li', link_to_issue(issue) %> @@ -16,34 +32,43 @@ <% if @allowed_projects.present? %>

      - <%= select_tag('issue[project_id]', content_tag('option', l(:label_no_change_option), :value => '') + project_tree_options_for_select(@allowed_projects, :selected => @target_project), + <%= select_tag('issue[project_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + project_tree_options_for_select(@allowed_projects, :selected => @target_project), :onchange => "updateBulkEditFrom('#{escape_javascript url_for(:action => 'bulk_edit', :format => 'js')}')") %>

      <% end %>

      - <%= select_tag('issue[tracker_id]', content_tag('option', l(:label_no_change_option), :value => '') + options_from_collection_for_select(@trackers, :id, :name)) %> + <%= select_tag('issue[tracker_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(@trackers, :id, :name, @issue_params[:tracker_id])) %>

      <% if @available_statuses.any? %>

      - <%= select_tag('issue[status_id]',content_tag('option', l(:label_no_change_option), :value => '') + options_from_collection_for_select(@available_statuses, :id, :name)) %> + <%= select_tag('issue[status_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(@available_statuses, :id, :name, @issue_params[:status_id])) %>

      <% end %> <% if @safe_attributes.include?('priority_id') -%>

      - <%= select_tag('issue[priority_id]', content_tag('option', l(:label_no_change_option), :value => '') + options_from_collection_for_select(IssuePriority.active, :id, :name)) %> + <%= select_tag('issue[priority_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + options_from_collection_for_select(IssuePriority.active, :id, :name, @issue_params[:priority_id])) %>

      <% end %> <% if @safe_attributes.include?('assigned_to_id') -%>

      - <%= select_tag('issue[assigned_to_id]', content_tag('option', l(:label_no_change_option), :value => '') + - content_tag('option', l(:label_nobody), :value => 'none') + - principals_options_for_select(@assignables)) %> + <%= select_tag('issue[assigned_to_id]', + content_tag('option', l(:label_no_change_option), :value => '') + + content_tag('option', l(:label_nobody), :value => 'none', :selected => (@issue_params[:assigned_to_id] == 'none')) + + principals_options_for_select(@assignables, @issue_params[:assigned_to_id])) %>

      <% end %> @@ -51,8 +76,8 @@

      <%= select_tag('issue[category_id]', content_tag('option', l(:label_no_change_option), :value => '') + - content_tag('option', l(:label_none), :value => 'none') + - options_from_collection_for_select(@categories, :id, :name)) %> + content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:category_id] == 'none')) + + options_from_collection_for_select(@categories, :id, :name, @issue_params[:category_id])) %>

      <% end %> @@ -60,26 +85,31 @@

      <%= select_tag('issue[fixed_version_id]', content_tag('option', l(:label_no_change_option), :value => '') + - content_tag('option', l(:label_none), :value => 'none') + - version_options_for_select(@versions.sort)) %> + content_tag('option', l(:label_none), :value => 'none', :selected => (@issue_params[:fixed_version_id] == 'none')) + + version_options_for_select(@versions.sort, @issue_params[:fixed_version_id])) %>

      <% end %> <% @custom_fields.each do |custom_field| %> -

      <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects) %>

      +

      + + <%= custom_field_tag_for_bulk_edit('issue', custom_field, @projects, @issue_params[:custom_field_values][custom_field.id.to_s]) %> +

      <% end %> <% if @copy && @attachments_present %> +<%= hidden_field_tag 'copy_attachments', '0' %>

      - <%= check_box_tag 'copy_attachments', '1', true %> + <%= check_box_tag 'copy_attachments', '1', params[:copy_attachments] != '0' %>

      <% end %> <% if @copy && @subtasks_present %> +<%= hidden_field_tag 'copy_subtasks', '0' %>

      - <%= check_box_tag 'copy_subtasks', '1', true %> + <%= check_box_tag 'copy_subtasks', '1', params[:copy_subtasks] != '0' %>

      <% end %> @@ -91,15 +121,16 @@

      <%= select_tag('issue[is_private]', content_tag('option', l(:label_no_change_option), :value => '') + - content_tag('option', l(:general_text_Yes), :value => '1') + - content_tag('option', l(:general_text_No), :value => '0')) %> + content_tag('option', l(:general_text_Yes), :value => '1', :selected => (@issue_params[:is_private] == '1')) + + content_tag('option', l(:general_text_No), :value => '0', :selected => (@issue_params[:is_private] == '0'))) %>

      <% end %> <% if @safe_attributes.include?('parent_issue_id') && @project %>

      - <%= text_field_tag 'issue[parent_issue_id]', '', :size => 10 %> + <%= text_field_tag 'issue[parent_issue_id]', '', :size => 10, :value => @issue_params[:parent_issue_id] %> +

      <%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project)}')" %> <% end %> @@ -107,44 +138,61 @@ <% if @safe_attributes.include?('start_date') %>

      - <%= text_field_tag 'issue[start_date]', '', :size => 10 %><%= calendar_for('issue_start_date') %> + <%= text_field_tag 'issue[start_date]', '', :value => @issue_params[:start_date], :size => 10 %><%= calendar_for('issue_start_date') %> +

      <% end %> <% if @safe_attributes.include?('due_date') %>

      - <%= text_field_tag 'issue[due_date]', '', :size => 10 %><%= calendar_for('issue_due_date') %> + <%= text_field_tag 'issue[due_date]', '', :value => @issue_params[:due_date], :size => 10 %><%= calendar_for('issue_due_date') %> +

      <% end %> <% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %>

      - <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %> + <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }, @issue_params[:done_ratio]) %>

      <% end %>
    - -
    <%= l(:field_notes) %> +
    +<%= l(:field_notes) %> <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> <%= wikitoolbar_for 'notes' %>

    - <% if @copy %> - <%= hidden_field_tag 'copy', '1' %> - <%= submit_tag l(:button_copy) %> - <%= submit_tag l(:button_copy_and_follow), :name => 'follow' %> - <% elsif @target_project %> - <%= submit_tag l(:button_move) %> - <%= submit_tag l(:button_move_and_follow), :name => 'follow' %> - <% else %> - <%= submit_tag l(:button_submit) %> - <% end %> + <% if @copy %> + <%= hidden_field_tag 'copy', '1' %> + <%= submit_tag l(:button_copy) %> + <%= submit_tag l(:button_copy_and_follow), :name => 'follow' %> + <% elsif @target_project %> + <%= submit_tag l(:button_move) %> + <%= submit_tag l(:button_move_and_follow), :name => 'follow' %> + <% else %> + <%= submit_tag l(:button_submit) %> + <% end %>

    <% end %> + +<%= javascript_tag do %> +$(window).load(function(){ + $(document).on('change', 'input[data-disables]', function(){ + if ($(this).attr('checked')){ + $($(this).data('disables')).attr('disabled', true).val(''); + } else { + $($(this).data('disables')).attr('disabled', false); + } + }); +}); +$(document).ready(function(){ + $('input[data-disables]').trigger('change'); +}); +<% end %> diff -Nru redmine-2.3.3/app/views/issues/index.api.rsb redmine-2.4.2/app/views/issues/index.api.rsb --- redmine-2.3.3/app/views/issues/index.api.rsb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/index.api.rsb 2013-12-23 08:48:38.000000000 +0000 @@ -19,7 +19,7 @@ api.done_ratio issue.done_ratio api.estimated_hours issue.estimated_hours - render_api_custom_values issue.custom_field_values, api + render_api_custom_values issue.visible_custom_field_values, api api.created_on issue.created_on api.updated_on issue.updated_on diff -Nru redmine-2.3.3/app/views/issues/new.html.erb redmine-2.4.2/app/views/issues/new.html.erb --- redmine-2.3.3/app/views/issues/new.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%=l(:label_issue_new)%>

    +<%= title l(:label_issue_new) %> <%= call_hook(:view_issues_new_top, {:issue => @issue}) %> diff -Nru redmine-2.3.3/app/views/issues/show.api.rsb redmine-2.4.2/app/views/issues/show.api.rsb --- redmine-2.3.3/app/views/issues/show.api.rsb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/show.api.rsb 2013-12-23 08:48:38.000000000 +0000 @@ -18,7 +18,7 @@ api.estimated_hours @issue.estimated_hours api.spent_hours(@issue.spent_hours) if User.current.allowed_to?(:view_time_entries, @project) - render_api_custom_values @issue.custom_field_values, api + render_api_custom_values @issue.visible_custom_field_values, api api.created_on @issue.created_on api.updated_on @issue.updated_on @@ -55,7 +55,7 @@ api.notes journal.notes api.created_on journal.created_on api.array :details do - journal.details.each do |detail| + journal.visible_details.each do |detail| api.detail :property => detail.property, :name => detail.prop_key do api.old_value detail.old_value api.new_value detail.value diff -Nru redmine-2.3.3/app/views/issues/update_form.js.erb redmine-2.4.2/app/views/issues/update_form.js.erb --- redmine-2.3.3/app/views/issues/update_form.js.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/issues/update_form.js.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -$('#all_attributes').html('<%= escape_javascript(render :partial => 'form') %>'); +replaceIssueFormWith('<%= escape_javascript(render :partial => 'form') %>'); <% if User.current.allowed_to?(:log_time, @issue.project) %> $('#log_time').show(); diff -Nru redmine-2.3.3/app/views/journals/diff.html.erb redmine-2.4.2/app/views/journals/diff.html.erb --- redmine-2.3.3/app/views/journals/diff.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/journals/diff.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,10 +1,13 @@ -

    <%=h @issue.tracker %> #<%= @issue.id %>

    +

    <%= @issue.tracker %> #<%= @issue.id %>

    <%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %>

    <%= simple_format_without_paragraph @diff.to_html %>
    -

    <%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %>

    +

    + <%= link_to(l(:button_back), issue_path(@issue), + :onclick => 'if (document.referrer != "") {history.back(); return false;}') %> +

    <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> diff -Nru redmine-2.3.3/app/views/layouts/base.html.erb redmine-2.4.2/app/views/layouts/base.html.erb --- redmine-2.3.3/app/views/layouts/base.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/layouts/base.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,5 +1,5 @@ - +<%=h html_title %> diff -Nru redmine-2.3.3/app/views/layouts/mailer.html.erb redmine-2.4.2/app/views/layouts/mailer.html.erb --- redmine-2.3.3/app/views/layouts/mailer.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/layouts/mailer.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -12,22 +12,27 @@ a, a:link, a:visited { color: #2A5685;} a:hover, a:active { color: #c61a1a; } a.wiki-anchor { display: none; } +fieldset.attachments {border-width: 1px 0 0 0;} hr { width: 100%; height: 1px; background: #ccc; border: 0; } -.footer { +span.footer { font-size: 0.8em; font-style: italic; } +<% if Setting.emails_header.present? -%> <%= Redmine::WikiFormatting.to_html(Setting.text_formatting, Setting.emails_header).html_safe %> +<% end -%> <%= yield %>
    +<% if Setting.emails_footer.present? -%> <%= Redmine::WikiFormatting.to_html(Setting.text_formatting, Setting.emails_footer).html_safe %> +<% end -%> diff -Nru redmine-2.3.3/app/views/layouts/mailer.text.erb redmine-2.4.2/app/views/layouts/mailer.text.erb --- redmine-2.3.3/app/views/layouts/mailer.text.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/layouts/mailer.text.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,8 @@ +<% if Setting.emails_header.present? -%> <%= Setting.emails_header %> +<% end -%> <%= yield %> +<% if Setting.emails_footer.present? -%> -- <%= Setting.emails_footer %> +<% end -%> diff -Nru redmine-2.3.3/app/views/mailer/_issue.html.erb redmine-2.4.2/app/views/mailer/_issue.html.erb --- redmine-2.3.3/app/views/mailer/_issue.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/_issue.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,5 +1,14 @@

    <%= link_to(h("#{issue.tracker.name} ##{issue.id}: #{issue.subject}"), issue_url) %>

    -<%= render_email_issue_attributes(issue, true) %> +<%= render_email_issue_attributes(issue, users.first, true) %> <%= textilizable(issue, :description, :only_path => false) %> + +<% if issue.attachments.any? %> +
    <%= l(:label_attachment_plural) %> + <% issue.attachments.each do |attachment| %> + <%= link_to_attachment attachment, :download => true, :only_path => false %> + (<%= number_to_human_size(attachment.filesize) %>)
    + <% end %> +
    +<% end %> diff -Nru redmine-2.3.3/app/views/mailer/_issue.text.erb redmine-2.4.2/app/views/mailer/_issue.text.erb --- redmine-2.3.3/app/views/mailer/_issue.text.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/_issue.text.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,6 +1,13 @@ <%= "#{issue.tracker.name} ##{issue.id}: #{issue.subject}" %> <%= issue_url %> -<%= render_email_issue_attributes(issue) %> +<%= render_email_issue_attributes(issue, users.first) %> ---------------------------------------- <%= issue.description %> + +<% if issue.attachments.any? -%> +---<%= l(:label_attachment_plural).ljust(37, '-') %> +<% issue.attachments.each do |attachment| -%> +<%= attachment.filename %> (<%= number_to_human_size(attachment.filesize) %>) +<% end -%> +<% end -%> diff -Nru redmine-2.3.3/app/views/mailer/issue_add.html.erb redmine-2.4.2/app/views/mailer/issue_add.html.erb --- redmine-2.3.3/app/views/mailer/issue_add.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/issue_add.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,3 +1,3 @@ <%= l(:text_issue_added, :id => "##{@issue.id}", :author => h(@issue.author)) %>
    -<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url } %> +<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :users => @users, :issue_url => @issue_url } %> diff -Nru redmine-2.3.3/app/views/mailer/issue_add.text.erb redmine-2.4.2/app/views/mailer/issue_add.text.erb --- redmine-2.3.3/app/views/mailer/issue_add.text.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/issue_add.text.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ <%= l(:text_issue_added, :id => "##{@issue.id}", :author => @issue.author) %> ---------------------------------------- -<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url } %> +<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :users => @users, :issue_url => @issue_url } %> diff -Nru redmine-2.3.3/app/views/mailer/issue_edit.html.erb redmine-2.4.2/app/views/mailer/issue_edit.html.erb --- redmine-2.3.3/app/views/mailer/issue_edit.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/issue_edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -4,11 +4,11 @@ <%= l(:text_issue_updated, :id => "##{@issue.id}", :author => h(@journal.user)) %>
      -<% details_to_strings(@journal.details, false, :only_path => false).each do |string| %> +<% details_to_strings(@journal_details, false, :only_path => false).each do |string| %>
    • <%= string %>
    • <% end %>
    <%= textilizable(@journal, :notes, :only_path => false) %>
    -<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :issue_url => @issue_url } %> +<%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :users => @users, :issue_url => @issue_url } %> diff -Nru redmine-2.3.3/app/views/mailer/issue_edit.text.erb redmine-2.4.2/app/views/mailer/issue_edit.text.erb --- redmine-2.3.3/app/views/mailer/issue_edit.text.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/mailer/issue_edit.text.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,6 +1,6 @@ <%= "(#{l(:field_private_notes)}) " if @journal.private_notes? -%><%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %> -<% details_to_strings(@journal.details, true).each do |string| -%> +<% details_to_strings(@journal_details, true).each do |string| -%> <%= string %> <% end -%> @@ -9,4 +9,4 @@ <% end -%> ---------------------------------------- -<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :issue_url => @issue_url } %> +<%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :users => @users, :issue_url => @issue_url } %> diff -Nru redmine-2.3.3/app/views/my/account.html.erb redmine-2.4.2/app/views/my/account.html.erb --- redmine-2.3.3/app/views/my/account.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/account.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -39,6 +39,7 @@
    <%=l(:label_preferences)%> <%= render :partial => 'users/preferences' %> + <%= call_hook(:view_my_account_preferences, :user => @user, :form => f) %>
    diff -Nru redmine-2.3.3/app/views/my/blocks/_issuesassignedtome.html.erb redmine-2.4.2/app/views/my/blocks/_issuesassignedtome.html.erb --- redmine-2.3.3/app/views/my/blocks/_issuesassignedtome.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/blocks/_issuesassignedtome.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,14 +1,11 @@ -

    <%=l(:label_assigned_to_me_issues)%> (<%= Issue.visible.open.count(:conditions => {:assigned_to_id => ([User.current.id] + User.current.group_ids)})%>)

    +

    + <%= link_to l(:label_assigned_to_me_issues), + issues_path(:set_filter => 1, :assigned_to_id => 'me', :sort => 'priority:desc,updated_on:desc') %> + (<%= Issue.visible.open.where(:assigned_to_id => ([User.current.id] + User.current.group_ids)).count %>) +

    <% assigned_issues = issuesassignedtome_items %> <%= render :partial => 'issues/list_simple', :locals => { :issues => assigned_issues } %> -<% if assigned_issues.length > 0 %> -

    <%= link_to l(:label_issue_view_all), :controller => 'issues', - :action => 'index', - :set_filter => 1, - :assigned_to_id => 'me', - :sort => 'priority:desc,updated_on:desc' %>

    -<% end %> <% content_for :header_tags do %> <%= auto_discovery_link_tag(:atom, diff -Nru redmine-2.3.3/app/views/my/blocks/_issuesreportedbyme.html.erb redmine-2.4.2/app/views/my/blocks/_issuesreportedbyme.html.erb --- redmine-2.3.3/app/views/my/blocks/_issuesreportedbyme.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/blocks/_issuesreportedbyme.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,15 +1,11 @@ -

    <%=l(:label_reported_issues)%> (<%= Issue.visible.count(:conditions => { :author_id => User.current.id }) %>)

    +

    + <%= link_to l(:label_reported_issues), + issues_path(:set_filter => 1, :status_id => '*', :author_id => 'me', :sort => 'updated_on:desc') %> + (<%= Issue.visible.where(:author_id => User.current.id).count %>) +

    <% reported_issues = issuesreportedbyme_items %> <%= render :partial => 'issues/list_simple', :locals => { :issues => reported_issues } %> -<% if reported_issues.length > 0 %> -

    <%= link_to l(:label_issue_view_all), :controller => 'issues', - :action => 'index', - :set_filter => 1, - :status_id => '*', - :author_id => 'me', - :sort => 'updated_on:desc' %>

    -<% end %> <% content_for :header_tags do %> <%= auto_discovery_link_tag(:atom, diff -Nru redmine-2.3.3/app/views/my/blocks/_issueswatched.html.erb redmine-2.4.2/app/views/my/blocks/_issueswatched.html.erb --- redmine-2.3.3/app/views/my/blocks/_issueswatched.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/blocks/_issueswatched.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,11 +1,8 @@ -

    <%=l(:label_watched_issues)%> (<%= Issue.visible.watched_by(user.id).count %>)

    -<% watched_issues = issueswatched_items %> +

    + <%= link_to l(:label_watched_issues), + issues_path(:set_filter => 1, :watcher_id => 'me', :sort => 'updated_on:desc') %> + (<%= Issue.visible.watched_by(user.id).count %>) +

    +<% watched_issues = issueswatched_items %> <%= render :partial => 'issues/list_simple', :locals => { :issues => watched_issues } %> -<% if watched_issues.length > 0 %> -

    <%= link_to l(:label_issue_view_all), :controller => 'issues', - :action => 'index', - :set_filter => 1, - :watcher_id => 'me', - :sort => 'updated_on:desc' %>

    -<% end %> diff -Nru redmine-2.3.3/app/views/my/blocks/_timelog.html.erb redmine-2.4.2/app/views/my/blocks/_timelog.html.erb --- redmine-2.3.3/app/views/my/blocks/_timelog.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/blocks/_timelog.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,4 +1,7 @@ -

    <%=l(:label_spent_time)%> (<%= l(:label_last_n_days, 7) %>)

    +

    + <%= link_to l(:label_spent_time), time_entries_path(:user_id => 'me') %> + (<%= l(:label_last_n_days, 7) %>) +

    <% entries = timelog_items entries_by_day = entries.group_by(&:spent_on) @@ -31,7 +34,7 @@ - <% end %> - + <% @project.activities(true).each do |enumeration| %> <%= fields_for "enumerations[#{enumeration.id}]", enumeration do |ff| %> - - + <% enumeration.custom_field_values.each do |value| %> - <% end %> - diff -Nru redmine-2.3.3/app/views/projects/settings/_boards.html.erb redmine-2.4.2/app/views/projects/settings/_boards.html.erb --- redmine-2.3.3/app/views/projects/settings/_boards.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/settings/_boards.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -10,9 +10,9 @@ <% Board.board_tree(@project.boards) do |board, level| next if board.new_record? %> - - - + + <% end %> diff -Nru redmine-2.3.3/app/views/projects/settings/_issue_categories.html.erb redmine-2.4.2/app/views/projects/settings/_issue_categories.html.erb --- redmine-2.3.3/app/views/projects/settings/_issue_categories.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/settings/_issue_categories.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -9,13 +9,13 @@ <% for category in @project.issue_categories %> <% unless category.new_record? %> - + <% end %> diff -Nru redmine-2.3.3/app/views/projects/settings/_members.html.erb redmine-2.4.2/app/views/projects/settings/_members.html.erb --- redmine-2.3.3/app/views/projects/settings/_members.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/settings/_members.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,6 +1,6 @@ <%= error_messages_for 'member' %> <% roles = Role.find_all_givable - members = @project.member_principals.includes(:roles, :principal).all.sort %> + members = @project.member_principals.includes(:member_roles, :roles, :principal).all.sort %>
    <% if members.any? %> @@ -15,22 +15,32 @@ <% members.each do |member| %> <% next if member.new_record? %>
    - + <% @project.repositories.sort.each do |repository| %> - - + hascontextmenu"> <%= raw @query.inline_columns.map {|column| ""}.join %> - <%= ("" * level).html_safe %> - + <%= ("" * (criterias.length - level - 1)).html_safe -%> <% total = 0 -%> <% @report.periods.each do |period| -%> diff -Nru redmine-2.3.3/app/views/timelog/report.html.erb redmine-2.4.2/app/views/timelog/report.html.erb --- redmine-2.3.3/app/views/timelog/report.html.erb 2013-09-14 06:48:21.000000000 +0000 +++ redmine-2.4.2/app/views/timelog/report.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -43,9 +43,9 @@ <% end %> <% columns_width = (40 / (@report.periods.length+1)).to_i %> <% @report.periods.each do |period| %> - + <% end %> - + diff -Nru redmine-2.3.3/app/views/trackers/_form.html.erb redmine-2.4.2/app/views/trackers/_form.html.erb --- redmine-2.3.3/app/views/trackers/_form.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/trackers/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -22,7 +22,7 @@ <% IssueCustomField.all.each do |field| %> <% end %> @@ -43,7 +43,7 @@ <% if @projects.any? %>
    <%= l(:label_project_plural) %> <%= render_project_nested_lists(@projects) do |p| - content_tag('label', check_box_tag('tracker[project_ids][]', p.id, @tracker.projects.include?(p), :id => nil) + ' ' + h(p)) + content_tag('label', check_box_tag('tracker[project_ids][]', p.id, @tracker.projects.to_a.include?(p), :id => nil) + ' ' + h(p)) end %> <%= hidden_field_tag('tracker[project_ids][]', '', :id => nil) %>

    <%= check_all_links 'tracker_project_ids' %>

    diff -Nru redmine-2.3.3/app/views/trackers/edit.html.erb redmine-2.4.2/app/views/trackers/edit.html.erb --- redmine-2.3.3/app/views/trackers/edit.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/trackers/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_tracker_plural), trackers_path %> » <%=h @tracker %>

    +<%= title [l(:label_tracker_plural), trackers_path], @tracker.name %> <%= labelled_form_for @tracker do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/trackers/fields.html.erb redmine-2.4.2/app/views/trackers/fields.html.erb --- redmine-2.3.3/app/views/trackers/fields.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/trackers/fields.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_tracker_plural), trackers_path %> » <%= l(:field_summary) %>

    +<%= title [l(:label_tracker_plural), trackers_path], l(:field_summary) %> <% if @trackers.any? %> <%= form_tag fields_trackers_path do %> @@ -25,13 +25,13 @@ <% Tracker::CORE_FIELDS.each do |field| %>
    "> - <% @trackers.each do |tracker| %> - @@ -47,13 +47,13 @@ <% @custom_fields.each do |field| %> "> - <% @trackers.each do |tracker| %> - @@ -73,5 +73,3 @@ <% else %>

    <%= l(:label_no_data) %>

    <% end %> - -<% html_title l(:field_summary) %> diff -Nru redmine-2.3.3/app/views/trackers/index.html.erb redmine-2.4.2/app/views/trackers/index.html.erb --- redmine-2.3.3/app/views/trackers/index.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/trackers/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -15,15 +15,15 @@ <% for tracker in @trackers %> "> - - + - - - - + + +
    <%= link_to h(group), edit_group_path(group) %><%= group.users.size %><%= link_to h(group), edit_group_path(group) %><%= group.users.size %> <%= delete_link group %>
    <%= link_to h(status.name), edit_issue_status_path(status) %><%= link_to h(status.name), edit_issue_status_path(status) %><%= h status.default_done_ratio %><%= h status.default_done_ratio %><%= checked_image status.is_default? %><%= checked_image status.is_closed? %><%= reorder_links('issue_status', {:action => 'update', :id => status}, :put) %><%= checked_image status.is_default? %><%= checked_image status.is_closed? %><%= reorder_links('issue_status', {:action => 'update', :id => status}, :put) %> <%= delete_link issue_status_path(status) %> <%=h entry.project %> <%= h(' - ') + link_to_issue(entry.issue, :truncate => 50) if entry.issue %> <%=h entry.comments %> <%= html_hours("%.2f" % entry.hours) %> + <% if entry.editable_by?(@user) -%> <%= link_to image_tag('edit.png'), {:controller => 'timelog', :action => 'edit', :id => entry}, :title => l(:button_edit) %> diff -Nru redmine-2.3.3/app/views/my/destroy.html.erb redmine-2.4.2/app/views/my/destroy.html.erb --- redmine-2.3.3/app/views/my/destroy.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/destroy.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -2,10 +2,10 @@

    <%= simple_format l(:text_account_destroy_confirmation)%>

    - <%= form_tag({}) do %> + <%= form_tag({}) do %> <%= submit_tag l(:button_delete_my_account) %> | - <%= link_to l(:button_cancel), :action => 'account' %> - <% end %> + <%= link_to l(:button_cancel), :action => 'account' %> + <% end %>

    diff -Nru redmine-2.3.3/app/views/my/password.html.erb redmine-2.4.2/app/views/my/password.html.erb --- redmine-2.3.3/app/views/my/password.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/my/password.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -17,6 +17,10 @@ <%= submit_tag l(:button_apply) %> <% end %> +<% unless @user.must_change_passwd? %> <% content_for :sidebar do %> <%= render :partial => 'sidebar' %> <% end %> +<% end %> + +<%= javascript_tag "$('#password').focus();" %> diff -Nru redmine-2.3.3/app/views/projects/_form.html.erb redmine-2.4.2/app/views/projects/_form.html.erb --- redmine-2.3.3/app/views/projects/_form.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -37,7 +37,6 @@ <% end %> <%= hidden_field_tag 'project[enabled_module_names][]', '' %> -<%= javascript_tag 'observeProjectModules()' %> <% end %> @@ -87,3 +86,15 @@ }); <% end %> <% end %> + +<%= javascript_tag do %> +$(document).ready(function() { + $('#project_enabled_module_names_issue_tracking').on('change', function(){ + if ($(this).attr('checked')){ + $('#project_trackers, #project_issue_custom_fields').show(); + } else { + $('#project_trackers, #project_issue_custom_fields').hide(); + } + }).trigger('change'); +}); +<% end %> diff -Nru redmine-2.3.3/app/views/projects/destroy.html.erb redmine-2.4.2/app/views/projects/destroy.html.erb --- redmine-2.3.3/app/views/projects/destroy.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/destroy.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,5 @@ -

    <%=l(:label_confirmation)%>

    +<%= title l(:label_confirmation) %> +

    <%=h @project_to_destroy %>
    <%=l(:text_project_destroy_confirmation)%> @@ -12,6 +13,7 @@ <%= form_tag(project_path(@project_to_destroy), :method => :delete) do %> <%= submit_tag l(:button_delete) %> + <%= link_to l(:button_cancel), :controller => 'admin', :action => 'projects' %> <% end %>

    diff -Nru redmine-2.3.3/app/views/projects/index.html.erb redmine-2.4.2/app/views/projects/index.html.erb --- redmine-2.3.3/app/views/projects/index.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -11,10 +11,10 @@ :id => nil } %> -

    <%=l(:label_project_plural)%>

    +

    <%= l(:label_project_plural) %>

    -<%= render_project_hierarchy(@projects)%> +<%= render_project_hierarchy(@projects) %>
    <% if User.current.logged? %> diff -Nru redmine-2.3.3/app/views/projects/new.html.erb redmine-2.4.2/app/views/projects/new.html.erb --- redmine-2.3.3/app/views/projects/new.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%=l(:label_project_new)%>

    +<%= title l(:label_project_new) %> <%= labelled_form_for @project do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/projects/settings/_activities.html.erb redmine-2.4.2/app/views/projects/settings/_activities.html.erb --- redmine-2.3.3/app/views/projects/settings/_activities.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/settings/_activities.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -7,23 +7,23 @@ <% TimeEntryActivity.new.available_custom_fields.each do |value| %>
    <%= h value.name %><%= l(:field_active) %><%= l(:field_active) %>
    + <%= ff.hidden_field :parent_id, :value => enumeration.id unless enumeration.project %> <%= h(enumeration) %> <%= checked_image !enumeration.project %><%= checked_image !enumeration.project %> + <%= custom_field_tag "enumerations[#{enumeration.id}]", value %> + <%= ff.check_box :active %>
    <%= link_to board.name, project_board_path(@project, board) %><%=h board.description %> + <%= link_to board.name, project_board_path(@project, board) %><%=h board.description %> <% if authorize_for("boards", "edit") %> <%= reorder_links('board', {:controller => 'boards', :action => 'update', :project_id => @project, :id => board}, :put) %> <% end %> @@ -21,7 +21,7 @@ <% if User.current.allowed_to?(:manage_boards, @project) %> <%= link_to l(:button_edit), edit_project_board_path(@project, board), :class => 'icon icon-edit' %> <%= delete_link project_board_path(@project, board) %> - <% end %> + <% end %>
    <%=h(category.name) %><%=h(category.name) %> <%=h(category.assigned_to.name) if category.assigned_to %> - <% if User.current.allowed_to?(:manage_categories, @project) %> + <% if User.current.allowed_to?(:manage_categories, @project) %> <%= link_to l(:button_edit), edit_issue_category_path(category), :class => 'icon icon-edit' %> <%= delete_link issue_category_path(category) %> - <% end %> + <% end %>
    <%= link_to_user member.principal %><%= link_to_user member.principal %> - <%=h member.roles.sort.collect(&:to_s).join(', ') %> - <%= form_for(member, {:as => :membership, :remote => true, :url => membership_path(member), - :method => :put, - :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }} + <%= member.roles.sort.collect(&:to_s).join(', ') %> + <%= form_for(member, + {:as => :membership, :remote => true, + :url => membership_path(member), + :method => :put, + :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }} ) do |f| %> -

    <% roles.each do |role| %> -
    - <% end %>

    +

    + <% roles.each do |role| %> +
    + <% end %> +

    <%= hidden_field_tag 'membership[role_ids][]', '' %> -

    <%= submit_tag l(:button_change), :class => "small" %> - <%= link_to_function l(:button_cancel), - "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" - %>

    +

    + <%= submit_tag l(:button_save), :class => "small" %> + <%= link_to_function(l(:button_cancel), + "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;") %> +

    <% end %>
    @@ -53,22 +63,26 @@
    <% if roles.any? %> - <%= form_for(@member, {:as => :membership, :url => project_memberships_path(@project), :remote => true, :method => :post}) do |f| %> -
    <%=l(:label_member_new)%> - -

    <%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %>

    - <%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %> - -
    - <%= render_principals_for_new_members(@project) %> -
    - -

    <%= l(:label_role_plural) %>: - <% roles.each do |role| %> - - <% end %>

    - -

    <%= submit_tag l(:button_add), :id => 'member-add-submit' %>

    + <%= form_for(@member, + {:as => :membership, :url => project_memberships_path(@project), + :remote => true, :method => :post}) do |f| %> +
    + <%=l(:label_member_new)%> +

    + <%= label_tag("principal_search", l(:label_principal_search)) %> + <%= text_field_tag('principal_search', nil) %> +

    + <%= javascript_tag "observeSearchfield('principal_search', null, '#{ escape_javascript autocomplete_project_memberships_path(@project, :format => 'js') }')" %> +
    + <%= render_principals_for_new_members(@project) %> +
    +

    + <%= l(:label_role_plural) %>: + <% roles.each do |role| %> + + <% end %> +

    +

    <%= submit_tag l(:button_add), :id => 'member-add-submit' %>

    <% end %> <% end %> diff -Nru redmine-2.3.3/app/views/projects/settings/_repositories.html.erb redmine-2.4.2/app/views/projects/settings/_repositories.html.erb --- redmine-2.3.3/app/views/projects/settings/_repositories.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/projects/settings/_repositories.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -12,11 +12,11 @@
    + <%= link_to repository.identifier, {:controller => 'repositories', :action => 'show',:id => @project, :repository_id => repository.identifier_param} if repository.identifier.present? %> <%= checked_image repository.is_default? %><%= checked_image repository.is_default? %> <%=h repository.scm_name %> <%=h repository.url %> diff -Nru redmine-2.3.3/app/views/queries/_form.html.erb redmine-2.4.2/app/views/queries/_form.html.erb --- redmine-2.3.3/app/views/queries/_form.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/queries/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -2,19 +2,28 @@
    +<%= hidden_field_tag 'gantt', '1' if params[:gantt] %> +

    <%= text_field 'query', 'name', :size => 80 %>

    <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @project) %> -

    -<%= check_box 'query', 'is_public', - :onchange => (User.current.admin? ? nil : 'if (this.checked) {$("#query_is_for_all").removeAttr("checked"); $("#query_is_for_all").attr("disabled", true);} else {$("#query_is_for_all").removeAttr("disabled");}') %>

    +

    + + + <% Role.givable.sorted.each do |role| %> + + <% end %> + + <%= hidden_field_tag 'query[role_ids][]', '' %> +

    <% end %>

    <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :disabled => (!@query.new_record? && (@query.project.nil? || (@query.is_public? && !User.current.admin?))) %>

    +
    <%= l(:label_options) %>

    <%= check_box_tag 'default_columns', 1, @query.has_default_columns?, :id => 'query_default_columns', :onclick => 'if (this.checked) {$("#columns").hide();} else {$("#columns").show();}' %>

    @@ -24,6 +33,14 @@

    <%= available_block_columns_tags(@query) %>

    + +<% if params[:gantt] %> +

    + + +

    +<% end %> +
    <%= l(:label_filter_plural) %> @@ -53,3 +70,12 @@ <% end %>
    + +<%= javascript_tag do %> +$(document).ready(function(){ + $("input[name='query[visibility]']").change(function(){ + var checked = $('#query_visibility_1').is(':checked'); + $("input[name='query[role_ids][]'][type=checkbox]").attr('disabled', !checked); + }).trigger('change'); +}); +<% end %> diff -Nru redmine-2.3.3/app/views/queries/index.api.rsb redmine-2.4.2/app/views/queries/index.api.rsb --- redmine-2.3.3/app/views/queries/index.api.rsb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/queries/index.api.rsb 2013-12-23 08:48:38.000000000 +0000 @@ -3,7 +3,7 @@ api.query do api.id query.id api.name query.name - api.is_public query.is_public + api.is_public query.is_public? api.project_id query.project_id end end diff -Nru redmine-2.3.3/app/views/queries/index.html.erb redmine-2.4.2/app/views/queries/index.html.erb --- redmine-2.3.3/app/views/queries/index.html.erb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/app/views/queries/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -10,15 +10,13 @@ <% @queries.each do |query| %> - - diff -Nru redmine-2.3.3/app/views/reports/_details.html.erb redmine-2.4.2/app/views/reports/_details.html.erb --- redmine-2.3.3/app/views/reports/_details.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/reports/_details.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,27 +1,26 @@ <% if @statuses.empty? or rows.empty? %>

    <%=l(:label_no_data)%>

    <% else %> -<% col_width = 70 / (@statuses.length+3) %> -
    + <%= link_to h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %> - + <% if query.editable_by?(User.current) %> <%= link_to l(:button_edit), edit_query_path(query), :class => 'icon icon-edit' %> <%= delete_link query_path(query) %> - <% end %>
    +
    - + <% for status in @statuses %> - + <% end %> - - - + + + <% for row in rows %> "> - + <% for status in @statuses %> - + <% end %> - - - + + + <% end %> diff -Nru redmine-2.3.3/app/views/reports/_simple.html.erb redmine-2.4.2/app/views/reports/_simple.html.erb --- redmine-2.3.3/app/views/reports/_simple.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/reports/_simple.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,20 +1,20 @@ <% if @statuses.empty? or rows.empty? %>

    <%=l(:label_no_data)%>

    <% else %> -
    <%=h status.name %><%=h status.name %><%=l(:label_open_issues_plural)%><%=l(:label_closed_issues_plural)%><%=l(:label_total)%><%=l(:label_open_issues_plural)%><%=l(:label_closed_issues_plural)%><%=l(:label_total)%>
    <%= link_to h(row.name), aggregate_path(@project, field_name, row) %><%= link_to h(row.name), aggregate_path(@project, field_name, row) %><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id) %><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id) %><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %>
    +
    - - - - + + + + <% for row in rows %> "> - - - - + + + + <% end %> diff -Nru redmine-2.3.3/app/views/repositories/_breadcrumbs.html.erb redmine-2.4.2/app/views/repositories/_breadcrumbs.html.erb --- redmine-2.3.3/app/views/repositories/_breadcrumbs.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/_breadcrumbs.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -<%= link_to(@repository.identifier.present? ? h(@repository.identifier) : 'root', +<%= link_to(@repository.identifier.present? ? h(@repository.identifier) : 'root', :action => 'show', :id => @project, :repository_id => @repository.identifier_param, :path => nil, :rev => @rev) %> diff -Nru redmine-2.3.3/app/views/repositories/_form.html.erb redmine-2.4.2/app/views/repositories/_form.html.erb --- redmine-2.3.3/app/views/repositories/_form.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -9,19 +9,23 @@

    <%= f.check_box :is_default, :label => :field_repository_is_default %>

    -

    <%= f.text_field :identifier, :disabled => @repository.identifier_frozen? %> +

    +<%= f.text_field :identifier, :disabled => @repository.identifier_frozen? %> <% unless @repository.identifier_frozen? %> - <%= l(:text_length_between, :min => 1, :max => Repository::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_repository_identifier_info).html_safe %> -<% end %>

    + + <%= l(:text_length_between, :min => 1, :max => Repository::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_repository_identifier_info).html_safe %> + +<% end %> +

    <% button_disabled = true %> <% if @repository %> -<% button_disabled = ! @repository.class.scm_available %> -<%= repository_field_tags(f, @repository)%> + <% button_disabled = ! @repository.class.scm_available %> + <%= repository_field_tags(f, @repository) %> <% end %>

    <%= submit_tag(@repository.new_record? ? l(:button_create) : l(:button_save), :disabled => button_disabled) %> - <%= link_to l(:button_cancel), settings_project_path(@project, :tab => 'repositories') %> + <%= link_to l(:button_cancel), settings_project_path(@project, :tab => 'repositories') %>

    diff -Nru redmine-2.3.3/app/views/repositories/_navigation.html.erb redmine-2.4.2/app/views/repositories/_navigation.html.erb --- redmine-2.3.3/app/views/repositories/_navigation.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/_navigation.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -30,5 +30,5 @@ <% if @repository.supports_all_revisions? %> | <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %> - <% end %> + <% end %> <% end -%> diff -Nru redmine-2.3.3/app/views/repositories/annotate.html.erb redmine-2.4.2/app/views/repositories/annotate.html.erb --- redmine-2.3.3/app/views/repositories/annotate.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/annotate.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -16,11 +16,21 @@ <% line_num = 1; previous_revision = nil %> <% syntax_highlight_lines(@path, Redmine::CodesetUtil.to_utf8_by_setting(@annotate.content)).each do |line| %> <% revision = @annotate.revisions[line_num - 1] %> - - + + - + <% if revision && revision != previous_revision %> + <%= revision.identifier ? + link_to_revision(revision, @repository) : format_revision(revision) %> + <% end %> + + <% line_num += 1; previous_revision = revision %> diff -Nru redmine-2.3.3/app/views/repositories/revision.html.erb redmine-2.4.2/app/views/repositories/revision.html.erb --- redmine-2.3.3/app/views/repositories/revision.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/revision.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -94,4 +94,8 @@ <%= stylesheet_link_tag "scm" %> <% end %> -<% html_title("#{l(:label_revision)} #{format_revision(@changeset)}") -%> +<% + title = "#{l(:label_revision)} #{format_revision(@changeset)}" + title << " - #{truncate(@changeset.comments, :length => 80)}" + html_title(title) + -%> diff -Nru redmine-2.3.3/app/views/repositories/stats.html.erb redmine-2.4.2/app/views/repositories/stats.html.erb --- redmine-2.3.3/app/views/repositories/stats.html.erb 2013-09-14 06:48:27.000000000 +0000 +++ redmine-2.4.2/app/views/repositories/stats.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,10 +1,18 @@

    <%= l(:label_statistics) %>

    -<%= tag("embed", :width => 800, :height => 300, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :repository_id => @repository.identifier_param, :graph => "commits_per_month")) %> +<%= tag("embed", + :type => "image/svg+xml", :src => url_for(:controller => 'repositories', + :action => 'graph', :id => @project, + :repository_id => @repository.identifier_param, + :graph => "commits_per_month")) %>

    -<%= tag("embed", :width => 800, :height => 400, :type => "image/svg+xml", :src => url_for(:controller => 'repositories', :action => 'graph', :id => @project, :repository_id => @repository.identifier_param, :graph => "commits_per_author")) %> +<%= tag("embed", + :type => "image/svg+xml", :src => url_for(:controller => 'repositories', + :action => 'graph', :id => @project, + :repository_id => @repository.identifier_param, + :graph => "commits_per_author")) %>

    <%= link_to l(:button_back), :action => 'show', :id => @project %>

    diff -Nru redmine-2.3.3/app/views/roles/edit.html.erb redmine-2.4.2/app/views/roles/edit.html.erb --- redmine-2.3.3/app/views/roles/edit.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/roles/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_role_plural), roles_path %> » <%=h @role.name %>

    +<%= title [l(:label_role_plural), roles_path], @role.name %> <%= labelled_form_for @role do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/roles/index.html.erb redmine-2.4.2/app/views/roles/index.html.erb --- redmine-2.3.3/app/views/roles/index.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/roles/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -14,8 +14,8 @@ <% for role in @roles %> "> - - + - <% @roles.each do |role| %> - - - + <% end %> + + + <% end %>
    <%=l(:label_open_issues_plural)%><%=l(:label_closed_issues_plural)%><%=l(:label_total)%><%=l(:label_open_issues_plural)%><%=l(:label_closed_issues_plural)%><%=l(:label_total)%>
    <%= link_to h(row.name), aggregate_path(@project, field_name, row) %><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %><%= link_to h(row.name), aggregate_path(@project, field_name, row) %><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %>
    <%= line_num %>
    <%= line_num %> - <%= (revision.identifier ? link_to_revision(revision, @repository) : format_revision(revision)) if revision && revision != previous_revision %><%= h(revision.author.to_s.split('<').first) if revision && revision != previous_revision %> + <% if revision && revision != previous_revision %> + <% author = Redmine::CodesetUtil.to_utf8(revision.author.to_s, + @repository.repo_log_encoding) %> + <%= author.split('<').first %> + <% end %> +
    <%= line.html_safe %>
    <%= content_tag(role.builtin? ? 'em' : 'span', link_to(h(role.name), edit_role_path(role))) %> + <%= content_tag(role.builtin? ? 'em' : 'span', link_to(h(role.name), edit_role_path(role))) %> <% unless role.builtin? %> <%= reorder_links('role', {:action => 'update', :id => role}, :put) %> <% end %> diff -Nru redmine-2.3.3/app/views/roles/new.html.erb redmine-2.4.2/app/views/roles/new.html.erb --- redmine-2.3.3/app/views/roles/new.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/roles/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_role_plural), roles_path %> » <%=l(:label_role_new)%>

    +<%= title [l(:label_role_plural), roles_path], l(:label_role_new) %> <%= labelled_form_for @role do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/roles/permissions.html.erb redmine-2.4.2/app/views/roles/permissions.html.erb --- redmine-2.3.3/app/views/roles/permissions.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/roles/permissions.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_role_plural), roles_path %> » <%=l(:label_permissions_report)%>

    +<%= title [l(:label_role_plural), roles_path], l(:label_permissions_report) %> <%= form_tag(permissions_roles_path, :id => 'permissions_form') do %> <%= hidden_field_tag 'permissions[0]', '', :id => nil %> @@ -32,13 +32,13 @@ <% end %> <% perms_by_module[mod].each do |permission| %>
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('.permission-#{permission.name} input')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> <%= l_or_humanize(permission.name, :prefix => 'permission_') %> + <% if role.setable_permissions.include? permission %> <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name), :id => nil, :class => "role-#{role.id}" %> <% end %> diff -Nru redmine-2.3.3/app/views/search/index.html.erb redmine-2.4.2/app/views/search/index.html.erb --- redmine-2.3.3/app/views/search/index.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/search/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,7 +1,7 @@

    <%= l(:label_search) %>

    -<%= form_tag({}, :method => :get) do %> +<%= form_tag({}, :method => :get, :id => 'search-form') do %> <%= label_tag "search-input", l(:description_search), :class => "hidden-for-sighted" %>

    <%= text_field_tag 'q', @question, :size => 60, :id => 'search-input' %> <%= javascript_tag "$('#search-input').focus()" %> @@ -11,13 +11,14 @@ <%= hidden_field_tag 'titles_only', '', :id => nil %>

    -

    + +

    <% @object_types.each do |t| %> - + <% end %>

    -

    <%= submit_tag l(:button_submit), :name => 'submit' %>

    +

    <%= submit_tag l(:button_submit) %>

    <% end %>
    @@ -36,7 +37,7 @@ <% end %> -

    +

    <% if @pagination_previous_date %> <%= link_to_content_update("\xc2\xab " + l(:label_previous), params.merge(:previous => 1, @@ -47,6 +48,17 @@ params.merge(:previous => nil, :offset => @pagination_next_date.strftime("%Y%m%d%H%M%S"))) %> <% end %> -

    +

    <% html_title(l(:label_search)) -%> + +<%= javascript_tag do %> +$("#search-types a").click(function(e){ + e.preventDefault(); + $("#search-types input[type=checkbox]").attr('checked', false); + $(this).siblings("input[type=checkbox]").attr('checked', true); + if ($("#search-input").val() != "") { + $("#search-form").submit(); + } +}); +<% end %> diff -Nru redmine-2.3.3/app/views/settings/_issues.html.erb redmine-2.4.2/app/views/settings/_issues.html.erb --- redmine-2.3.3/app/views/settings/_issues.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/settings/_issues.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -21,7 +21,7 @@
    - <%= l(:setting_issue_list_default_columns) %> + <%= l(:setting_issue_list_default_columns) %> <%= render_query_columns_selection( IssueQuery.new(:column_names => Setting.issue_list_default_columns), :name => 'settings[issue_list_default_columns]') %> diff -Nru redmine-2.3.3/app/views/settings/_mail_handler.html.erb redmine-2.4.2/app/views/settings/_mail_handler.html.erb --- redmine-2.3.3/app/views/settings/_mail_handler.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/settings/_mail_handler.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -5,6 +5,11 @@ <%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %> <%= l(:text_line_separated) %>

    +

    + <%= setting_text_field :mail_handler_excluded_filenames, :size => 60 %> + <%= l(:text_comma_separated) %> + <%= l(:label_example) %>: smime.p7s, *.vcf +

    diff -Nru redmine-2.3.3/app/views/settings/_repositories.html.erb redmine-2.4.2/app/views/settings/_repositories.html.erb --- redmine-2.3.3/app/views/settings/_repositories.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/settings/_repositories.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -13,29 +13,29 @@ <% scm_class = "Repository::#{choice}".constantize %> <% text, value = (choice.is_a?(Array) ? choice : [choice, choice]) %> <% setting = :enabled_scm %> - <% enabled = Setting.send(setting).include?(value) %> + <% enabled = Setting.send(setting).include?(value) %>
    - <% if enabled %> - <%= - image_tag( + <% if enabled %> + <%= + image_tag( (scm_class.scm_available ? 'true.png' : 'exclamation.png'), :style => "vertical-align:bottom;" - ) + ) %> <%= scm_class.scm_command %> - <% end %> - - <%= scm_class.scm_version_string if enabled %> -
    + <%= scm_class.scm_version_string if enabled %> +

    <%= l(:text_scm_config) %>

    @@ -65,19 +65,6 @@

    <%= setting_text_field :commit_ref_keywords, :size => 30 %> <%= l(:text_comma_separated) %>

    -

    <%= setting_text_field :commit_fix_keywords, :size => 30 %> - <%= l(:label_applied_status) %>: <%= setting_select :commit_fix_status_id, - [["", 0]] + - IssueStatus.sorted.all.collect{ - |status| [status.name, status.id.to_s] - }, - :label => false %> - <%= l(:field_done_ratio) %>: <%= setting_select :commit_fix_done_ratio, - (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, - :blank => :label_no_change_option, - :label => false %> -<%= l(:text_comma_separated) %>

    -

    <%= setting_check_box :commit_cross_project_ref %>

    <%= setting_check_box :commit_logtime_enabled, @@ -90,5 +77,51 @@ :disabled => !Setting.commit_logtime_enabled?%>

    -<%= submit_tag l(:button_save) %> + + + + + + + + + + + + <% @commit_update_keywords.each do |rule| %> + + + + + + + + <% end %> + + + + + + + + +
    <%= l(:label_tracker) %><%= l(:setting_commit_fix_keywords) %><%= l(:label_applied_status) %><%= l(:field_done_ratio) %>
    <%= select_tag "settings[commit_update_keywords][if_tracker_id][]", options_for_select([[l(:label_all), ""]] + Tracker.sorted.all.map {|t| [t.name, t.id.to_s]}, rule['if_tracker_id']) %><%= text_field_tag "settings[commit_update_keywords][keywords][]", rule['keywords'], :size => 30 %><%= select_tag "settings[commit_update_keywords][status_id][]", options_for_select([["", 0]] + IssueStatus.sorted.all.collect{|status| [status.name, status.id.to_s]}, rule['status_id']) %><%= select_tag "settings[commit_update_keywords][done_ratio][]", options_for_select([["", ""]] + (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, rule['done_ratio']) %><%= link_to image_tag('delete.png'), '#', :class => 'delete-commit-keywords' %>
    <%= l(:text_comma_separated) %><%= link_to image_tag('add.png'), '#', :class => 'add-commit-keywords' %>
    + +

    <%= submit_tag l(:button_save) %>

    +<% end %> + +<%= javascript_tag do %> +$('#commit-keywords').on('click', 'a.delete-commit-keywords', function(e){ + e.preventDefault(); + if ($('#commit-keywords tbody tr.commit-keywords').length > 1) { + $(this).parents('#commit-keywords tr').remove(); + } else { + $('#commit-keywords tbody tr.commit-keywords').find('input, select').val(''); + } +}); +$('#commit-keywords').on('click', 'a.add-commit-keywords', function(e){ + e.preventDefault(); + var row = $('#commit-keywords tr.commit-keywords:last'); + row.clone().insertAfter(row).find('input, select').val(''); +}); <% end %> diff -Nru redmine-2.3.3/app/views/settings/plugin.html.erb redmine-2.4.2/app/views/settings/plugin.html.erb --- redmine-2.3.3/app/views/settings/plugin.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/settings/plugin.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= l(:label_settings) %>: <%=h @plugin.name %>

    +<%= title [l(:label_plugins), {:controller => 'admin', :action => 'plugins'}], @plugin.name %>
    <%= form_tag({:action => 'plugin'}) do %> diff -Nru redmine-2.3.3/app/views/timelog/_list.html.erb redmine-2.4.2/app/views/timelog/_list.html.erb --- redmine-2.3.3/app/views/timelog/_list.html.erb 2013-09-14 06:48:21.000000000 +0000 +++ redmine-2.4.2/app/views/timelog/_list.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -21,7 +21,7 @@
    <%= check_box_tag("ids[]", entry.id, false, :id => nil) %>#{column_content(column, entry)} + <% if entry.editable_by?(User.current) -%> <%= link_to image_tag('edit.png'), edit_time_entry_path(entry), :title => l(:button_edit) %> diff -Nru redmine-2.3.3/app/views/timelog/_report_criteria.html.erb redmine-2.4.2/app/views/timelog/_report_criteria.html.erb --- redmine-2.3.3/app/views/timelog/_report_criteria.html.erb 2013-09-14 06:48:21.000000000 +0000 +++ redmine-2.4.2/app/views/timelog/_report_criteria.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -3,7 +3,7 @@ <% next if hours_for_value.empty? -%>
    <%= h(format_criteria_value(@report.available_criteria[criterias[level]], value)) %><%= h(format_criteria_value(@report.available_criteria[criterias[level]], value)) %><%= period %><%= period %><%= l(:label_total_time) %><%= l(:label_total_time) %>
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.core-field-#{field}')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> <%= l("field_#{field}".sub(/_id$/, '')) %> + <%= check_box_tag "trackers[#{tracker.id}][core_fields][]", field, tracker.core_fields.include?(field), :class => "tracker-#{tracker.id} core-field-#{field}" %>
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.custom-field-#{field.id}')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> <%= field.name %> + <%= check_box_tag "trackers[#{tracker.id}][custom_field_ids][]", field.id, tracker.custom_fields.include?(field), :class => "tracker-#{tracker.id} custom-field-#{field.id}" %>
    <%= link_to h(tracker.name), edit_tracker_path(tracker) %> + <%= link_to h(tracker.name), edit_tracker_path(tracker) %> <% unless tracker.workflow_rules.count > 0 %> <%= l(:text_tracker_no_workflow) %> (<%= link_to l(:button_edit), workflows_edit_path(:tracker_id => tracker) %>) <% end %> + <%= reorder_links('tracker', {:action => 'update', :id => tracker}, :put) %> diff -Nru redmine-2.3.3/app/views/trackers/new.html.erb redmine-2.4.2/app/views/trackers/new.html.erb --- redmine-2.3.3/app/views/trackers/new.html.erb 2013-09-14 06:48:23.000000000 +0000 +++ redmine-2.4.2/app/views/trackers/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_tracker_plural), trackers_path %> » <%=l(:label_tracker_new)%>

    +<%= title [l(:label_tracker_plural), trackers_path], l(:label_tracker_new) %> <%= labelled_form_for @tracker do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/users/_form.html.erb redmine-2.4.2/app/views/users/_form.html.erb --- redmine-2.3.3/app/views/users/_form.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -31,6 +31,8 @@

    <%= f.password_field :password, :required => true, :size => 25 %> <%= l(:text_caracters_minimum, :count => Setting.password_min_length) %>

    <%= f.password_field :password_confirmation, :required => true, :size => 25 %>

    +

    <%= f.check_box :generate_password %>

    +

    <%= f.check_box :must_change_passwd %>

    @@ -44,8 +46,22 @@
    <%=l(:label_preferences)%> <%= render :partial => 'users/preferences' %> + <%= call_hook(:view_users_form_preferences, :user => @user, :form => f) %>
    + +<%= javascript_tag do %> +$(document).ready(function(){ + $('#user_generate_password').change(function(){ + var passwd = $('#user_password, #user_password_confirmation'); + if ($(this).is(':checked')){ + passwd.val('').attr('disabled', true); + }else{ + passwd.removeAttr('disabled'); + } + }).trigger('change'); +}); +<% end %> diff -Nru redmine-2.3.3/app/views/users/_mail_notifications.html.erb redmine-2.4.2/app/views/users/_mail_notifications.html.erb --- redmine-2.3.3/app/views/users/_mail_notifications.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/_mail_notifications.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -11,12 +11,14 @@ <%= render_project_nested_lists(@user.projects) do |project| content_tag('label', check_box_tag( - 'notified_project_ids[]', + 'user[notified_project_ids][]', project.id, - @user.notified_projects_ids.include?(project.id) + @user.notified_projects_ids.include?(project.id), + :id => nil ) + ' ' + h(project.name) ) end %> + <%= hidden_field_tag 'user[notified_project_ids][]', '' %>

    <%= l(:text_user_mail_option) %>

    <% end %> diff -Nru redmine-2.3.3/app/views/users/edit.html.erb redmine-2.4.2/app/views/users/edit.html.erb --- redmine-2.3.3/app/views/users/edit.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/edit.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -4,8 +4,6 @@ <%= delete_link user_path(@user) if User.current != @user %> -

    <%= link_to l(:label_user_plural), users_path %> » <%=h @user.login %>

    +<%= title [l(:label_user_plural), users_path], @user.login %> <%= render_tabs user_settings_tabs %> - -<% html_title(l(:label_user), @user.login, l(:label_administration)) -%> diff -Nru redmine-2.3.3/app/views/users/index.html.erb redmine-2.4.2/app/views/users/index.html.erb --- redmine-2.3.3/app/views/users/index.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -41,9 +41,9 @@
    <%= h(user.firstname) %> <%= h(user.lastname) %> <%= checked_image user.admin? %><%= format_time(user.created_on) %><%= checked_image user.admin? %><%= format_time(user.created_on) %> <%= change_status_link(user) %> <%= delete_link user_path(user, :back_url => users_path(params)) unless User.current == user %> diff -Nru redmine-2.3.3/app/views/users/new.html.erb redmine-2.4.2/app/views/users/new.html.erb --- redmine-2.3.3/app/views/users/new.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/new.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,4 @@ -

    <%= link_to l(:label_user_plural), users_path %> » <%=l(:label_user_new)%>

    +<%= title [l(:label_user_plural), users_path], l(:label_user_new) %> <%= labelled_form_for @user do |f| %> <%= render :partial => 'form', :locals => { :f => f } %> diff -Nru redmine-2.3.3/app/views/users/show.api.rsb redmine-2.4.2/app/views/users/show.api.rsb --- redmine-2.3.3/app/views/users/show.api.rsb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/show.api.rsb 2013-12-23 08:48:38.000000000 +0000 @@ -7,6 +7,7 @@ api.created_on @user.created_on api.last_login_on @user.last_login_on api.api_key @user.api_key if User.current.admin? || (User.current == @user) + api.status @user.status if User.current.admin? render_api_custom_values @user.visible_custom_field_values, api diff -Nru redmine-2.3.3/app/views/users/show.html.erb redmine-2.4.2/app/views/users/show.html.erb --- redmine-2.3.3/app/views/users/show.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/users/show.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -40,7 +40,7 @@ :from => @events_by_day.keys.first %>

    -<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %> +<%=l(:label_reported_issues)%>: <%= Issue.where(:author_id => @user.id).count %>

    diff -Nru redmine-2.3.3/app/views/versions/_issue_counts.html.erb redmine-2.4.2/app/views/versions/_issue_counts.html.erb --- redmine-2.3.3/app/views/versions/_issue_counts.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/versions/_issue_counts.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -13,14 +13,14 @@ <% counts.each do |count| %> - -
    + <% if count[:group] -%> <%= link_to(h(count[:group]), project_issues_path(version.project, :set_filter => 1, :status_id => '*', :fixed_version_id => version, "#{criteria}_id" => count[:group])) %> <% else -%> <%= link_to(l(:label_none), project_issues_path(version.project, :set_filter => 1, :status_id => '*', :fixed_version_id => version, "#{criteria}_id" => "!*")) %> <% end %> + <%= progress_bar((count[:closed].to_f / count[:total])*100, :legend => "#{count[:closed]}/#{count[:total]}", :width => "#{(count[:total].to_f / max * 200).floor}px;") %> diff -Nru redmine-2.3.3/app/views/versions/_overview.html.erb redmine-2.4.2/app/views/versions/_overview.html.erb --- redmine-2.3.3/app/views/versions/_overview.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/versions/_overview.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -16,16 +16,23 @@ <% end %> <% if version.issues_count > 0 %> - <%= progress_bar([version.closed_percent, version.completed_percent], :width => '40em', :legend => ('%0.0f%' % version.completed_percent)) %> + <%= progress_bar([version.closed_percent, version.completed_percent], + :width => '40em', :legend => ('%0.0f%' % version.completed_percent)) %>

    - <%= link_to(l(:label_x_issues, :count => version.issues_count), - project_issues_path(version.project, :status_id => '*', :fixed_version_id => version, :set_filter => 1)) %> -   - (<%= link_to_if(version.closed_issues_count > 0, l(:label_x_closed_issues_abbr, :count => version.closed_issues_count), - project_issues_path(version.project, :status_id => 'c', :fixed_version_id => version, :set_filter => 1)) %> + <%= link_to(l(:label_x_issues, :count => version.issues_count), + project_issues_path(version.project, + :status_id => '*', :fixed_version_id => version, + :set_filter => 1)) %> +   + (<%= link_to_if(version.closed_issues_count > 0, + l(:label_x_closed_issues_abbr, :count => version.closed_issues_count), + project_issues_path(version.project, :status_id => 'c', + :fixed_version_id => version, :set_filter => 1)) %> — - <%= link_to_if(version.open_issues_count > 0, l(:label_x_open_issues_abbr, :count => version.open_issues_count), - project_issues_path(version.project, :status_id => 'o', :fixed_version_id => version, :set_filter => 1)) %>) + <%= link_to_if(version.open_issues_count > 0, + l(:label_x_open_issues_abbr, :count => version.open_issues_count), + project_issues_path(version.project, :status_id => 'o', + :fixed_version_id => version, :set_filter => 1)) %>)

    <% else %>

    <%= l(:label_roadmap_no_issues) %>

    diff -Nru redmine-2.3.3/app/views/versions/index.html.erb redmine-2.4.2/app/views/versions/index.html.erb --- redmine-2.3.3/app/views/versions/index.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/versions/index.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,64 +1,89 @@
    - <%= link_to l(:label_version_new), new_project_version_path(@project), :class => 'icon icon-add' if User.current.allowed_to?(:manage_versions, @project) %> + <%= link_to(l(:label_version_new), new_project_version_path(@project), + :class => 'icon icon-add') if User.current.allowed_to?(:manage_versions, @project) %>

    <%=l(:label_roadmap)%>

    <% if @versions.empty? %> -

    <%= l(:label_no_data) %>

    +

    <%= l(:label_no_data) %>

    <% else %> -
    -<% @versions.each do |version| %> +
    + <% @versions.each do |version| %>

    <%= link_to_version version, :name => version_anchor(version) %>

    <%= render :partial => 'versions/overview', :locals => {:version => version} %> - <%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %> - + <%= render(:partial => "wiki/content", + :locals => {:content => version.wiki_page.content}) if version.wiki_page %> <% if (issues = @issues_by_version[version]) && issues.size > 0 %> - <%= form_tag({}) do -%> - - - <% issues.each do |issue| -%> - - - - - <% end -%> - - <% end %> + <%= form_tag({}) do -%> + + + <% issues.each do |issue| -%> + + + + + <% end -%> + + <% end %> <% end %> <%= call_hook :view_projects_roadmap_version_bottom, :version => version %> -<% end %> -
    + <% end %> +
    <% end %> <% content_for :sidebar do %> <%= form_tag({}, :method => :get) do %>

    <%= l(:label_roadmap) %>

    +
      <% @trackers.each do |tracker| %> -
      -<% end %> -
      - -<% if @project.descendants.active.any? %> - <%= hidden_field_tag 'with_subprojects', 0 %> -
      -<% end %> +
    • + +
    • +<% end %> +
    +

    +
      +
    • + +
    • + <% if @project.descendants.active.any? %> +
    • + <%= hidden_field_tag 'with_subprojects', 0 %> + +
    • + <% end %> +

    <%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %>

    <% end %>

    <%= l(:label_version_plural) %>

    +
      <% @versions.each do |version| %> -<%= link_to format_version_name(version), "##{version_anchor(version)}" %>
      +
    • + <%= link_to(format_version_name(version), "##{version_anchor(version)}") %> +
    • <% end %> +
    <% if @completed_versions.present? %>

    - <%= link_to_function l(:label_completed_versions), - '$("#toggle-completed-versions").toggleClass("collapsed"); $("#completed-versions").toggle()', - :id => 'toggle-completed-versions', :class => 'collapsible collapsed' %>
    - + <%= link_to_function l(:label_completed_versions), + '$("#toggle-completed-versions").toggleClass("collapsed"); $("#completed-versions").toggle()', + :id => 'toggle-completed-versions', :class => 'collapsible collapsed' %> +

    <% end %> <% end %> diff -Nru redmine-2.3.3/app/views/versions/show.html.erb redmine-2.4.2/app/views/versions/show.html.erb --- redmine-2.3.3/app/views/versions/show.html.erb 2013-09-14 06:48:22.000000000 +0000 +++ redmine-2.4.2/app/views/versions/show.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -39,9 +39,9 @@ <%- @issues.each do |issue| -%> - + - + <% end %> diff -Nru redmine-2.3.3/app/views/wiki/_sidebar.html.erb redmine-2.4.2/app/views/wiki/_sidebar.html.erb --- redmine-2.3.3/app/views/wiki/_sidebar.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/_sidebar.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -3,7 +3,10 @@ <% end -%>

    <%= l(:label_wiki) %>

    - -<%= link_to l(:field_start_page), {:action => 'show', :id => nil} %>
    -<%= link_to l(:label_index_by_title), {:action => 'index'} %>
    -<%= link_to l(:label_index_by_date), {:controller => 'wiki', :project_id => @project, :action => 'date_index'} %>
    +
      +
    • <%= link_to(l(:field_start_page), {:action => 'show', :id => nil}) %>
    • +
    • <%= link_to(l(:label_index_by_title), {:action => 'index'}) %>
    • +
    • <%= link_to(l(:label_index_by_date), + {:controller => 'wiki', :project_id => @project, + :action => 'date_index'}) %>
    • +
    diff -Nru redmine-2.3.3/app/views/wiki/annotate.html.erb redmine-2.4.2/app/views/wiki/annotate.html.erb --- redmine-2.3.3/app/views/wiki/annotate.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/annotate.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -6,15 +6,14 @@ <%= wiki_page_breadcrumb(@page) %> -

    <%=h @page.pretty_title %>

    +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], + [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], + "#{l(:label_version)} #{@annotate.content.version}" %>

    -<%= l(:label_version) %> <%= link_to h(@annotate.content.version), - :action => 'show', :project_id => @project, - :id => @page.title, :version => @annotate.content.version %> -(<%= h(@annotate.content.author ? - @annotate.content.author.name : l(:label_user_anonymous)) - %>, <%= format_time(@annotate.content.updated_on) %>) + <%= @annotate.content.author ? link_to_user(@annotate.content.author) : l(:label_user_anonymous) + %>, <%= format_time(@annotate.content.updated_on) %>
    + <%=h @annotate.content.comments %>

    <% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %> diff -Nru redmine-2.3.3/app/views/wiki/diff.html.erb redmine-2.4.2/app/views/wiki/diff.html.erb --- redmine-2.3.3/app/views/wiki/diff.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/diff.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -5,7 +5,9 @@ <%= wiki_page_breadcrumb(@page) %> -

    <%= h(@page.pretty_title) %>

    +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], + [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], + "#{l(:label_version)} #{@diff.content_to.version}" %>

    <%= l(:label_version) %> <%= link_to @diff.content_from.version, :action => 'show', :id => @page.title, :project_id => @page.project, :version => @diff.content_from.version %> diff -Nru redmine-2.3.3/app/views/wiki/history.html.erb redmine-2.4.2/app/views/wiki/history.html.erb --- redmine-2.3.3/app/views/wiki/history.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/history.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,8 +1,6 @@ <%= wiki_page_breadcrumb(@page) %> -

    <%= h(@page.pretty_title) %>

    - -

    <%= l(:label_history) %>

    +<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], l(:label_history) %> <%= form_tag({:controller => 'wiki', :action => 'diff', :project_id => @page.project, :id => @page.title}, diff -Nru redmine-2.3.3/app/views/wiki/show.api.rsb redmine-2.4.2/app/views/wiki/show.api.rsb --- redmine-2.3.3/app/views/wiki/show.api.rsb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/show.api.rsb 2013-12-23 08:48:38.000000000 +0000 @@ -6,7 +6,7 @@ api.text @content.text api.version @content.version api.author(:id => @content.author_id, :name => @content.author.name) - api.comments @page.content.comments + api.comments @content.comments api.created_on @page.created_on api.updated_on @content.updated_on diff -Nru redmine-2.3.3/app/views/wiki/show.html.erb redmine-2.4.2/app/views/wiki/show.html.erb --- redmine-2.3.3/app/views/wiki/show.html.erb 2013-09-14 06:48:28.000000000 +0000 +++ redmine-2.4.2/app/views/wiki/show.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -17,6 +17,10 @@ <%= wiki_page_breadcrumb(@page) %> <% unless @content.current_version? %> + <%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], + [l(:label_history), history_project_wiki_page_path(@page.project, @page.title)], + "#{l(:label_version)} #{@content.version}" %> +

    <%= link_to(("\xc2\xab " + l(:label_previous)), :action => 'show', :id => @page.title, :project_id => @page.project, diff -Nru redmine-2.3.3/app/views/workflows/_action_menu.html.erb redmine-2.4.2/app/views/workflows/_action_menu.html.erb --- redmine-2.3.3/app/views/workflows/_action_menu.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/_action_menu.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,5 +1,4 @@

    -<%= link_to l(:button_edit), {:action => 'edit'}, :class => 'icon icon-edit' %> <%= link_to l(:button_copy), {:action => 'copy'}, :class => 'icon icon-copy' %> <%= link_to l(:field_summary), {:action => 'index'}, :class => 'icon icon-summary' %>
    diff -Nru redmine-2.3.3/app/views/workflows/_form.html.erb redmine-2.4.2/app/views/workflows/_form.html.erb --- redmine-2.3.3/app/views/workflows/_form.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/_form.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,17 +1,17 @@ - - + <% for new_status in @statuses %> - <% for old_status in @statuses %> "> - <% for new_status in @statuses -%> <% checked = workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id} %> - diff -Nru redmine-2.3.3/app/views/workflows/copy.html.erb redmine-2.4.2/app/views/workflows/copy.html.erb --- redmine-2.3.3/app/views/workflows/copy.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/copy.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,6 +1,4 @@ -<%= render :partial => 'action_menu' %> - -

    <%=l(:label_workflow)%>

    +<%= title [l(:label_workflow), workflows_edit_path], l(:button_copy) %> <%= form_tag({}, :id => 'workflow_copy_form') do %>
    diff -Nru redmine-2.3.3/app/views/workflows/edit.html.erb redmine-2.4.2/app/views/workflows/edit.html.erb --- redmine-2.3.3/app/views/workflows/edit.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/edit.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,6 +1,6 @@ <%= render :partial => 'action_menu' %> -

    <%=l(:label_workflow)%>

    +<%= title l(:label_workflow) %>
      @@ -54,5 +54,3 @@ <%= submit_tag l(:button_save) %> <% end %> <% end %> - -<% html_title(l(:label_workflow)) -%> diff -Nru redmine-2.3.3/app/views/workflows/index.html.erb redmine-2.4.2/app/views/workflows/index.html.erb --- redmine-2.3.3/app/views/workflows/index.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/index.html.erb 2013-12-23 08:48:37.000000000 +0000 @@ -1,6 +1,4 @@ -<%= render :partial => 'action_menu' %> - -

      <%=l(:label_workflow)%>

      +<%= title [l(:label_workflow), workflows_edit_path], l(:field_summary) %> <% if @workflow_counts.empty? %>

      <%= l(:label_no_data) %>

      @@ -21,9 +19,9 @@
    <% @workflow_counts.each do |tracker, roles| -%> - + <% roles.each do |role, count| -%> - <% end -%> diff -Nru redmine-2.3.3/app/views/workflows/permissions.html.erb redmine-2.4.2/app/views/workflows/permissions.html.erb --- redmine-2.3.3/app/views/workflows/permissions.html.erb 2013-09-14 06:48:19.000000000 +0000 +++ redmine-2.4.2/app/views/workflows/permissions.html.erb 2013-12-23 08:48:38.000000000 +0000 @@ -1,6 +1,6 @@ <%= render :partial => 'action_menu' %> -

    <%=l(:label_workflow)%>

    +<%= title l(:label_workflow) %>
      @@ -35,14 +35,14 @@
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> <%=l(:label_current_status)%> <%=l(:label_new_statuses_allowed)%><%=l(:label_new_statuses_allowed)%>
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.new-status-#{new_status.id}')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> <%=h new_status.name %> @@ -22,7 +22,7 @@
    + <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.old-status-#{old_status.id}')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> @@ -30,7 +30,7 @@ + <%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, checked, :class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>
    <%= h tracker %><%= h tracker %> + <%= link_to((count > 0 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %>
    - - + <% for status in @statuses %> - <% end %> @@ -57,12 +57,13 @@ <% @fields.each do |field, name| %> "> - <% for status in @statuses -%> - <% end -%> @@ -76,12 +77,13 @@ <% @custom_fields.each do |field| %> "> - <% for status in @statuses -%> - <% end -%> @@ -93,3 +95,12 @@ <%= submit_tag l(:button_save) %> <% end %> <% end %> + +<%= javascript_tag do %> +$("a.repeat-value").click(function(e){ + e.preventDefault(); + var td = $(this).closest('td'); + var selected = td.find("select").find(":selected").val(); + td.nextAll('td').find("select").val(selected); +}); +<% end %> diff -Nru redmine-2.3.3/config/application.rb redmine-2.4.2/config/application.rb --- redmine-2.3.3/config/application.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/application.rb 2013-12-23 08:48:39.000000000 +0000 @@ -22,9 +22,6 @@ # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] - # Activate observers that should always be running. - config.active_record.observers = :message_observer, :issue_observer, :journal_observer, :news_observer, :document_observer, :wiki_content_observer, :comment_observer - config.active_record.store_full_sti_class = true config.active_record.default_timezone = :local @@ -36,6 +33,8 @@ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de + I18n.enforce_available_locales = false + # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" diff -Nru redmine-2.3.3/config/configuration.yml.example redmine-2.4.2/config/configuration.yml.example --- redmine-2.3.3/config/configuration.yml.example 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/configuration.yml.example 2013-12-23 08:48:39.000000000 +0000 @@ -197,6 +197,11 @@ # Maximum number of simultaneous AJAX uploads #max_concurrent_ajax_uploads: 2 + # Configure OpenIdAuthentication.store + # + # allowed values: :memory, :file, :memcache + #openid_authentication_store: :memory + # specific configuration options for production environment # that overrides the default ones production: diff -Nru redmine-2.3.3/config/initializers/00-core_plugins.rb redmine-2.4.2/config/initializers/00-core_plugins.rb --- redmine-2.3.3/config/initializers/00-core_plugins.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/initializers/00-core_plugins.rb 2013-12-23 08:48:39.000000000 +0000 @@ -8,7 +8,7 @@ end initializer = File.join(directory, "init.rb") if File.file?(initializer) - config = config = RedmineApp::Application.config + config = RedmineApp::Application.config eval(File.read(initializer), binding, initializer) end end diff -Nru redmine-2.3.3/config/initializers/10-patches.rb redmine-2.4.2/config/initializers/10-patches.rb --- redmine-2.3.3/config/initializers/10-patches.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/initializers/10-patches.rb 2013-12-23 08:48:39.000000000 +0000 @@ -91,6 +91,43 @@ ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| html_tag || ''.html_safe } +# HTML5: is invalid, use instead +module ActionView + module Helpers + class InstanceTag + private + def add_options_with_non_empty_blank_option(option_tags, options, value = nil) + if options[:include_blank] == true + options = options.dup + options[:include_blank] = ' '.html_safe + end + add_options_without_non_empty_blank_option(option_tags, options, value) + end + alias_method_chain :add_options, :non_empty_blank_option + end + + module FormTagHelper + def select_tag_with_non_empty_blank_option(name, option_tags = nil, options = {}) + if options.delete(:include_blank) + options[:prompt] = ' '.html_safe + end + select_tag_without_non_empty_blank_option(name, option_tags, options) + end + alias_method_chain :select_tag, :non_empty_blank_option + end + + module FormOptionsHelper + def options_for_select_with_non_empty_blank_option(container, selected = nil) + if container.is_a?(Array) + container = container.map {|element| element.blank? ? [" ".html_safe, ""] : element} + end + options_for_select_without_non_empty_blank_option(container, selected) + end + alias_method_chain :options_for_select, :non_empty_blank_option + end + end +end + require 'mail' module DeliveryMethods diff -Nru redmine-2.3.3/config/initializers/30-redmine.rb redmine-2.4.2/config/initializers/30-redmine.rb --- redmine-2.3.3/config/initializers/30-redmine.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/initializers/30-redmine.rb 2013-12-23 08:48:39.000000000 +0000 @@ -9,6 +9,13 @@ RedmineApp::Application.config.secret_token = secret end +if Object.const_defined?(:OpenIdAuthentication) + openid_authentication_store = Redmine::Configuration['openid_authentication_store'] + OpenIdAuthentication.store = + openid_authentication_store.present? ? + openid_authentication_store : :memory +end + Redmine::Plugin.load unless Redmine::Configuration['mirror_plugins_assets_on_startup'] == false Redmine::Plugin.mirror_assets diff -Nru redmine-2.3.3/config/locales/ar.yml redmine-2.4.2/config/locales/ar.yml --- redmine-2.3.3/config/locales/ar.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/ar.yml 2013-12-23 08:48:39.000000000 +0000 @@ -29,7 +29,7 @@ short: "%d %b %H:%M" long: "%B %d, %Y %H:%M" am: "صباحا" - pm: "مساءا" + pm: "مساءاً" datetime: distance_in_words: @@ -111,23 +111,24 @@ accepted: "مقبولة" empty: "لا يمكن ان تكون فارغة" blank: "لا يمكن ان تكون فارغة" - too_long: " %{count}طويلة جدا، الحد الاقصى هو )" - too_short: " %{count}قصيرة جدا، الحد الادنى هو)" - wrong_length: " %{count}خطأ في الطول، يجب ان يكون )" + too_long: " %{count} طويلة جدا، الحد الاقصى هو " + too_short: " %{count} قصيرة جدا، الحد الادنى هو " + wrong_length: " %{count} خطأ في الطول، يجب ان يكون " taken: "لقد اتخذت سابقا" not_a_number: "ليس رقما" not_a_date: "ليس تاريخا صالحا" greater_than: "%{count}يجب ان تكون اكثر من " - greater_than_or_equal_to: "%{count}يجب ان تكون اكثر من او تساوي" + greater_than_or_equal_to: "%{count} يجب ان تكون اكثر من او تساوي" equal_to: "%{count}يجب ان تساوي" less_than: " %{count}يجب ان تكون اقل من" - less_than_or_equal_to: " %{count}يجب ان تكون اقل من او تساوي" + less_than_or_equal_to: " %{count} يجب ان تكون اقل من او تساوي" odd: "must be odd" even: "must be even" greater_than_start_date: "يجب ان تكون اكثر من تاريخ البداية" not_same_project: "لا ينتمي الى نفس المشروع" circular_dependency: "هذه العلاقة سوف تخلق علاقة تبعية دائرية" cant_link_an_issue_with_a_descendant: "لا يمكن ان تكون المشكلة مرتبطة بواحدة من المهام الفرعية" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: الرجاء التحديد @@ -161,7 +162,7 @@ notice_not_authorized_archived_project: المشروع الذي تحاول الدخول اليه تم ارشفته notice_email_sent: "%{value}تم ارسال رسالة الى " notice_email_error: " (%{value})لقد حدث خطأ ما اثناء ارسال الرسالة الى " - notice_feeds_access_key_reseted: كلمة الدخول RSSلقد تم تعديل . + notice_feeds_access_key_reseted: كلمة الدخول Atomلقد تم تعديل . notice_api_access_key_reseted: كلمة الدخولAPIلقد تم تعديل . notice_failed_to_save_issues: "فشل في حفظ الملف" notice_failed_to_save_members: "فشل في حفظ الاعضاء: %{errors}." @@ -181,17 +182,17 @@ error_scm_annotate: "الادخال غير موجود." error_scm_annotate_big_text_file: "لا يمكن حفظ الادخال لانه تجاوز الحد الاقصى لحجم الملف." error_issue_not_found_in_project: 'لم يتم العثور على المخرج او انه ينتمي الى مشروع اخر' - error_no_tracker_in_project: 'لا يوجد متتبع لهذا المشروع، الرجاء التحقق من إعدادات المشروع. ' + error_no_tracker_in_project: 'لا يوجد انواع بنود عمل لهذا المشروع، الرجاء التحقق من إعدادات المشروع. ' error_no_default_issue_status: 'لم يتم التعرف على اي وضع افتراضي، الرجاء التحقق من التكوين الخاص بك (اذهب الى إدارة-إصدار الحالات)' error_can_not_delete_custom_field: غير قادر على حذف الحقل المظلل - error_can_not_delete_tracker: "هذا المتتبع يحتوي على مسائل نشطة ولا يمكن حذفه" + error_can_not_delete_tracker: "هذا النوع من بنود العمل يحتوي على بنود نشطة ولا يمكن حذفه" error_can_not_remove_role: "هذا الدور قيد الاستخدام، لا يمكن حذفه" - error_can_not_reopen_issue_on_closed_version: 'لا يمكن إعادة فتح قضية معينه لاصدار مقفل' + error_can_not_reopen_issue_on_closed_version: 'لا يمكن إعادة فتح بند عمل معين لاصدار مقفل' error_can_not_archive_project: لا يمكن ارشفة هذا المشروع error_issue_done_ratios_not_updated: "لم يتم تحديث النسب" - error_workflow_copy_source: 'الرجاء اختيار المتتبع او الادوار' - error_workflow_copy_target: 'الرجاء اختيار هدف المتتبع او هدف الادوار' - error_unable_delete_issue_status: 'غير قادر على حذف حالة القضية' + error_workflow_copy_source: 'الرجاء اختيار نوع بند العمل او الادوار' + error_workflow_copy_target: 'الرجاء اختيار نوع بند العمل المستهدف او الادوار المستهدفة' + error_unable_delete_issue_status: 'غير قادر على حذف حالة بند العمل' error_unable_to_connect: "تعذر الاتصال(%{value})" error_attachment_too_big: " (%{max_size})لا يمكن تحميل هذا الملف، لقد تجاوز الحد الاقصى المسموح به " warning_attachments_not_saved: "%{count}تعذر حفظ الملف" @@ -205,7 +206,7 @@ mail_subject_account_activation_request: "%{value}طلب تفعيل الحساب " mail_body_account_activation_request: " (%{value})تم تسجيل حساب جديد، بانتظار الموافقة:" mail_subject_reminder: "%{count}تم تأجيل المهام التالية " - mail_body_reminder: "%{count}يجب ان تقوم بتسليم المهام التالية :" + mail_body_reminder: "%{count}يجب ان تقوم بتسليم المهام التالية:" mail_subject_wiki_content_added: "'%{id}' تم اضافة صفحة ويكي" mail_body_wiki_content_added: "The '%{id}' تم اضافة صفحة ويكي من قبل %{author}." mail_subject_wiki_content_updated: "'%{id}' تم تحديث صفحة ويكي" @@ -235,14 +236,14 @@ field_category: الفئة field_title: العنوان field_project: المشروع - field_issue: القضية + field_issue: بند العمل field_status: الحالة field_notes: ملاحظات - field_is_closed: القضية مغلقة + field_is_closed: بند العمل مغلق field_is_default: القيمة الافتراضية - field_tracker: المتتبع + field_tracker: نوع بند العمل field_subject: الموضوع - field_due_date: تاريخ الاستحقاق + field_due_date: تاريخ النهاية field_assigned_to: المحال اليه field_priority: الأولوية field_fixed_version: الاصدار المستهدف @@ -252,7 +253,7 @@ field_homepage: الصفحة الرئيسية field_is_public: عام field_parent: مشروع فرعي من - field_is_in_roadmap: القضايا المعروضة في خارطة الطريق + field_is_in_roadmap: معروض في خارطة الطريق field_login: تسجيل الدخول field_mail_notification: ملاحظات على البريد الالكتروني field_admin: المدير @@ -273,8 +274,8 @@ field_attr_lastname: سمة الاسم الاخير field_attr_mail: سمة البريد الالكتروني field_onthefly: إنشاء حساب مستخدم على تحرك - field_start_date: تاريخ البدية - field_done_ratio: "% تم" + field_start_date: تاريخ البداية + field_done_ratio: "نسبة الانجاز" field_auth_source: وضع المصادقة field_hide_mail: إخفاء بريدي الإلكتروني field_comments: تعليق @@ -286,9 +287,9 @@ field_spent_on: تاريخ field_identifier: المعرف field_is_filter: استخدم كتصفية - field_issue_to: القضايا المتصلة + field_issue_to: بنود العمل المتصلة field_delay: تأخير - field_assignable: يمكن ان تستند القضايا الى هذا الدور + field_assignable: يمكن اسناد بنود العمل الى هذا الدور field_redirect_existing_links: إعادة توجيه الروابط الموجودة field_estimated_hours: الوقت المتوقع field_column_names: أعمدة @@ -302,15 +303,15 @@ field_watcher: مراقب field_identity_url: افتح الرابط الخاص بالهوية الشخصية field_content: المحتويات - field_group_by: مجموعة النتائج عن طريق + field_group_by: تصنيف النتائج بواسطة field_sharing: مشاركة - field_parent_issue: مهمة الوالدين + field_parent_issue: بند العمل الأصلي field_member_of_group: "مجموعة المحال" field_assigned_to_role: "دور المحال" field_text: حقل نصي field_visible: غير مرئي field_warn_on_leaving_unsaved: "الرجاء التحذير عند مغادرة صفحة والنص غير محفوظ" - field_issues_visibility: القضايا المرئية + field_issues_visibility: بنود العمل المرئية field_is_private: خاص field_commit_logs_encoding: رسائل الترميز field_scm_path_encoding: ترميز المسار @@ -326,7 +327,7 @@ setting_login_required: مطلوب المصادقة setting_self_registration: التسجيل الذاتي setting_attachment_max_size: الحد الاقصى للملفات المرفقة - setting_issues_export_limit: الحد الاقصى لقضايا التصدير + setting_issues_export_limit: الحد الاقصى لتصدير بنود العمل لملفات خارجية setting_mail_from: انبعاثات عنوان بريدك setting_bcc_recipients: مستلمين النسخ المخفية (bcc) setting_plain_text_mail: نص عادي (no HTML) @@ -342,8 +343,8 @@ setting_autologin: الدخول التلقائي setting_date_format: تنسيق التاريخ setting_time_format: تنسيق الوقت - setting_cross_project_issue_relations: السماح بادارج القضايا في هذا المشروع - setting_issue_list_default_columns: الاعمدة الافتراضية المعروضة في قائمة القضية + setting_cross_project_issue_relations: السماح بإدراج بنود العمل في هذا المشروع + setting_issue_list_default_columns: الاعمدة الافتراضية المعروضة في قائمة بند العمل setting_repositories_encodings: ترميز المرفقات والمستودعات setting_emails_header: رأس رسائل البريد الإلكتروني setting_emails_footer: ذيل رسائل البريد الإلكتروني @@ -351,7 +352,7 @@ setting_per_page_options: الكائنات لكل خيارات الصفحة setting_user_format: تنسيق عرض المستخدم setting_activity_days_default: الايام المعروضة على نشاط المشروع - setting_display_subprojects_issues: عرض القضايا الفرعية للمشارع الرئيسية بشكل افتراضي + setting_display_subprojects_issues: عرض بنود العمل للمشارع الرئيسية بشكل افتراضي setting_enabled_scm: SCM تمكين setting_mail_handler_body_delimiters: "اقتطاع رسائل البريد الإلكتروني بعد هذه الخطوط" setting_mail_handler_api_enabled: للرسائل الواردةWS تمكين @@ -366,18 +367,18 @@ setting_password_min_length: الحد الادني لطول كلمة المرور setting_new_project_user_role_id: الدور المسند الى المستخدم غير المسؤول الذي يقوم بإنشاء المشروع setting_default_projects_modules: تمكين الوحدات النمطية للمشاريع الجديدة بشكل افتراضي - setting_issue_done_ratio: حساب نسبة القضية المنتهية - setting_issue_done_ratio_issue_field: استخدم حقل القضية - setting_issue_done_ratio_issue_status: استخدم وضع القضية + setting_issue_done_ratio: حساب نسبة بند العمل المنتهية + setting_issue_done_ratio_issue_field: استخدم حقل بند العمل + setting_issue_done_ratio_issue_status: استخدم وضع بند العمل setting_start_of_week: بدأ التقويم setting_rest_api_enabled: تمكين باقي خدمات الويب setting_cache_formatted_text: النص المسبق تنسيقه في ذاكرة التخزين المؤقت setting_default_notification_option: خيار الاعلام الافتراضي setting_commit_logtime_enabled: تميكن وقت الدخول setting_commit_logtime_activity_id: النشاط في وقت الدخول - setting_gantt_items_limit: الحد الاقصى لعدد العناصر المعروضة على المخطط + setting_gantt_items_limit: الحد الاقصى لعدد العناصر المعروضة على مخطط جانت setting_issue_group_assignment: السماح للإحالة الى المجموعات - setting_default_issue_start_date_to_creation_date: استخدام التاريخ الحالي كتاريخ بدأ للقضايا الجديدة + setting_default_issue_start_date_to_creation_date: استخدام التاريخ الحالي كتاريخ بدأ لبنود العمل الجديدة permission_add_project: إنشاء مشروع permission_add_subprojects: إنشاء مشاريع فرعية @@ -386,18 +387,18 @@ permission_manage_members: إدارة الاعضاء permission_manage_project_activities: ادارة اصدارات المشروع permission_manage_versions: ادارة الاصدارات - permission_manage_categories: ادارة انواع القضايا - permission_view_issues: عرض القضايا - permission_add_issues: اضافة القضايا - permission_edit_issues: تعديل القضايا - permission_manage_issue_relations: ادارة علاقات القضايا - permission_set_issues_private: تعين قضايا عامة او خاصة - permission_set_own_issues_private: تعين القضايا الخاصة بك كقضايا عامة او خاصة + permission_manage_categories: ادارة انواع بنود العمل + permission_view_issues: عرض بنود العمل + permission_add_issues: اضافة بنود العمل + permission_edit_issues: تعديل بنود العمل + permission_manage_issue_relations: ادارة علاقات بنود العمل + permission_set_issues_private: تعين بنود العمل عامة او خاصة + permission_set_own_issues_private: تعين بنود العمل الخاصة بك كبنود عمل عامة او خاصة permission_add_issue_notes: اضافة ملاحظات permission_edit_issue_notes: تعديل ملاحظات permission_edit_own_issue_notes: تعديل ملاحظاتك - permission_move_issues: تحريك القضايا - permission_delete_issues: حذف القضايا + permission_move_issues: تحريك بنود العمل + permission_delete_issues: حذف بنود العمل permission_manage_public_queries: ادارة الاستعلامات العامة permission_save_queries: حفظ الاستعلامات permission_view_gantt: عرض طريقة"جانت" @@ -436,7 +437,7 @@ permission_export_wiki_pages: تصدير صفحات ويكي permission_manage_subtasks: ادارة المهام الفرعية - project_module_issue_tracking: تعقب القضايا + project_module_issue_tracking: تعقب بنود العمل project_module_time_tracking: التعقب الزمني project_module_news: الاخبار project_module_documents: المستندات @@ -460,13 +461,13 @@ other: "%{count} مشاريع" label_project_all: كل المشاريع label_project_latest: احدث المشاريع - label_issue: قضية - label_issue_new: قضية جديدة - label_issue_plural: قضايا - label_issue_view_all: عرض كل القضايا - label_issues_by: " %{value}القضية لصحابها" - label_issue_added: تم اضافة القضية - label_issue_updated: تم تحديث القضية + label_issue: بند عمل + label_issue_new: بند عمل جديد + label_issue_plural: بنود عمل + label_issue_view_all: عرض كل بنود العمل + label_issues_by: " %{value}بند العمل لصحابها" + label_issue_added: تم اضافة بند العمل + label_issue_updated: تم تحديث بند العمل label_issue_note_added: تم اضافة الملاحظة label_issue_status_updated: تم تحديث الحالة label_issue_priority_updated: تم تحديث الاولويات @@ -477,22 +478,22 @@ label_role: دور label_role_plural: ادوار label_role_new: دور جديد - label_role_and_permissions: الادوار والاذن + label_role_and_permissions: الأدوار والصلاحيات label_role_anonymous: مجهول الهوية label_role_non_member: ليس عضو label_member: عضو label_member_new: عضو جديد label_member_plural: اعضاء - label_tracker: المتتبع - label_tracker_plural: المتتبعين - label_tracker_new: متتبع جديد + label_tracker: نوع بند عمل + label_tracker_plural: أنواع بنود العمل + label_tracker_new: نوع بند عمل جديد label_workflow: سير العمل - label_issue_status: وضع القضية - label_issue_status_plural: اوضاع القضية - label_issue_status_new: وضع جديد - label_issue_category: نوع القضية - label_issue_category_plural: انواع القضايا - label_issue_category_new: نوع جديد + label_issue_status: حالة بند العمل + label_issue_status_plural: حالات بند العمل + label_issue_status_new: حالة جديدة + label_issue_category: فئة بند العمل + label_issue_category_plural: فئات بنود العمل + label_issue_category_new: فئة جديدة label_custom_field: تخصيص حقل label_custom_field_plural: تخصيص حقول label_custom_field_new: حقل مخصص جديد @@ -504,17 +505,17 @@ label_register: تسجيل label_login_with_open_id_option: او الدخول بهوية مفتوحة label_password_lost: فقدت كلمة السر - label_home: الصفحة الرئيسية + label_home: "الصفحة الرئيسية" label_my_page: الصفحة الخاصة بي label_my_account: حسابي label_my_projects: مشاريعي الخاصة label_my_page_block: حجب صفحتي الخاصة - label_administration: الإدارة + label_administration: إدارة النظام label_login: تسجيل الدخول label_logout: تسجيل الخروج label_help: مساعدة - label_reported_issues: أبلغ القضايا - label_assigned_to_me_issues: المسائل المعنية إلى + label_reported_issues: بنود العمل التي أدخلتها + label_assigned_to_me_issues: بنود العمل المسندة إلي label_last_login: آخر اتصال label_registered_on: مسجل على label_activity: النشاط @@ -529,19 +530,19 @@ label_auth_source_plural: أوضاع المصادقة label_subproject_plural: مشاريع فرعية label_subproject_new: مشروع فرعي جديد - label_and_its_subprojects: "قيمةالمشاريع الفرعية الخاصة بك" + label_and_its_subprojects: "قيمة المشاريع الفرعية الخاصة بك" label_min_max_length: الحد الاقصى والادنى للطول label_list: قائمة label_date: تاريخ label_integer: عدد صحيح - label_float: تعويم - label_boolean: منطقية - label_string: النص + label_float: عدد كسري + label_boolean: "نعم/لا" + label_string: نص label_text: نص طويل label_attribute: سمة label_attribute_plural: السمات label_no_data: لا توجد بيانات للعرض - label_change_status: تغيير الوضع + label_change_status: تغيير الحالة label_history: التاريخ label_attachment: الملف label_attachment_new: ملف جديد @@ -567,10 +568,10 @@ label_export_to: 'متوفرة أيضا في:' label_read: القراءة... label_public_projects: المشاريع العامة - label_open_issues: فتح قضية - label_open_issues_plural: فتح قضايا - label_closed_issues: قضية مغلقة - label_closed_issues_plural: قضايا مغلقة + label_open_issues: مفتوح + label_open_issues_plural: بنود عمل مفتوحة + label_closed_issues: مغلق + label_closed_issues_plural: بنود عمل مغلقة label_x_open_issues_abbr_on_total: zero: 0 مفتوح / %{total} one: 1 مفتوح / %{total} @@ -584,8 +585,8 @@ one: 1 مغلق other: "%{count} مغلق" label_total: الإجمالي - label_permissions: أذونات - label_current_status: الوضع الحالي + label_permissions: صلاحيات + label_current_status: الحالة الحالية label_new_statuses_allowed: يسمح بادراج حالات جديدة label_all: جميع label_none: لا شيء @@ -620,8 +621,8 @@ label_filter_plural: عوامل التصفية label_equals: يساوي label_not_equals: لا يساوي - label_in_less_than: في أقل من - label_in_more_than: في أكثر من + label_in_less_than: أقل من + label_in_more_than: أكثر من label_greater_or_equal: '>=' label_less_or_equal: '< =' label_between: بين @@ -631,13 +632,13 @@ label_yesterday: بالأمس label_this_week: هذا الأسبوع label_last_week: الأسبوع الماضي - label_last_n_days: "ايام %{count} اخر" + label_last_n_days: "آخر %{count} أيام" label_this_month: هذا الشهر label_last_month: الشهر الماضي label_this_year: هذا العام label_date_range: نطاق التاريخ - label_less_than_ago: أقل من قبل أيام - label_more_than_ago: أكثر من قبل أيام + label_less_than_ago: أقل من عدد أيام + label_more_than_ago: أكثر من عدد أيام label_ago: منذ أيام label_contains: يحتوي على label_not_contains: لا يحتوي على @@ -651,24 +652,24 @@ label_revision_plural: تنقيحات label_revision_id: " %{value}مراجعة" label_associated_revisions: التنقيحات المرتبطة - label_added: إضافة - label_modified: تعديل - label_copied: نسخ + label_added: مضاف + label_modified: معدل + label_copied: منسوخ label_renamed: إعادة تسمية - label_deleted: حذف + label_deleted: محذوف label_latest_revision: آخر تنقيح label_latest_revision_plural: أحدث المراجعات label_view_revisions: عرض التنقيحات label_view_all_revisions: عرض كافة المراجعات label_max_size: الحد الأقصى للحجم - label_sort_highest: التحرك إلى أعلى + label_sort_highest: التحرك لأعلى مرتبة label_sort_higher: تحريك لأعلى label_sort_lower: تحريك لأسفل - label_sort_lowest: الانتقال إلى أسفل + label_sort_lowest: التحرك لأسفل مرتبة label_roadmap: خارطة الطريق label_roadmap_due_in: " %{value}تستحق في " label_roadmap_overdue: "%{value}تأخير" - label_roadmap_no_issues: لا يوجد قضايا لهذا الإصدار + label_roadmap_no_issues: لا يوجد بنود عمل لهذا الإصدار label_search: البحث label_result_plural: النتائج label_all_words: كل الكلمات @@ -683,8 +684,8 @@ label_preview: معاينة label_feed_plural: موجز ويب label_changes_details: تفاصيل جميع التغييرات - label_issue_tracking: تعقب القضايا - label_spent_time: أمضى بعض الوقت + label_issue_tracking: تعقب بنود العمل + label_spent_time: ما تم إنفاقه من الوقت label_overall_spent_time: الوقت الذي تم انفاقه كاملا label_f_hour: "%{value} ساعة" label_f_hour_plural: "%{value} ساعات" @@ -699,27 +700,27 @@ label_diff_side_by_side: جنبا إلى جنب label_options: خيارات label_copy_workflow_from: نسخ سير العمل من - label_permissions_report: تقرير أذونات - label_watched_issues: شاهد القضايا - label_related_issues: القضايا ذات الصلة - label_applied_status: تطبيق مركز + label_permissions_report: تقرير الصلاحيات + label_watched_issues: بنود العمل المتابعة بريدياً + label_related_issues: بنود العمل ذات الصلة + label_applied_status: الحالة المطبقة label_loading: تحميل... label_relation_new: علاقة جديدة label_relation_delete: حذف العلاقة - label_relates_to: ذات الصلة إلى - label_duplicates: التكرارات - label_duplicated_by: ازدواج - label_blocks: حظر - label_blocked_by: حظر بواسطة + label_relates_to: ذات علاقة بـ + label_duplicates: مكرر من + label_duplicated_by: مكرر بواسطة + label_blocks: يجب تنفيذه قبل + label_blocked_by: لا يمكن تنفيذه إلا بعد label_precedes: يسبق label_follows: يتبع label_end_to_start: نهاية لبدء - label_end_to_end: نهاية إلى نهاية - label_start_to_start: بدء إلى بدء + label_end_to_end: نهاية لنهاية + label_start_to_start: بدء لبدء label_start_to_end: بداية لنهاية label_stay_logged_in: تسجيل الدخول في label_disabled: تعطيل - label_show_completed_versions: أكملت إظهار إصدارات + label_show_completed_versions: إظهار الإصدارات الكاملة label_me: لي label_board: المنتدى label_board_new: منتدى جديد @@ -741,20 +742,20 @@ label_language_based: استناداً إلى لغة المستخدم label_sort_by: " %{value}الترتيب حسب " label_send_test_email: ارسل رسالة الكترونية كاختبار - label_feeds_access_key: RSS مفتاح دخول - label_missing_feeds_access_key: مفقودRSS مفتاح دخول - label_feeds_access_key_created_on: "RSS تم انشاء مفتاح %{value} منذ" + label_feeds_access_key: Atom مفتاح دخول + label_missing_feeds_access_key: مفقودAtom مفتاح دخول + label_feeds_access_key_created_on: "Atom تم انشاء مفتاح %{value} منذ" label_module_plural: الوحدات النمطية - label_added_time_by: " تم اضافته من قبل%{author} %{age} منذ" - label_updated_time_by: " تم تحديثه من قبل%{author} %{age} منذ" - label_updated_time: "تم التحديث %{value} منذ" + label_added_time_by: " تم اضافته من قبل %{author} منذ %{age}" + label_updated_time_by: " تم تحديثه من قبل %{author} منذ %{age}" + label_updated_time: "تم التحديث منذ %{value}" label_jump_to_a_project: الانتقال إلى مشروع... label_file_plural: الملفات label_changeset_plural: اعدادات التغير label_default_columns: الاعمدة الافتراضية - label_no_change_option: (أي تغيير) - label_bulk_edit_selected_issues: تحرير القضايا المظللة - label_bulk_edit_selected_time_entries: تعديل كل الإدخالات في كل الاوقات + label_no_change_option: (لا تغيير) + label_bulk_edit_selected_issues: تحرير بنود العمل المظللة + label_bulk_edit_selected_time_entries: تعديل بنود الأوقات المظللة label_theme: الموضوع label_default: الافتراضي label_search_titles_only: البحث في العناوين فقط @@ -764,7 +765,7 @@ label_user_mail_option_only_my_events: "السماح لي فقط بمشاهدة الاحداث الخاصة" label_user_mail_option_only_assigned: "فقط الخيارات التي تم تعيينها" label_user_mail_option_only_owner: "فقط للخيارات التي املكها" - label_user_mail_no_self_notified: "لا تريد اعلامك بالتغيرات التي تجريها بنفسك" + label_user_mail_no_self_notified: "لا تريد إعلامك بالتغيرات التي تجريها بنفسك" label_registration_activation_by_email: حساب التنشيط عبر البريد الإلكتروني label_registration_manual_activation: تنشيط الحساب اليدوي label_registration_automatic_activation: تنشيط الحساب التلقائي @@ -776,7 +777,7 @@ label_scm: scm label_plugins: الإضافات label_ldap_authentication: مصادقة LDAP - label_downloads_abbr: D/L + label_downloads_abbr: تنزيل label_optional_description: وصف اختياري label_add_another_file: إضافة ملف آخر label_preferences: تفضيلات @@ -797,17 +798,17 @@ label_group: مجموعة label_group_plural: المجموعات label_group_new: مجموعة جديدة - label_time_entry_plural: أمضى بعض الوقت - label_version_sharing_none: لم يشارك - label_version_sharing_descendants: يشارك - label_version_sharing_hierarchy: مع التسلسل الهرمي للمشروع + label_time_entry_plural: الأوقات المنفقة + label_version_sharing_none: غير متاح + label_version_sharing_descendants: متاح للمشاريع الفرعية + label_version_sharing_hierarchy: متاح للتسلسل الهرمي للمشروع label_version_sharing_tree: مع شجرة المشروع label_version_sharing_system: مع جميع المشاريع - label_update_issue_done_ratios: تحديث قضيةالنسب - label_copy_source: مصدر + label_update_issue_done_ratios: تحديث نسبة الأداء لبند العمل + label_copy_source: المصدر label_copy_target: الهدف - label_copy_same_as_target: نفس الهدف - label_display_used_statuses_only: عرض الحالات المستخدمة من قبل هذا "تعقب" فقط + label_copy_same_as_target: مطابق للهدف + label_display_used_statuses_only: عرض الحالات المستخدمة من قبل هذا النوع من بنود العمل فقط label_api_access_key: مفتاح الوصول إلى API label_missing_api_access_key: API لم يتم الحصول على مفتاح الوصول label_api_access_key_created_on: " API إنشاء مفتاح الوصول إلى" @@ -818,9 +819,9 @@ label_user_search: "البحث عن المستخدم:" label_additional_workflow_transitions_for_author: الانتقالات الإضافية المسموح بها عند المستخدم صاحب البلاغ label_additional_workflow_transitions_for_assignee: الانتقالات الإضافية المسموح بها عند المستخدم المحال إليه - label_issues_visibility_all: جميع القضايا - label_issues_visibility_public: جميع القضايا الخاصة - label_issues_visibility_own: القضايا التي أنشأها المستخدم + label_issues_visibility_all: جميع بنود العمل + label_issues_visibility_public: جميع بنود العمل الخاصة + label_issues_visibility_own: بنود العمل التي أنشأها المستخدم label_git_report_last_commit: اعتماد التقرير الأخير للملفات والدلائل label_parent_revision: الوالدين label_child_revision: الطفل @@ -829,20 +830,20 @@ button_login: دخول button_submit: تثبيت button_save: حفظ - button_check_all: نحديد الكل + button_check_all: تحديد الكل button_uncheck_all: عدم تحديد الكل - button_collapse_all: تقليص الكل + button_collapse_all: تقليص الكل button_expand_all: عرض الكل button_delete: حذف - button_create: انشاء - button_create_and_continue: انشاء واستمرار + button_create: إنشاء + button_create_and_continue: إنشاء واستمرار button_test: اختبار button_edit: تعديل button_edit_associated_wikipage: "تغير صفحة ويكي: %{page_title}" - button_add: اضافة - button_change: تغير + button_add: إضافة + button_change: تغيير button_apply: تطبيق - button_clear: واضح + button_clear: إخلاء الحقول button_lock: قفل button_unlock: الغاء القفل button_download: تنزيل @@ -856,11 +857,11 @@ button_sort: ترتيب button_log_time: وقت الدخول button_rollback: الرجوع الى هذا الاصدار - button_watch: يشاهد - button_unwatch: إلغاء المشاهدة + button_watch: تابع عبر البريد + button_unwatch: إلغاء المتابعة عبر البريد button_reply: رد - button_archive: الارشيف - button_unarchive: إلغاء الارشفة + button_archive: أرشفة + button_unarchive: إلغاء الأرشفة button_reset: إعادة button_rename: إعادة التسمية button_change_password: تغير كلمة المرور @@ -869,11 +870,11 @@ button_annotate: تعليق button_update: تحديث button_configure: تكوين - button_quote: يقتبس - button_duplicate: يضاعف - button_show: يظهر - button_edit_section: يعدل هذا الجزء - button_export: يستورد + button_quote: اقتباس + button_duplicate: عمل نسخة + button_show: إظهار + button_edit_section: تعديل هذا الجزء + button_export: تصدير لملف status_active: نشيط status_registered: مسجل @@ -889,34 +890,34 @@ text_regexp_info: مثال. ^[A-Z0-9]+$ text_min_max_length_info: الحد الاقصى والادني لطول المعلومات text_project_destroy_confirmation: هل أنت متأكد من أنك تريد حذف هذا المشروع والبيانات ذات الصلة؟ - text_subprojects_destroy_warning: "subproject(s): سيتم حذف أيضا." - text_workflow_edit: حدد دوراً وتعقب لتحرير سير العمل + text_subprojects_destroy_warning: "المشاريع الفرعية: %{value} سيتم حذفها أيضاً." + text_workflow_edit: حدد دوراً و نوع بند عمل لتحرير سير العمل text_are_you_sure: هل أنت متأكد؟ text_journal_changed: "%{label} تغير %{old} الى %{new}" text_journal_changed_no_detail: "%{label} تم التحديث" text_journal_set_to: "%{label} تغير الى %{value}" text_journal_deleted: "%{label} تم الحذف (%{old})" text_journal_added: "%{label} %{value} تم الاضافة" - text_tip_issue_begin_day: قضية بدأت اليوم - text_tip_issue_end_day: قضية انتهت اليوم - text_tip_issue_begin_end_day: قضية بدأت وانتهت اليوم + text_tip_issue_begin_day: بند عمل بدأ اليوم + text_tip_issue_end_day: بند عمل انتهى اليوم + text_tip_issue_begin_end_day: بند عمل بدأ وانتهى اليوم text_caracters_maximum: "%{count} الحد الاقصى." text_caracters_minimum: "الحد الادنى %{count}" text_length_between: "الطول %{min} بين %{max} رمز" - text_tracker_no_workflow: لم يتم تحديد سير العمل لهذا المتتبع + text_tracker_no_workflow: لم يتم تحديد سير العمل لهذا النوع من بنود العمل text_unallowed_characters: رموز غير مسموحة text_comma_separated: مسموح رموز متنوعة يفصلها فاصلة . text_line_separated: مسموح رموز متنوعة يفصلها سطور - text_issues_ref_in_commit_messages: الرجوع واصلاح القضايا في رسائل المشتكين - text_issue_added: "القضية %{id} تم ابلاغها عن طريق %{author}." - text_issue_updated: "القضية %{id} تم تحديثها عن طريق %{author}." + text_issues_ref_in_commit_messages: الارتباط وتغيير حالة بنود العمل في رسائل تحرير الملفات + text_issue_added: "بند العمل %{id} تم ابلاغها عن طريق %{author}." + text_issue_updated: "بند العمل %{id} تم تحديثها عن طريق %{author}." text_wiki_destroy_confirmation: هل انت متأكد من رغبتك في حذف هذا الويكي ومحتوياته؟ - text_issue_category_destroy_question: "بعض القضايا (%{count}) مرتبطة بهذه الفئة، ماذا تريد ان تفعل بها؟" + text_issue_category_destroy_question: "بعض بنود العمل (%{count}) مرتبطة بهذه الفئة، ماذا تريد ان تفعل بها؟" text_issue_category_destroy_assignments: حذف الفئة text_issue_category_reassign_to: اعادة تثبيت البنود في الفئة text_user_mail_option: "بالنسبة للمشاريع غير المحددة، سوف يتم ابلاغك عن المشاريع التي تشاهدها او تشارك بها فقط!" - text_no_configuration_data: "الادوار والمتتبع وحالات القضية ومخطط سير العمل لم يتم تحديد وضعها الافتراضي بعد. " - text_load_default_configuration: احمل الاعدادات الافتراضية + text_no_configuration_data: "الادوار والمتتبع وحالات بند العمل ومخطط سير العمل لم يتم تحديد وضعها الافتراضي بعد. " + text_load_default_configuration: تحميل الاعدادات الافتراضية text_status_changed_by_changeset: " طبق التغيرات المعينة على %{value}." text_time_logged_by_changeset: "تم تطبيق التغيرات المعينة على %{value}." text_issues_destroy_confirmation: هل انت متأكد من حذف البنود المظللة؟' @@ -926,20 +927,20 @@ text_default_administrator_account_changed: تم تعديل الاعدادات الافتراضية لحساب المدير text_file_repository_writable: المرفقات قابلة للكتابة text_plugin_assets_writable: الدليل المساعد قابل للكتابة - text_destroy_time_entries_question: " ساعة على القضية التي تود حذفها، ماذا تريد ان تفعل؟ %{hours} تم تثبيت" + text_destroy_time_entries_question: " ساعة على بند العمل التي تود حذفها، ماذا تريد ان تفعل؟ %{hours} تم تثبيت" text_destroy_time_entries: قم بحذف الساعات المسجلة text_assign_time_entries_to_project: ثبت الساعات المسجلة على التقرير - text_reassign_time_entries: 'اعادة تثبيت الساعات المسجلة لهذه القضية:' + text_reassign_time_entries: 'اعادة تثبيت الساعات المسجلة لبند العمل هذا:' text_user_wrote: "%{value} كتب:" text_enumeration_destroy_question: "%{count} الكائنات المعنية لهذه القيمة" text_enumeration_category_reassign_to: اعادة تثبيت الكائنات التالية لهذه القيمة:' text_email_delivery_not_configured: "لم يتم تسليم البريد الالكتروني" - text_diff_truncated: '... لقد تم اقتطلع هذا الجزء لانه تجاوز الحد الاقصى المسموح بعرضه' + text_diff_truncated: '... لقد تم اقتطاع هذا الجزء لانه تجاوز الحد الاقصى المسموح بعرضه' text_custom_field_possible_values_info: 'سطر لكل قيمة' - text_wiki_page_nullify_children: "الاحتفاظ بصفحات الطفل كصفحات جذر" - text_wiki_page_destroy_children: "حذف صفحات الطفل وجميع أولادهم" + text_wiki_page_nullify_children: "الاحتفاظ بصفحات الابن كصفحات جذر" + text_wiki_page_destroy_children: "حذف صفحات الابن وجميع أولادهم" text_wiki_page_reassign_children: "إعادة تعيين صفحات تابعة لهذه الصفحة الأصلية" - text_own_membership_delete_confirmation: "انت على وشك إزالة بعض أو كافة الأذونات الخاصة بك، لن تكون قادراً على تحرير هذا المشروع بعد ذلك. هل أنت متأكد من أنك تريد المتابعة؟" + text_own_membership_delete_confirmation: "انت على وشك إزالة بعض أو كافة الصلاحيات الخاصة بك، لن تكون قادراً على تحرير هذا المشروع بعد ذلك. هل أنت متأكد من أنك تريد المتابعة؟" text_zoom_in: تصغير text_zoom_out: تكبير text_warn_on_leaving_unsaved: "الصفحة تحتوي على نص غير مخزن، سوف يفقد النص اذا تم الخروج من الصفحة." @@ -969,7 +970,7 @@ default_priority_normal: عادي default_priority_high: عالي default_priority_urgent: طارئ - default_priority_immediate: مباشرة + default_priority_immediate: طارئ الآن default_activity_design: تصميم default_activity_development: تطوير @@ -979,7 +980,7 @@ enumeration_system_activity: نشاط النظام description_filter: فلترة description_search: حقل البحث - description_choose_project: مشاريع + description_choose_project: المشاريع description_project_scope: مجال البحث description_notes: ملاحظات description_message_content: محتويات الرسالة @@ -1002,9 +1003,9 @@ Users with the same Redmine and repository username or email are automatically mapped. notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." label_x_issues: - zero: 0 قضية - one: 1 قضية - other: "%{count} قضايا" + zero: لا يوجد بنود عمل + one: بند عمل واحد + other: "%{count} بنود عمل" label_repository_new: New repository field_repository_is_default: Main repository label_copy_attachments: Copy attachments @@ -1055,8 +1056,8 @@ label_attribute_of_assigned_to: Assignee's %{name} label_attribute_of_fixed_version: Target version's %{name} label_copy_subtasks: Copy subtasks - label_copied_to: copied to - label_copied_from: copied from + label_copied_to: منسوخ لـ + label_copied_from: منسوخ من label_any_issues_in_project: any issues in project label_any_issues_not_in_project: any issues not in project field_private_notes: Private notes @@ -1064,16 +1065,16 @@ permission_set_notes_private: Set notes as private label_no_issues_in_project: no issues in project label_any: جميع - label_last_n_weeks: last %{count} weeks + label_last_n_weeks: آخر %{count} أسبوع/أسابيع setting_cross_project_subtasks: Allow cross-project subtasks - label_cross_project_descendants: يشارك - label_cross_project_tree: مع شجرة المشروع - label_cross_project_hierarchy: مع التسلسل الهرمي للمشروع - label_cross_project_system: مع جميع المشاريع - button_hide: Hide - setting_non_working_week_days: Non-working days - label_in_the_next_days: in the next - label_in_the_past_days: in the past + label_cross_project_descendants: متاح للمشاريع الفرعية + label_cross_project_tree: متاح مع شجرة المشروع + label_cross_project_hierarchy: متاح مع التسلسل الهرمي للمشروع + label_cross_project_system: متاح مع جميع المشاريع + button_hide: إخفاء + setting_non_working_week_days: "أيام أجازة/راحة أسبوعية" + label_in_the_next_days: في الأيام المقبلة + label_in_the_past_days: في الأيام الماضية label_attribute_of_user: User's %{name} text_turning_multiple_off: If you disable multiple values, multiple values will be removed in order to preserve only one value per item. @@ -1085,5 +1086,18 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: الإجمالي + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/az.yml redmine-2.4.2/config/locales/az.yml --- redmine-2.3.3/config/locales/az.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/az.yml 2013-12-23 08:48:39.000000000 +0000 @@ -196,6 +196,7 @@ not_same_project: "təkcə bir layihəyə aid deyildir" circular_dependency: "Belə əlaqə dövri asılılığa gətirib çıxaracaq" cant_link_an_issue_with_a_descendant: "Tapşırıq özünün alt tapşırığı ilə əlaqəli ola bilməz" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" support: array: @@ -488,8 +489,8 @@ label_equals: sayılır label_example: Nümunə label_export_to: ixrac etmək - label_feed_plural: RSS - label_feeds_access_key_created_on: "RSS-ə giriş açarı %{value} əvvəl yaradılıb" + label_feed_plural: Atom + label_feeds_access_key_created_on: "Atom-ə giriş açarı %{value} əvvəl yaradılıb" label_f_hour: "%{value} saat" label_f_hour_plural: "%{value} saat" label_file_added: Fayl əlavə edilib @@ -764,7 +765,7 @@ notice_email_sent: "Məktub göndərilib %{value}" notice_failed_to_save_issues: "Seçilən %{total} içərisindən %{count} bəndləri saxlamaq mümkün olmadı: %{ids}." notice_failed_to_save_members: "İştirakçını (ları) yadda saxlamaq mümkün olmadı: %{errors}." - notice_feeds_access_key_reseted: Sizin RSS giriş açarınız sıfırlanmışdır. + notice_feeds_access_key_reseted: Sizin Atom giriş açarınız sıfırlanmışdır. notice_file_not_found: Daxil olmağa çalışdığınız səhifə mövcud deyildir və ya silinib. notice_locking_conflict: İnformasiya digər istifadəçi tərəfindən yenilənib. notice_no_issue_selected: "Heç bir tapşırıq seçilməyib! Xahiş edirik, redaktə etmək istədiyiniz tapşırığı qeyd edin." @@ -856,7 +857,7 @@ setting_display_subprojects_issues: Susmaya görə altlayihələrin əks olunması setting_emails_footer: Məktubun sətiraltı qeydləri setting_enabled_scm: Daxil edilən SCM - setting_feeds_limit: RSS axını üçün başlıqların sayının məhdudlaşdırılması + setting_feeds_limit: Atom axını üçün başlıqların sayının məhdudlaşdırılması setting_file_max_size_displayed: Əks olunma üçün mətn faylının maksimal ölçüsü setting_gravatar_enabled: İstifadəçi avatarını Gravatar-dan istifadə etmək setting_host_name: Kompyuterin adı @@ -995,12 +996,12 @@ permission_view_issues: Tapşırıqlara baxış label_display_used_statuses_only: Yalnız bu trekerdə istifadə olunan statusları əks etdirmək label_api_access_key_created_on: API-yə giriş açarı %{value} əvvəl aradılıb - label_feeds_access_key: RSS giriş açarı + label_feeds_access_key: Atom giriş açarı notice_api_access_key_reseted: Sizin API giriş açarınız sıfırlanıb. setting_rest_api_enabled: REST veb-servisini qoşmaq button_show: Göstərmək label_missing_api_access_key: API-yə giriş açarı mövcud deyildir - label_missing_feeds_access_key: RSS-ə giriş açarı mövcud deyildir + label_missing_feeds_access_key: Atom-ə giriş açarı mövcud deyildir setting_mail_handler_body_delimiters: Bu sətirlərin birindən sonra məktubu qısaltmaq permission_add_subprojects: Alt layihələrin yaradılması label_subproject_new: Yeni alt layihə @@ -1182,5 +1183,18 @@ label_any_issues_not_in_project: any issues not in project label_cross_project_tree: With project tree field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Cəmi + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/bg.yml redmine-2.4.2/config/locales/bg.yml --- redmine-2.3.3/config/locales/bg.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/bg.yml 2013-12-23 08:48:39.000000000 +0000 @@ -130,6 +130,7 @@ not_same_project: "не е от същия проект" circular_dependency: "Тази релация ще доведе до безкрайна зависимост" cant_link_an_issue_with_a_descendant: "Една задача не може да бъде свързвана към своя подзадача" + earlier_than_minimum_start_date: "не може да бъде по-рано от %{date} поради предхождащи задачи" actionview_instancetag_blank_option: Изберете @@ -148,8 +149,12 @@ notice_account_invalid_creditentials: Невалиден потребител или парола. notice_account_password_updated: Паролата е успешно променена. notice_account_wrong_password: Грешна парола - notice_account_register_done: Профилът е създаден успешно. + notice_account_register_done: Профилът е създаден успешно. E-mail, съдържащ инструкции за активиране на профила + е изпратен на %{email}. notice_account_unknown_email: Непознат e-mail. + notice_account_not_activated_yet: Вие не сте активирали вашия профил все още. Ако искате да + получите нов e-mail за активиране, моля натиснете тази връзка. + notice_account_locked: Вашият профил е блокиран. notice_can_t_change_password: Този профил е с външен метод за оторизация. Невъзможна смяна на паролата. notice_account_lost_email_sent: Изпратен ви е e-mail с инструкции за избор на нова парола. notice_account_activated: Профилът ви е активиран. Вече може да влезете в системата. @@ -163,7 +168,7 @@ notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран. Ако смятате, че това не е правилно, обърнете се към администратора за разархивиране. notice_email_sent: "Изпратен e-mail на %{value}" notice_email_error: "Грешка при изпращане на e-mail (%{value})" - notice_feeds_access_key_reseted: Вашия ключ за RSS достъп беше променен. + notice_feeds_access_key_reseted: Вашия ключ за Atom достъп беше променен. notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен. notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}." notice_failed_to_save_time_entries: "Невъзможност за запис на %{count} записа за използвано време от %{total} избрани: %{ids}." @@ -179,6 +184,7 @@ notice_issue_update_conflict: Задачата е била променена от друг потребител, докато вие сте я редактирали. notice_account_deleted: Вашият профил беше премахнат без възможност за възстановяване. notice_user_successful_create: Потребител %{id} е създаден. + notice_new_password_must_be_different: Новата парола трябва да бъде различна от сегашната парола error_can_t_load_default_data: "Грешка при зареждане на началната информация: %{value}" error_scm_not_found: Несъществуващ обект в хранилището. @@ -332,6 +338,8 @@ field_board_parent: Родителски форум field_private_notes: Лични бележки field_inherit_members: Наследяване на членовете на родителския проект + field_generate_password: Генериране на парола + field_must_change_passwd: Паролата трябва да бъде сменена при следващото влизане в Redmine setting_app_title: Заглавие setting_app_subtitle: Описание @@ -402,6 +410,7 @@ setting_non_working_week_days: Не работни дни setting_jsonp_enabled: Разрешаване на поддръжка на JSONP setting_default_projects_tracker_ids: Тракери по подразбиране за нови проекти + setting_mail_handler_excluded_filenames: Имена на прикачени файлове, които да се пропускат при приемане на e-mail-и (например *.vcf, companylogo.gif). permission_add_project: Създаване на проект permission_add_subprojects: Създаване на подпроекти @@ -734,7 +743,7 @@ label_f_hour_plural: "%{value} часа" label_time_tracking: Отделяне на време label_change_plural: Промени - label_statistics: Статистики + label_statistics: Статистика label_commits_per_month: Ревизии по месеци label_commits_per_author: Ревизии по автор label_diff: diff @@ -787,9 +796,9 @@ label_language_based: В зависимост от езика label_sort_by: "Сортиране по %{value}" label_send_test_email: Изпращане на тестов e-mail - label_feeds_access_key: RSS access ключ - label_missing_feeds_access_key: Липсващ RSS ключ за достъп - label_feeds_access_key_created_on: "%{value} от създаването на RSS ключа" + label_feeds_access_key: Atom access ключ + label_missing_feeds_access_key: Липсващ Atom ключ за достъп + label_feeds_access_key_created_on: "%{value} от създаването на Atom ключа" label_module_plural: Модули label_added_time_by: "Публикувана от %{author} преди %{age}" label_updated_time_by: "Обновена от %{author} преди %{age}" @@ -882,6 +891,7 @@ label_fields_permissions: Видимост на полетата label_readonly: Само за четене label_required: Задължително + label_hidden: Скрит label_attribute_of_project: Project's %{name} label_attribute_of_issue: Issue's %{name} label_attribute_of_author: Author's %{name} @@ -893,6 +903,9 @@ label_cross_project_hierarchy: С проектна йерархия label_cross_project_system: С всички проекти label_gantt_progress_line: Линия на изпълнението + label_visibility_private: лични (само за мен) + label_visibility_roles: само за тези роли + label_visibility_public: за всички потребители button_login: Вход button_submit: Изпращане @@ -1004,6 +1017,7 @@ text_file_repository_writable: Възможност за писане в хранилището с файлове text_plugin_assets_writable: Папката на приставките е разрешена за запис text_rmagick_available: Наличен RMagick (по избор) + text_convert_available: Наличен ImageMagick convert (по избор) text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?" text_destroy_time_entries: Изтриване на отделеното време text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект diff -Nru redmine-2.3.3/config/locales/bs.yml redmine-2.4.2/config/locales/bs.yml --- redmine-2.3.3/config/locales/bs.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/bs.yml 2013-12-23 08:48:39.000000000 +0000 @@ -140,6 +140,7 @@ not_same_project: "ne pripada istom projektu" circular_dependency: "Ova relacija stvar cirkularnu zavisnost" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Molimo odaberite @@ -168,7 +169,7 @@ notice_email_error: Došlo je do greške pri slanju emaila (%{value}) notice_email_sent: "Email je poslan %{value}" notice_failed_to_save_issues: "Neuspješno snimanje %{count} aktivnosti na %{total} izabrano: %{ids}." - notice_feeds_access_key_reseted: Vaš RSS pristup je resetovan. + notice_feeds_access_key_reseted: Vaš Atom pristup je resetovan. notice_file_not_found: Stranica kojoj pokušavate da pristupite ne postoji ili je uklonjena. notice_locking_conflict: "Konflikt: podaci su izmjenjeni od strane drugog korisnika." notice_no_issue_selected: "Nijedna aktivnost nije izabrana! Molim, izaberite aktivnosti koje želite za ispravljate." @@ -303,7 +304,7 @@ setting_text_formatting: Formatiranje teksta setting_wiki_compression: Kompresija Wiki istorije - setting_feeds_limit: 'Limit za "RSS" feed-ove' + setting_feeds_limit: 'Limit za "Atom" feed-ove' setting_default_projects_public: Podrazumjeva se da je novi projekat javni setting_autofetch_changesets: 'Automatski kupi "commit"-e' setting_sys_api_enabled: 'Omogući "WS" za upravljanje repozitorijom' @@ -660,7 +661,7 @@ label_language_based: Bazirano na korisnikovom jeziku label_sort_by: "Sortiraj po %{value}" label_send_test_email: Pošalji testni email - label_feeds_access_key_created_on: "RSS pristupni ključ kreiran prije %{value} dana" + label_feeds_access_key_created_on: "Atom pristupni ključ kreiran prije %{value} dana" label_module_plural: Moduli label_added_time_by: "Dodano od %{author} prije %{age}" label_updated_time_by: "Izmjenjeno od %{author} prije %{age}" @@ -886,11 +887,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1095,8 +1096,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Ukupno text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/ca.yml redmine-2.4.2/config/locales/ca.yml --- redmine-2.3.3/config/locales/ca.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/ca.yml 2013-12-23 08:48:39.000000000 +0000 @@ -132,6 +132,7 @@ not_same_project: "no pertany al mateix projecte" circular_dependency: "Aquesta relació crearia una dependència circular" cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Seleccioneu @@ -164,7 +165,7 @@ notice_not_authorized: No teniu permís per a accedir a aquesta pàgina. notice_email_sent: "S'ha enviat un correu electrònic a %{value}" notice_email_error: "S'ha produït un error en enviar el correu (%{value})" - notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS." + notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del Atom." notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API." notice_failed_to_save_issues: "No s'han pogut desar %{count} assumptes de %{total} seleccionats: %{ids}." notice_failed_to_save_members: "No s'han pogut desar els membres: %{errors}." @@ -707,9 +708,9 @@ label_language_based: "Basat en l'idioma de l'usuari" label_sort_by: "Ordena per %{value}" label_send_test_email: Envia un correu electrònic de prova - label_feeds_access_key: "Clau d'accés del RSS" - label_missing_feeds_access_key: "Falta una clau d'accés del RSS" - label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa %{value}" + label_feeds_access_key: "Clau d'accés del Atom" + label_missing_feeds_access_key: "Falta una clau d'accés del Atom" + label_feeds_access_key_created_on: "Clau d'accés del Atom creada fa %{value}" label_module_plural: Mòduls label_added_time_by: "Afegit per %{author} fa %{age}" label_updated_time_by: "Actualitzat per %{author} fa %{age}" @@ -1084,8 +1085,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/cs.yml redmine-2.4.2/config/locales/cs.yml --- redmine-2.3.3/config/locales/cs.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/cs.yml 2013-12-23 08:48:39.000000000 +0000 @@ -1,4 +1,4 @@ -# Update to 2.2 by Karel Picman +# Update to 2.2, 2.4 by Karel Picman # Update to 1.1 by Michal Gebauer # Updated by Josef Liška # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz @@ -134,6 +134,7 @@ not_same_project: "nepatří stejnému projektu" circular_dependency: "Tento vztah by vytvořil cyklickou závislost" cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Prosím vyberte @@ -167,7 +168,7 @@ notice_not_authorized_archived_project: Projekt, ke kterému se snažíte přistupovat, byl archivován. notice_email_sent: "Na adresu %{value} byl odeslán email" notice_email_error: "Při odesílání emailu nastala chyba (%{value})" - notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován. + notice_feeds_access_key_reseted: Váš klíč pro přístup k Atom byl resetován. notice_api_access_key_reseted: Váš API přístupový klíč byl resetován. notice_failed_to_save_issues: "Chyba při uložení %{count} úkolu(ů) z %{total} vybraných: %{ids}." notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}." @@ -720,9 +721,9 @@ label_language_based: Podle výchozího jazyka label_sort_by: "Seřadit podle %{value}" label_send_test_email: Poslat testovací email - label_feeds_access_key: Přístupový klíč pro RSS - label_missing_feeds_access_key: Postrádá přístupový klíč pro RSS - label_feeds_access_key_created_on: "Přístupový klíč pro RSS byl vytvořen před %{value}" + label_feeds_access_key: Přístupový klíč pro Atom + label_missing_feeds_access_key: Postrádá přístupový klíč pro Atom + label_feeds_access_key_created_on: "Přístupový klíč pro Atom byl vytvořen před %{value}" label_module_plural: Moduly label_added_time_by: "Přidáno uživatelem %{author} před %{age}" label_updated_time_by: "Aktualizováno uživatelem %{author} před %{age}" @@ -1089,5 +1090,17 @@ setting_jsonp_enabled: Povolit podporu JSONP field_inherit_members: Zdědit členy field_closed_on: Uzavřeno + field_generate_password: Generovat heslo setting_default_projects_tracker_ids: Výchozí fronta pro nové projekty label_total_time: Celkem + notice_account_not_activated_yet: Neaktivovali jste si dosud Váš účet. + Pro opětovné zaslání aktivačního emailu klikněte na tento odkaz, prosím. + notice_account_locked: Váš účet je uzamčen. + label_hidden: Skrytý + label_visibility_private: pouze pro mě + label_visibility_roles: pouze pro tyto role + label_visibility_public: pro všechny uživatele + field_must_change_passwd: Musí změnit heslo při příštím přihlášení + notice_new_password_must_be_different: Nové heslo se musí lišit od stávajícího + setting_mail_handler_excluded_filenames: Vyřadit přílohy podle jména + text_convert_available: ImageMagick convert k dispozici (volitelné) diff -Nru redmine-2.3.3/config/locales/da.yml redmine-2.4.2/config/locales/da.yml --- redmine-2.3.3/config/locales/da.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/da.yml 2013-12-23 08:48:39.000000000 +0000 @@ -141,6 +141,7 @@ not_same_project: "hører ikke til samme projekt" circular_dependency: "Denne relation vil skabe et afhængighedsforhold" cant_link_an_issue_with_a_descendant: "En sag kan ikke relateres til en af dens underopgaver" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" template: header: @@ -178,7 +179,7 @@ notice_not_authorized: Du har ikke adgang til denne side. notice_email_sent: "En email er sendt til %{value}" notice_email_error: "En fejl opstod under afsendelse af email (%{value})" - notice_feeds_access_key_reseted: Din adgangsnøgle til RSS er nulstillet. + notice_feeds_access_key_reseted: Din adgangsnøgle til Atom er nulstillet. notice_failed_to_save_issues: "Det mislykkedes at gemme %{count} sage(r) på %{total} valgt: %{ids}." notice_no_issue_selected: "Ingen sag er valgt! Vælg venligst hvilke emner du vil rette." notice_account_pending: "Din konto er oprettet, og afventer administrators godkendelse." @@ -582,7 +583,7 @@ label_language_based: Baseret på brugerens sprog label_sort_by: "Sortér efter %{value}" label_send_test_email: Send en test email - label_feeds_access_key_created_on: "RSS adgangsnøgle dannet for %{value} siden" + label_feeds_access_key_created_on: "Atom adgangsnøgle dannet for %{value} siden" label_module_plural: Moduler label_added_time_by: "Tilføjet af %{author} for %{age} siden" label_updated_time: "Opdateret for %{value} siden" @@ -889,11 +890,11 @@ label_revision_id: Revision %{value} label_api_access_key: API nøgle label_api_access_key_created_on: API nøgle genereret %{value} siden - label_feeds_access_key: RSS nøgle + label_feeds_access_key: Atom nøgle notice_api_access_key_reseted: Din API nøgle er nulstillet. setting_rest_api_enabled: Aktiver REST web service label_missing_api_access_key: Mangler en API nøgle - label_missing_feeds_access_key: Mangler en RSS nøgle + label_missing_feeds_access_key: Mangler en Atom nøgle button_show: Vis text_line_separated: Flere væredier tilladt (en linje for hver værdi). setting_mail_handler_body_delimiters: Trunkér emails efter en af disse linjer @@ -1099,8 +1100,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/de.yml redmine-2.4.2/config/locales/de.yml --- redmine-2.3.3/config/locales/de.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/de.yml 2013-12-23 08:48:39.000000000 +0000 @@ -133,7 +133,7 @@ wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)" taken: "ist bereits vergeben" not_a_number: "ist keine Zahl" - not_a_date: "is kein gültiges Datum" + not_a_date: "ist kein gültiges Datum" greater_than: "muss größer als %{count} sein" greater_than_or_equal_to: "muss größer oder gleich %{count} sein" equal_to: "muss genau %{count} sein" @@ -145,6 +145,7 @@ not_same_project: "gehört nicht zum selben Projekt" circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen" cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer Ihrer Unteraufgaben verlinkt werden" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Bitte auswählen @@ -239,6 +240,7 @@ description_query_sort_criteria_direction: Sortierrichtung description_search: Suchfeld description_selected_columns: Ausgewählte Spalten + description_user_mail_notification: Mailbenachrichtigungseinstellung description_wiki_subpages_reassign: Neue Elternseite wählen @@ -309,6 +311,7 @@ field_filesize: Größe field_firstname: Vorname field_fixed_version: Zielversion + field_generate_password: Passwort generieren field_group_by: Gruppiere Ergebnisse nach field_hide_mail: E-Mail-Adresse nicht anzeigen field_homepage: Projekt-Homepage @@ -316,7 +319,7 @@ field_hours: Stunden field_identifier: Kennung field_identity_url: OpenID-URL - field_inherit_members: Benutzer vererben + field_inherit_members: Benutzer erben field_is_closed: Ticket geschlossen field_is_default: Standardeinstellung field_is_filter: Als Filter benutzen @@ -338,6 +341,7 @@ field_member_of_group: Zuständigkeitsgruppe field_min_length: Minimale Länge field_multiple: Mehrere Werte + field_must_change_passwd: Passwort beim nächsten Login ändern field_name: Name field_new_password: Neues Kennwort field_notes: Kommentare @@ -544,6 +548,7 @@ label_group_new: Neue Gruppe label_group_plural: Gruppen label_help: Hilfe + label_hidden: Versteckt label_history: Historie label_home: Hauptseite label_in: in @@ -743,6 +748,7 @@ label_today: heute label_topic_plural: Themen label_total: Gesamtzahl + label_total_time: Gesamtzeit label_tracker: Tracker label_tracker_new: Neuer Tracker label_tracker_plural: Tracker @@ -759,7 +765,7 @@ label_user_mail_option_only_assigned: Nur für Aufgaben für die ich zuständig bin label_user_mail_option_only_my_events: Nur für Aufgaben die ich beobachte oder an welchen ich mitarbeite label_user_mail_option_only_owner: Nur für Aufgaben die ich angelegt habe - label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten..." + label_user_mail_option_selected: "Für alle Ereignisse in den ausgewählten Projekten" label_user_new: Neuer Benutzer label_user_plural: Benutzer label_user_search: "Nach Benutzer suchen:" @@ -774,6 +780,9 @@ label_view_all_revisions: Alle Revisionen anzeigen label_view_diff: Unterschiede anzeigen label_view_revisions: Revisionen anzeigen + label_visibility_private: nur für mich + label_visibility_public: für jeden Benutzer + label_visibility_roles: nur für diese Rollen label_watched_issues: Beobachtete Tickets label_week: Woche label_wiki: Wiki @@ -830,9 +839,11 @@ notice_account_deleted: Ihr Benutzerkonto wurde unwiderruflich gelöscht. notice_account_invalid_creditentials: Benutzer oder Kennwort ist ungültig. notice_account_lost_email_sent: Eine E-Mail mit Anweisungen, ein neues Kennwort zu wählen, wurde Ihnen geschickt. + notice_account_locked: Ihr Konto ist gesperrt. + notice_account_not_activated_yet: Sie haben Ihr Konto noch nicht aktiviert. Wenn Sie die Aktivierungsmail erneut erhalten wollen, klicken Sie bitte hier. notice_account_password_updated: Kennwort wurde erfolgreich aktualisiert. notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators." - notice_account_register_done: Konto wurde erfolgreich angelegt. + notice_account_register_done: Konto wurde erfolgreich angelegt. Eine E-Mail mit weiteren Instruktionen zur Kontoaktivierung wurde an %{email} gesendet. notice_account_unknown_email: Unbekannter Benutzer. notice_account_updated: Konto wurde erfolgreich aktualisiert. notice_account_wrong_password: Falsches Kennwort. @@ -849,8 +860,10 @@ notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max}) notice_issue_done_ratios_updated: Der Ticket-Fortschritt wurde aktualisiert. notice_issue_successful_create: Ticket %{id} erstellt. - notice_issue_update_conflict: Das Ticket wurde von einem anderen Nutzer überarbeitet während Ihrer Bearbeitung. + notice_issue_update_conflict: Das Ticket wurde während Ihrer Bearbeitung von einem anderen Nutzer überarbeitet. notice_locking_conflict: Datum wurde von einem anderen Benutzer geändert. + notice_new_password_must_be_different: Das neue Passwort muss sich vom dem aktuellen + unterscheiden notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten." notice_not_authorized: Sie sind nicht berechtigt, auf diese Seite zuzugreifen. notice_not_authorized_archived_project: Das Projekt wurde archiviert und ist daher nicht nicht verfügbar. @@ -984,6 +997,7 @@ setting_mail_handler_api_enabled: Abruf eingehender E-Mails aktivieren setting_mail_handler_api_key: API-Schlüssel setting_mail_handler_body_delimiters: "Schneide E-Mails nach einer dieser Zeilen ab" + setting_mail_handler_excluded_filenames: Anhänge nach Namen ausschließen setting_new_project_user_role_id: Rolle, die einem Nicht-Administrator zugeordnet wird, der ein Projekt erstellt setting_non_working_week_days: Arbeitsfreie Tage setting_openid: Erlaube OpenID-Anmeldung und -Registrierung @@ -1020,6 +1034,7 @@ text_caracters_maximum: "Max. %{count} Zeichen." text_caracters_minimum: "Muss mindestens %{count} Zeichen lang sein." text_comma_separated: Mehrere Werte erlaubt (durch Komma getrennt). + text_convert_available: ImageMagick Konvertierung verfügbar (optional) text_custom_field_possible_values_info: 'Eine Zeile pro Wert' text_default_administrator_account_changed: Administrator-Kennwort geändert text_destroy_time_entries: Gebuchte Aufwände löschen @@ -1051,7 +1066,7 @@ text_load_default_configuration: Standard-Konfiguration laden text_mercurial_repository_note: Lokales repository (e.g. /hgrepo, c:\hgrepo) text_min_max_length_info: 0 heißt keine Beschränkung - text_no_configuration_data: "Rollen, Tracker, Ticket-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie sie abändern." + text_no_configuration_data: "Rollen, Tracker, Ticket-Status und Workflows wurden noch nicht konfiguriert.\nEs ist sehr zu empfehlen, die Standard-Konfiguration zu laden. Sobald sie geladen ist, können Sie diese abändern." text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?" text_plugin_assets_writable: Verzeichnis für Plugin-Assets beschreibbar text_project_closed: Dieses Projekt ist geschlossen und kann nicht bearbeitet werden. @@ -1098,4 +1113,3 @@ version_status_open: offen warning_attachments_not_saved: "%{count} Datei(en) konnten nicht gespeichert werden." - label_total_time: Gesamtzeit diff -Nru redmine-2.3.3/config/locales/el.yml redmine-2.4.2/config/locales/el.yml --- redmine-2.3.3/config/locales/el.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/el.yml 2013-12-23 08:48:39.000000000 +0000 @@ -130,6 +130,7 @@ not_same_project: "δεν ανήκει στο ίδιο έργο" circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Παρακαλώ επιλέξτε @@ -162,7 +163,7 @@ notice_not_authorized: Δεν έχετε δικαίωμα πρόσβασης σε αυτή τη σελίδα. notice_email_sent: "Ένα μήνυμα ηλεκτρονικού ταχυδρομείου εστάλη στο %{value}" notice_email_error: "Σφάλμα κατά την αποστολή του μηνύματος στο (%{value})" - notice_feeds_access_key_reseted: Έγινε επαναφορά στο κλειδί πρόσβασης RSS. + notice_feeds_access_key_reseted: Έγινε επαναφορά στο κλειδί πρόσβασης Atom. notice_failed_to_save_issues: "Αποτυχία αποθήκευσης %{count} θεμα(των) από τα %{total} επιλεγμένα: %{ids}." notice_no_issue_selected: "Κανένα θέμα δεν είναι επιλεγμένο! Παρακαλούμε, ελέγξτε τα θέματα που θέλετε να επεξεργαστείτε." notice_account_pending: "Ο λογαριασμός σας έχει δημιουργηθεί και είναι σε στάδιο έγκρισης από τον διαχειριστή." @@ -663,7 +664,7 @@ label_language_based: Με βάση τη γλώσσα του χρήστη label_sort_by: "Ταξινόμηση ανά %{value}" label_send_test_email: Αποστολή δοκιμαστικού email - label_feeds_access_key_created_on: "το κλειδί πρόσβασης RSS δημιουργήθηκε πριν από %{value}" + label_feeds_access_key_created_on: "το κλειδί πρόσβασης Atom δημιουργήθηκε πριν από %{value}" label_module_plural: Μονάδες label_added_time_by: "Προστέθηκε από τον %{author} πριν από %{age}" label_updated_time_by: "Ενημερώθηκε από τον %{author} πριν από %{age}" @@ -873,11 +874,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1082,8 +1083,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Σύνολο text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/en-GB.yml redmine-2.4.2/config/locales/en-GB.yml --- redmine-2.3.3/config/locales/en-GB.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/en-GB.yml 2013-12-23 08:48:39.000000000 +0000 @@ -133,6 +133,7 @@ not_same_project: "doesn't belong to the same project" circular_dependency: "This relation would create a circular dependency" cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Please select @@ -151,7 +152,7 @@ notice_account_invalid_creditentials: Invalid user or password notice_account_password_updated: Password was successfully updated. notice_account_wrong_password: Wrong password - notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. + notice_account_register_done: Account was successfully created. An email containing the instructions to activate your account was sent to %{email}. notice_account_unknown_email: Unknown user. notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. @@ -166,7 +167,7 @@ notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_email_sent: "An email was sent to %{value}" notice_email_error: "An error occurred while sending mail (%{value})" - notice_feeds_access_key_reseted: Your RSS access key was reset. + notice_feeds_access_key_reseted: Your Atom access key was reset. notice_api_access_key_reseted: Your API access key was reset. notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." notice_failed_to_save_members: "Failed to save member(s): %{errors}." @@ -727,9 +728,9 @@ label_language_based: Based on user's language label_sort_by: "Sort by %{value}" label_send_test_email: Send a test email - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS access key created %{value} ago" + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom access key created %{value} ago" label_module_plural: Modules label_added_time_by: "Added by %{author} %{age} ago" label_updated_time_by: "Updated by %{author} %{age} ago" @@ -1087,5 +1088,18 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/en.yml redmine-2.4.2/config/locales/en.yml --- redmine-2.3.3/config/locales/en.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/en.yml 2013-12-23 08:48:39.000000000 +0000 @@ -129,6 +129,7 @@ not_same_project: "doesn't belong to the same project" circular_dependency: "This relation would create a circular dependency" cant_link_an_issue_with_a_descendant: "An issue cannot be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Please select @@ -147,8 +148,10 @@ notice_account_invalid_creditentials: Invalid user or password notice_account_password_updated: Password was successfully updated. notice_account_wrong_password: Wrong password - notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you. + notice_account_register_done: Account was successfully created. An email containing the instructions to activate your account was sent to %{email}. notice_account_unknown_email: Unknown user. + notice_account_not_activated_yet: You haven't activated your account yet. If you want to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password. notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you. notice_account_activated: Your account has been activated. You can now log in. @@ -162,7 +165,7 @@ notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_email_sent: "An email was sent to %{value}" notice_email_error: "An error occurred while sending mail (%{value})" - notice_feeds_access_key_reseted: Your RSS access key was reset. + notice_feeds_access_key_reseted: Your Atom access key was reset. notice_api_access_key_reseted: Your API access key was reset. notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." @@ -178,6 +181,7 @@ notice_issue_update_conflict: "The issue has been updated by an other user while you were editing it." notice_account_deleted: "Your account has been permanently deleted." notice_user_successful_create: "User %{id} created." + notice_new_password_must_be_different: The new password must be different from the current password error_can_t_load_default_data: "Default configuration could not be loaded: %{value}" error_scm_not_found: "The entry or revision was not found in the repository." @@ -331,6 +335,8 @@ field_board_parent: Parent forum field_private_notes: Private notes field_inherit_members: Inherit members + field_generate_password: Generate password + field_must_change_passwd: Must change password at next logon setting_app_title: Application title setting_app_subtitle: Application subtitle @@ -401,6 +407,7 @@ setting_non_working_week_days: Non-working days setting_jsonp_enabled: Enable JSONP support setting_default_projects_tracker_ids: Default trackers for new projects + setting_mail_handler_excluded_filenames: Exclude attachments by name permission_add_project: Create project permission_add_subprojects: Create subprojects @@ -786,9 +793,9 @@ label_language_based: Based on user's language label_sort_by: "Sort by %{value}" label_send_test_email: Send a test email - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS access key created %{value} ago" + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom access key created %{value} ago" label_module_plural: Modules label_added_time_by: "Added by %{author} %{age} ago" label_updated_time_by: "Updated by %{author} %{age} ago" @@ -881,6 +888,7 @@ label_fields_permissions: Fields permissions label_readonly: Read-only label_required: Required + label_hidden: Hidden label_attribute_of_project: "Project's %{name}" label_attribute_of_issue: "Issue's %{name}" label_attribute_of_author: "Author's %{name}" @@ -892,6 +900,9 @@ label_cross_project_hierarchy: With project hierarchy label_cross_project_system: With all projects label_gantt_progress_line: Progress line + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users button_login: Login button_submit: Submit @@ -1003,6 +1014,7 @@ text_file_repository_writable: Attachments directory writable text_plugin_assets_writable: Plugin assets directory writable text_rmagick_available: RMagick available (optional) + text_convert_available: ImageMagick convert available (optional) text_destroy_time_entries_question: "%{hours} hours were reported on the issues you are about to delete. What do you want to do?" text_destroy_time_entries: Delete reported hours text_assign_time_entries_to_project: Assign reported hours to the project diff -Nru redmine-2.3.3/config/locales/es.yml redmine-2.4.2/config/locales/es.yml --- redmine-2.3.3/config/locales/es.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/es.yml 2013-12-23 08:48:39.000000000 +0000 @@ -136,6 +136,7 @@ not_same_project: "no pertenece al mismo proyecto" circular_dependency: "Esta relación podría crear una dependencia circular" cant_link_an_issue_with_a_descendant: "Esta petición no puede ser ligada a una de estas tareas" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" # Append your own errors here or at the model/attributes scope. @@ -451,7 +452,7 @@ label_f_hour: "%{value} hora" label_f_hour_plural: "%{value} horas" label_feed_plural: Feeds - label_feeds_access_key_created_on: "Clave de acceso por RSS creada hace %{value}" + label_feeds_access_key_created_on: "Clave de acceso por Atom creada hace %{value}" label_file_added: Fichero añadido label_file_plural: Archivos label_filter_add: Añadir el filtro @@ -679,7 +680,7 @@ notice_email_error: "Ha ocurrido un error mientras enviando el correo (%{value})" notice_email_sent: "Se ha enviado un correo a %{value}" notice_failed_to_save_issues: "Imposible grabar %{count} peticion(es) de %{total} seleccionada(s): %{ids}." - notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada. + notice_feeds_access_key_reseted: Su clave de acceso para Atom ha sido reiniciada. notice_file_not_found: La página a la que intenta acceder no existe. notice_locking_conflict: Los datos han sido modificados por otro usuario. notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar" @@ -910,11 +911,11 @@ label_revision_id: Revisión %{value} label_api_access_key: Clave de acceso de la API label_api_access_key_created_on: Clave de acceso de la API creada hace %{value} - label_feeds_access_key: Clave de acceso RSS + label_feeds_access_key: Clave de acceso Atom notice_api_access_key_reseted: Clave de acceso a la API regenerada. setting_rest_api_enabled: Activar servicio web REST label_missing_api_access_key: Clave de acceso a la API ausente - label_missing_feeds_access_key: Clave de accesso RSS ausente + label_missing_feeds_access_key: Clave de accesso Atom ausente button_show: Mostrar text_line_separated: Múltiples valores permitidos (un valor en cada línea). setting_mail_handler_body_delimiters: Truncar correos tras una de estas líneas @@ -1121,5 +1122,17 @@ setting_jsonp_enabled: Habilitar soporte de JSONP field_inherit_members: Heredar miembros field_closed_on: Cerrada + field_generate_password: Generar contraseña setting_default_projects_tracker_ids: Tipos de petición habilitados por defecto label_total_time: Total + notice_account_not_activated_yet: No ha activado su cuenta aún. Si quiere + recibir un nuevo correo de activación, por favor haga clic en este enlace. + notice_account_locked: Su cuenta está bloqueada. + label_hidden: Oculto + label_visibility_private: solamente para mí + label_visibility_roles: solamente para estos roles + label_visibility_public: para cualquier usuario + field_must_change_passwd: Cambiar contraseña en el próximo inicio de sesión + notice_new_password_must_be_different: La nueva contraseña debe ser diferente de la actual + setting_mail_handler_excluded_filenames: Excluir adjuntos por nombre + text_convert_available: Conversión ImageMagick disponible (opcional) diff -Nru redmine-2.3.3/config/locales/et.yml redmine-2.4.2/config/locales/et.yml --- redmine-2.3.3/config/locales/et.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/et.yml 2013-12-23 08:48:39.000000000 +0000 @@ -146,6 +146,7 @@ not_same_project: "ei kuulu sama projekti juurde" circular_dependency: "See suhe looks vastastikuse sõltuvuse" cant_link_an_issue_with_a_descendant: "Teemat ei saa sidustada tema enda alamteemaga" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: "Palun vali" @@ -179,7 +180,7 @@ notice_not_authorized_archived_project: "See projekt on arhiveeritud." notice_email_sent: "%{value}-le saadeti kiri" notice_email_error: "Kirja saatmisel tekkis viga (%{value})" - notice_feeds_access_key_reseted: "Sinu RSS juurdepääsuvõti nulliti." + notice_feeds_access_key_reseted: "Sinu Atom juurdepääsuvõti nulliti." notice_api_access_key_reseted: "Sinu API juurdepääsuvõti nulliti." notice_failed_to_save_issues: "%{count} teemat %{total}-st ei õnnestunud salvestada: %{ids}." notice_failed_to_save_time_entries: "%{count} ajakulu kannet %{total}-st ei õnnestunud salvestada: %{ids}." @@ -772,9 +773,9 @@ label_language_based: "Kasutaja keele põhjal" label_sort_by: "Sorteeri %{value} järgi" label_send_test_email: "Saada kontrollkiri" - label_feeds_access_key: "RSS juurdepääsuvõti" - label_missing_feeds_access_key: "RSS juurdepääsuvõti on puudu" - label_feeds_access_key_created_on: "RSS juurdepääsuvõti loodi %{value} tagasi" + label_feeds_access_key: "Atom juurdepääsuvõti" + label_missing_feeds_access_key: "Atom juurdepääsuvõti on puudu" + label_feeds_access_key_created_on: "Atom juurdepääsuvõti loodi %{value} tagasi" label_module_plural: "Moodulid" label_added_time_by: "Lisatud %{author} poolt %{age} tagasi" label_updated_time_by: "Uuendatud %{author} poolt %{age} tagasi" @@ -1098,5 +1099,18 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: "Kokku" + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/eu.yml redmine-2.4.2/config/locales/eu.yml --- redmine-2.3.3/config/locales/eu.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/eu.yml 2013-12-23 08:48:39.000000000 +0000 @@ -131,6 +131,7 @@ not_same_project: "ez dago proiektu berdinean" circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke" cant_link_an_issue_with_a_descendant: "Zeregin bat ezin da bere azpiataza batekin estekatu." + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Hautatu mesedez @@ -163,7 +164,7 @@ notice_not_authorized: Ez duzu orri hau atzitzeko baimenik. notice_email_sent: "%{value} helbidera eposta bat bidali da" notice_email_error: "Errorea eposta bidaltzean (%{value})" - notice_feeds_access_key_reseted: Zure RSS atzipen giltza berrezarri da. + notice_feeds_access_key_reseted: Zure Atom atzipen giltza berrezarri da. notice_api_access_key_reseted: Zure API atzipen giltza berrezarri da. notice_failed_to_save_issues: "Hautatutako %{total} zereginetatik %{count} ezin izan dira konpondu: %{ids}." notice_no_issue_selected: "Ez da zereginik hautatu! Mesedez, editatu nahi dituzun arazoak markatu." @@ -687,9 +688,9 @@ label_language_based: Erabiltzailearen hizkuntzaren arabera label_sort_by: "Ordenazioa: %{value}" label_send_test_email: Frogako mezua bidali - label_feeds_access_key: RSS atzipen giltza - label_missing_feeds_access_key: RSS atzipen giltza falta da - label_feeds_access_key_created_on: "RSS atzipen giltza orain dela %{value} sortuta" + label_feeds_access_key: Atom atzipen giltza + label_missing_feeds_access_key: Atom atzipen giltza falta da + label_feeds_access_key_created_on: "Atom atzipen giltza orain dela %{value} sortuta" label_module_plural: Moduluak label_added_time_by: "%{author}, orain dela %{age} gehituta" label_updated_time_by: "%{author}, orain dela %{age} eguneratuta" @@ -1084,7 +1085,20 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Guztira text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/fa.yml redmine-2.4.2/config/locales/fa.yml --- redmine-2.3.3/config/locales/fa.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/fa.yml 2013-12-23 08:48:39.000000000 +0000 @@ -129,6 +129,7 @@ not_same_project: "به همان پروژه وابسته نیست" circular_dependency: "این وابستگی یک وابستگی دایره وار خواهد ساخت" cant_link_an_issue_with_a_descendant: "یک پیامد نمی‌تواند به یکی از زیر کارهایش پیوند بخورد" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: گزینش کنید @@ -162,7 +163,7 @@ notice_not_authorized_archived_project: پروژه درخواستی شما بایگانی شده است. notice_email_sent: "یک ایمیل به %{value} فرستاده شد." notice_email_error: "یک ایراد در فرستادن ایمیل پیش آمد (%{value})." - notice_feeds_access_key_reseted: کلید دسترسی RSS شما بازنشانی شد. + notice_feeds_access_key_reseted: کلید دسترسی Atom شما بازنشانی شد. notice_api_access_key_reseted: کلید دسترسی API شما بازنشانی شد. notice_failed_to_save_issues: "ذخیره سازی %{count} پیامد از %{total} پیامد گزینش شده شکست خورد: %{ids}." notice_failed_to_save_members: "ذخیره سازی اعضا شکست خورد: %{errors}." @@ -715,9 +716,9 @@ label_language_based: بر اساس زبان کاربر label_sort_by: "جور کرد با %{value}" label_send_test_email: فرستادن ایمیل آزمایشی - label_feeds_access_key: کلید دسترسی RSS - label_missing_feeds_access_key: کلید دسترسی RSS در دسترس نیست - label_feeds_access_key_created_on: "کلید دسترسی RSS %{value} پیش ساخته شده است" + label_feeds_access_key: کلید دسترسی Atom + label_missing_feeds_access_key: کلید دسترسی Atom در دسترس نیست + label_feeds_access_key_created_on: "کلید دسترسی Atom %{value} پیش ساخته شده است" label_module_plural: پیمانه label_added_time_by: "افزوده شده به دست %{author} در %{age} پیش" label_updated_time_by: "بروز شده به دست %{author} در %{age} پیش" @@ -1085,7 +1086,20 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: جمله text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/fi.yml redmine-2.4.2/config/locales/fi.yml --- redmine-2.3.3/config/locales/fi.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/fi.yml 2013-12-23 08:48:39.000000000 +0000 @@ -154,6 +154,7 @@ not_same_project: "ei kuulu samaan projektiin" circular_dependency: "Tämä suhde loisi kehän." cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Valitse, ole hyvä @@ -186,7 +187,7 @@ notice_not_authorized: Sinulla ei ole oikeutta näyttää tätä sivua. notice_email_sent: "Sähköposti on lähetty osoitteeseen %{value}" notice_email_error: "Sähköpostilähetyksessä tapahtui virhe (%{value})" - notice_feeds_access_key_reseted: RSS salasana on nollaantunut. + notice_feeds_access_key_reseted: Atom salasana on nollaantunut. notice_failed_to_save_issues: "%{count} Tapahtum(an/ien) tallennus epäonnistui %{total} valitut: %{ids}." notice_no_issue_selected: "Tapahtumia ei ole valittu! Valitse tapahtumat joita haluat muokata." notice_account_pending: "Tilisi on luotu ja odottaa ylläpitäjän hyväksyntää." @@ -563,7 +564,7 @@ label_language_based: Pohjautuen käyttäjän kieleen label_sort_by: "Lajittele %{value}" label_send_test_email: Lähetä testi sähköposti - label_feeds_access_key_created_on: "RSS salasana luotiin %{value} sitten" + label_feeds_access_key_created_on: "Atom salasana luotiin %{value} sitten" label_module_plural: Moduulit label_added_time_by: "Lisännyt %{author} %{age} sitten" label_updated_time: "Päivitetty %{value} sitten" @@ -894,11 +895,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1103,8 +1104,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Yhteensä text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/fr.yml redmine-2.4.2/config/locales/fr.yml --- redmine-2.3.3/config/locales/fr.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/fr.yml 2013-12-23 08:48:39.000000000 +0000 @@ -146,6 +146,7 @@ not_same_project: "n'appartient pas au même projet" circular_dependency: "Cette relation créerait une dépendance circulaire" cant_link_an_issue_with_a_descendant: "Une demande ne peut pas être liée à l'une de ses sous-tâches" + earlier_than_minimum_start_date: "ne peut pas être antérieure au %{date} à cause des demandes qui précédent" actionview_instancetag_blank_option: Choisir @@ -164,8 +165,10 @@ notice_account_invalid_creditentials: Identifiant ou mot de passe invalide. notice_account_password_updated: Mot de passe mis à jour avec succès. notice_account_wrong_password: Mot de passe incorrect - notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé. + notice_account_register_done: Un message contenant les instructions pour activer votre compte vous a été envoyé à l'adresse %{email}. notice_account_unknown_email: Aucun compte ne correspond à cette adresse. + notice_account_not_activated_yet: Vous n'avez pas encore activé votre compte. Si vous voulez recevoir un nouveau message d'activation, veuillez cliquer sur ce lien. + notice_account_locked: Votre compte est verrouillé. notice_can_t_change_password: Ce compte utilise une authentification externe. Impossible de changer le mot de passe. notice_account_lost_email_sent: Un message contenant les instructions pour choisir un nouveau mot de passe vous a été envoyé. notice_account_activated: Votre compte a été activé. Vous pouvez à présent vous connecter. @@ -179,7 +182,7 @@ notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé. notice_email_sent: "Un email a été envoyé à %{value}" notice_email_error: "Erreur lors de l'envoi de l'email (%{value})" - notice_feeds_access_key_reseted: "Votre clé d'accès aux flux RSS a été réinitialisée." + notice_feeds_access_key_reseted: "Votre clé d'accès aux flux Atom a été réinitialisée." notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}." notice_failed_to_save_time_entries: "%{count} temps passé(s) sur les %{total} sélectionnés n'ont pas pu être mis à jour: %{ids}." notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour." @@ -193,6 +196,7 @@ notice_issue_update_conflict: "La demande a été mise à jour par un autre utilisateur pendant que vous la modifiez." notice_account_deleted: "Votre compte a été définitivement supprimé." notice_user_successful_create: "Utilisateur %{id} créé." + notice_new_password_must_be_different: Votre nouveau mot de passe doit être différent de votre mot de passe actuel error_can_t_load_default_data: "Une erreur s'est produite lors du chargement du paramétrage : %{value}" error_scm_not_found: "L'entrée et/ou la révision demandée n'existe pas dans le dépôt." @@ -331,6 +335,8 @@ field_board_parent: Forum parent field_private_notes: Notes privées field_inherit_members: Hériter les membres + field_generate_password: Générer un mot de passe + field_must_change_passwd: Doit changer de mot de passe à la prochaine connexion setting_app_title: Titre de l'application setting_app_subtitle: Sous-titre de l'application @@ -398,6 +404,7 @@ setting_non_working_week_days: Jours non travaillés setting_jsonp_enabled: Activer le support JSONP setting_default_projects_tracker_ids: Trackers par défaut pour les nouveaux projets + setting_mail_handler_excluded_filenames: Exclure les fichiers attachés par leur nom permission_add_project: Créer un projet permission_add_subprojects: Créer des sous-projets @@ -711,7 +718,7 @@ label_index_by_date: Index par date label_current_version: Version actuelle label_preview: Prévisualisation - label_feed_plural: Flux RSS + label_feed_plural: Flux Atom label_changes_details: Détails de tous les changements label_issue_tracking: Suivi des demandes label_spent_time: Temps passé @@ -769,7 +776,7 @@ label_language_based: Basé sur la langue de l'utilisateur label_sort_by: "Trier par %{value}" label_send_test_email: Envoyer un email de test - label_feeds_access_key_created_on: "Clé d'accès RSS créée il y a %{value}" + label_feeds_access_key_created_on: "Clé d'accès Atom créée il y a %{value}" label_module_plural: Modules label_added_time_by: "Ajouté par %{author} il y a %{age}" label_updated_time_by: "Mis à jour par %{author} il y a %{age}" @@ -831,9 +838,9 @@ label_display_used_statuses_only: N'afficher que les statuts utilisés dans ce tracker label_api_access_key: Clé d'accès API label_api_access_key_created_on: Clé d'accès API créée il y a %{value} - label_feeds_access_key: Clé d'accès RSS + label_feeds_access_key: Clé d'accès Atom label_missing_api_access_key: Clé d'accès API manquante - label_missing_feeds_access_key: Clé d'accès RSS manquante + label_missing_feeds_access_key: Clé d'accès Atom manquante label_close_versions: Fermer les versions terminées label_revision_id: Révision %{value} label_profile: Profil @@ -857,6 +864,7 @@ label_fields_permissions: Permissions sur les champs label_readonly: Lecture label_required: Obligatoire + label_hidden: Caché label_attribute_of_project: "%{name} du projet" label_attribute_of_issue: "%{name} de la demande" label_attribute_of_author: "%{name} de l'auteur" @@ -868,6 +876,9 @@ label_cross_project_hierarchy: Avec toute la hiérarchie label_cross_project_system: Avec tous les projets label_gantt_progress_line: Ligne de progression + label_visibility_private: par moi uniquement + label_visibility_roles: par ces roles uniquement + label_visibility_public: par tout le monde button_login: Connexion button_submit: Soumettre @@ -943,7 +954,7 @@ text_tip_issue_begin_day: tâche commençant ce jour text_tip_issue_end_day: tâche finissant ce jour text_tip_issue_begin_end_day: tâche commençant et finissant ce jour - text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et underscore sont autorisés, doit commencer par une minuscule.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + text_project_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés, doit commencer par une minuscule.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' text_caracters_maximum: "%{count} caractères maximum." text_caracters_minimum: "%{count} caractères minimum." text_length_between: "Longueur comprise entre %{min} et %{max} caractères." @@ -1099,4 +1110,5 @@ error_scm_annotate_big_text_file: Cette entrée ne peut pas être annotée car elle excède la taille maximale. setting_repositories_encodings: Encodages des fichiers et des dépôts label_search_for_watchers: Rechercher des observateurs - text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et underscore sont autorisés.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.
    Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' + text_convert_available: Binaire convert de ImageMagick présent (optionel) diff -Nru redmine-2.3.3/config/locales/gl.yml redmine-2.4.2/config/locales/gl.yml --- redmine-2.3.3/config/locales/gl.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/gl.yml 2013-12-23 08:48:39.000000000 +0000 @@ -156,6 +156,7 @@ not_same_project: "non pertence ao mesmo proxecto" circular_dependency: "Esta relación podería crear unha dependencia circular" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Por favor seleccione @@ -426,7 +427,7 @@ label_f_hour: "%{value} hora" label_f_hour_plural: "%{value} horas" label_feed_plural: Feeds - label_feeds_access_key_created_on: "Clave de acceso por RSS creada fai %{value}" + label_feeds_access_key_created_on: "Clave de acceso por Atom creada fai %{value}" label_file_added: Arquivo engadido label_file_plural: Arquivos label_filter_add: Engadir o filtro @@ -654,7 +655,7 @@ notice_email_error: "Ocorreu un error enviando o correo (%{value})" notice_email_sent: "Enviouse un correo a %{value}" notice_failed_to_save_issues: "Imposible gravar %{count} petición(s) de %{total} seleccionada(s): %{ids}." - notice_feeds_access_key_reseted: A súa clave de acceso para RSS reiniciouse. + notice_feeds_access_key_reseted: A súa clave de acceso para Atom reiniciouse. notice_file_not_found: A páxina á que tenta acceder non existe. notice_locking_conflict: Os datos modificáronse por outro usuario. notice_no_issue_selected: "Ningunha petición seleccionada. Por favor, comprobe a petición que quere modificar" @@ -884,11 +885,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1093,8 +1094,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/he.yml redmine-2.4.2/config/locales/he.yml --- redmine-2.3.3/config/locales/he.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/he.yml 2013-12-23 08:48:39.000000000 +0000 @@ -134,6 +134,7 @@ not_same_project: "לא שייך לאותו הפרויקט" circular_dependency: "קשר זה יצור תלות מעגלית" cant_link_an_issue_with_a_descendant: "לא ניתן לקשר נושא לתת־משימה שלו" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: בחר בבקשה @@ -167,7 +168,7 @@ notice_not_authorized_archived_project: הפרויקט שאתה מנסה לגשת אליו נמצא בארכיון. notice_email_sent: "דואל נשלח לכתובת %{value}" notice_email_error: "ארעה שגיאה בעת שליחת הדואל (%{value})" - notice_feeds_access_key_reseted: מפתח ה־RSS שלך אופס. + notice_feeds_access_key_reseted: מפתח ה־Atom שלך אופס. notice_api_access_key_reseted: מפתח הגישה שלך ל־API אופס. notice_failed_to_save_issues: "נכשרת בשמירת %{count} נושאים ב %{total} נבחרו: %{ids}." notice_failed_to_save_members: "כשלון בשמירת חבר(ים): %{errors}." @@ -712,9 +713,9 @@ label_language_based: מבוסס שפה label_sort_by: "מיין לפי %{value}" label_send_test_email: שלח דוא"ל בדיקה - label_feeds_access_key: מפתח גישה ל־RSS - label_missing_feeds_access_key: חסר מפתח גישה ל־RSS - label_feeds_access_key_created_on: "מפתח הזנת RSS נוצר לפני%{value}" + label_feeds_access_key: מפתח גישה ל־Atom + label_missing_feeds_access_key: חסר מפתח גישה ל־Atom + label_feeds_access_key_created_on: "מפתח הזנת Atom נוצר לפני%{value}" label_module_plural: מודולים label_added_time_by: 'נוסף ע"י %{author} לפני %{age}' label_updated_time_by: 'עודכן ע"י %{author} לפני %{age}' @@ -1087,8 +1088,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: סה"כ text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/hr.yml redmine-2.4.2/config/locales/hr.yml --- redmine-2.3.3/config/locales/hr.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/hr.yml 2013-12-23 08:48:39.000000000 +0000 @@ -9,12 +9,12 @@ short: "%b %d" long: "%B %d, %Y" - day_names: [Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota, Nedjelja] + day_names: [Nedjelja, Ponedjeljak, Utorak, Srijeda, Četvrtak, Petak, Subota] abbr_day_names: [Ned, Pon, Uto, Sri, Čet, Pet, Sub] # Don't forget the nil at the beginning; there's no such thing as a 0th month - month_names: [~, Sijecanj, Veljaca, Ožujak, Travanj, Svibanj, Lipanj, Srpanj, Kolovoz, Rujan, Listopad, Studeni, Prosinac] - abbr_month_names: [~, Sij, Velj, Ožu, Tra, Svi, Lip, Srp, Kol, Ruj, List, Stu, Pro] + month_names: [~, Siječanj, Veljača, Ožujak, Travanj, Svibanj, Lipanj, Srpanj, Kolovoz, Rujan, Listopad, Studeni, Prosinac] + abbr_month_names: [~, Sij, Velj, Ožu, Tra, Svi, Lip, Srp, Kol, Ruj, Lis, Stu, Pro] # Used in date_select and datime_select. order: - :year @@ -124,6 +124,7 @@ not_same_project: "ne pripada istom projektu" circular_dependency: "Ovaj relacija stvara kružnu ovisnost" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Molimo odaberite @@ -156,7 +157,7 @@ notice_not_authorized: Niste ovlašteni za pristup ovoj stranici. notice_email_sent: E-mail je poslan %{value}" notice_email_error: Dogodila se pogreška tijekom slanja E-maila (%{value})" - notice_feeds_access_key_reseted: Vaš RSS pristup je resetovan. + notice_feeds_access_key_reseted: Vaš Atom pristup je resetovan. notice_api_access_key_reseted: Vaš API pristup je resetovan. notice_failed_to_save_issues: "Neuspjelo spremanje %{count} predmeta na %{total} odabrane: %{ids}." notice_no_issue_selected: "Niti jedan predmet nije odabran! Molim, odaberite predmete koje želite urediti." @@ -678,9 +679,9 @@ label_language_based: Zasnovano na jeziku label_sort_by: "Uredi po %{value}" label_send_test_email: Pošalji testno E-pismo - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS kljuc za pristup je napravljen prije %{value}" + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom kljuc za pristup je napravljen prije %{value}" label_module_plural: Moduli label_added_time_by: "Promijenio %{author} prije %{age}" label_updated_time_by: "Dodao/la %{author} prije %{age}" @@ -1083,8 +1084,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Ukupno text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/hu.yml redmine-2.4.2/config/locales/hu.yml --- redmine-2.3.3/config/locales/hu.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/hu.yml 2013-12-23 08:48:39.000000000 +0000 @@ -150,6 +150,7 @@ not_same_project: "nem azonos projekthez tartozik" circular_dependency: "Ez a kapcsolat egy körkörös függőséget eredményez" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Kérem válasszon @@ -182,7 +183,7 @@ notice_not_authorized: Nincs hozzáférési engedélye ehhez az oldalhoz. notice_email_sent: "Egy e-mail üzenetet küldtünk a következő címre %{value}" notice_email_error: "Hiba történt a levél küldése közben (%{value})" - notice_feeds_access_key_reseted: Az RSS hozzáférési kulcsát újra generáltuk. + notice_feeds_access_key_reseted: Az Atom hozzáférési kulcsát újra generáltuk. notice_failed_to_save_issues: "Nem sikerült a %{count} feladat(ok) mentése a %{total} -ban kiválasztva: %{ids}." notice_no_issue_selected: "Nincs feladat kiválasztva! Kérem jelölje meg melyik feladatot szeretné szerkeszteni!" notice_account_pending: "A fiókja létrejött, és adminisztrátori jóváhagyásra vár." @@ -301,7 +302,7 @@ setting_host_name: Kiszolgáló neve setting_text_formatting: Szöveg formázás setting_wiki_compression: Wiki történet tömörítés - setting_feeds_limit: RSS tartalom korlát + setting_feeds_limit: Atom tartalom korlát setting_default_projects_public: Az új projektek alapértelmezés szerint nyilvánosak setting_autofetch_changesets: Commitok automatikus lehúzása setting_sys_api_enabled: WS engedélyezése a tárolók kezeléséhez @@ -596,7 +597,7 @@ label_language_based: A felhasználó nyelve alapján label_sort_by: "%{value} szerint rendezve" label_send_test_email: Teszt e-mail küldése - label_feeds_access_key_created_on: "RSS hozzáférési kulcs létrehozva %{value}" + label_feeds_access_key_created_on: "Atom hozzáférési kulcs létrehozva %{value}" label_module_plural: Modulok label_added_time_by: "%{author} adta hozzá %{age}" label_updated_time: "Utolsó módosítás %{value}" @@ -892,11 +893,11 @@ label_revision_id: Revízió %{value} label_api_access_key: API hozzáférési kulcs label_api_access_key_created_on: API hozzáférési kulcs létrehozva %{value} ezelőtt - label_feeds_access_key: RSS hozzáférési kulcs + label_feeds_access_key: Atom hozzáférési kulcs notice_api_access_key_reseted: Az API hozzáférési kulcsa újragenerálva. setting_rest_api_enabled: REST web service engedélyezése label_missing_api_access_key: Egy API hozzáférési kulcs hiányzik - label_missing_feeds_access_key: RSS hozzáférési kulcs hiányzik + label_missing_feeds_access_key: Atom hozzáférési kulcs hiányzik button_show: Megmutat text_line_separated: Több érték megadása lehetséges (soronként 1 érték). setting_mail_handler_body_delimiters: E-mailek levágása a következő sorok valamelyike esetén @@ -1102,7 +1103,20 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Összesen text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/id.yml redmine-2.4.2/config/locales/id.yml --- redmine-2.3.3/config/locales/id.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/id.yml 2013-12-23 08:48:39.000000000 +0000 @@ -129,6 +129,7 @@ not_same_project: "tidak tergabung dalam proyek yang sama" circular_dependency: "kaitan ini akan menghasilkan circular dependency" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Silakan pilih @@ -161,7 +162,7 @@ notice_not_authorized: Anda tidak memiliki akses ke halaman ini. notice_email_sent: "Email sudah dikirim ke %{value}" notice_email_error: "Terjadi kesalahan pada saat pengiriman email (%{value})" - notice_feeds_access_key_reseted: RSS access key anda sudah direset. + notice_feeds_access_key_reseted: Atom access key anda sudah direset. notice_failed_to_save_issues: "Gagal menyimpan %{count} masalah dari %{total} yang dipilih: %{ids}." notice_no_issue_selected: "Tidak ada masalah yang dipilih! Silakan pilih masalah yang akan anda sunting." notice_account_pending: "Akun anda sudah dibuat dan sekarang sedang menunggu persetujuan administrator." @@ -669,7 +670,7 @@ label_language_based: Berdasarkan bahasa pengguna label_sort_by: "Urut berdasarkan %{value}" label_send_test_email: Kirim email percobaan - label_feeds_access_key_created_on: "RSS access key dibuat %{value} yang lalu" + label_feeds_access_key_created_on: "Atom access key dibuat %{value} yang lalu" label_module_plural: Modul label_added_time_by: "Ditambahkan oleh %{author} %{age} yang lalu" label_updated_time_by: "Diperbarui oleh %{author} %{age} yang lalu" @@ -872,7 +873,7 @@ label_display_used_statuses_only: Only display statuses that are used by this tracker error_workflow_copy_target: Please select target tracker(s) and role(s) label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_copy_same_as_target: Same as target @@ -880,7 +881,7 @@ setting_issue_done_ratio_issue_field: Use the issue field label_missing_api_access_key: Missing an API access key label_copy_target: Target - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key notice_issue_done_ratios_updated: Issue done ratios updated. error_workflow_copy_source: Please select a source tracker or role setting_start_of_week: Start calendars on @@ -1086,8 +1087,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/it.yml redmine-2.4.2/config/locales/it.yml --- redmine-2.3.3/config/locales/it.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/it.yml 2013-12-23 08:48:39.000000000 +0000 @@ -134,6 +134,7 @@ not_same_project: "non appartiene allo stesso progetto" circular_dependency: "Questa relazione creerebbe una dipendenza circolare" cant_link_an_issue_with_a_descendant: "Una segnalazione non può essere collegata a una delle sue discendenti" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Scegli @@ -152,7 +153,6 @@ notice_account_invalid_creditentials: Nome utente o password non validi. notice_account_password_updated: La password è stata aggiornata. notice_account_wrong_password: Password errata - notice_account_register_done: L'utente è stato creato. notice_account_unknown_email: Utente sconosciuto. notice_can_t_change_password: Questo utente utilizza un metodo di autenticazione esterno. Impossibile cambiare la password. notice_account_lost_email_sent: Ti è stata spedita una email con le istruzioni per cambiare la password. @@ -166,7 +166,7 @@ notice_not_authorized: Non sei autorizzato ad accedere a questa pagina. notice_email_sent: "Una email è stata spedita a %{value}" notice_email_error: "Si è verificato un errore durante l'invio di una email (%{value})" - notice_feeds_access_key_reseted: La tua chiave di accesso RSS è stata reimpostata. + notice_feeds_access_key_reseted: La tua chiave di accesso Atom è stata reimpostata. error_scm_not_found: "La risorsa e/o la versione non esistono nel repository." error_scm_command_failed: "Si è verificato un errore durante l'accesso al repository: %{value}" @@ -493,10 +493,10 @@ label_loading: Caricamento... label_relation_new: Nuova relazione label_relation_delete: Elimina relazione - label_relates_to: correlato a - label_duplicates: duplicati - label_blocks: blocchi - label_blocked_by: bloccato da + label_relates_to: correlata a + label_duplicates: duplica + label_blocks: blocca + label_blocked_by: bloccata da label_precedes: precede label_follows: segue label_end_to_start: fine a inizio @@ -524,7 +524,7 @@ label_language_based: Basato sul linguaggio label_sort_by: "Ordina per %{value}" label_send_test_email: Invia una email di prova - label_feeds_access_key_created_on: "chiave di accesso RSS creata %{value} fa" + label_feeds_access_key_created_on: "chiave di accesso Atom creata %{value} fa" label_module_plural: Moduli label_added_time_by: "Aggiunto da %{author} %{age} fa" label_updated_time: "Aggiornato %{value} fa" @@ -720,7 +720,7 @@ mail_body_reminder: "%{count} segnalazioni che ti sono state assegnate scadranno nei prossimi %{days} giorni:" mail_subject_reminder: "%{count} segnalazioni in scadenza nei prossimi %{days} giorni" text_user_wrote: "%{value} ha scritto:" - label_duplicated_by: duplicato da + label_duplicated_by: duplicata da setting_enabled_scm: SCM abilitato text_enumeration_category_reassign_to: 'Riassegnale a questo valore:' text_enumeration_destroy_question: "%{count} oggetti hanno un assegnamento su questo valore." @@ -874,11 +874,11 @@ label_revision_id: Revisione %{value} label_api_access_key: Chiave di accesso API label_api_access_key_created_on: Chiave di accesso API creata %{value} fa - label_feeds_access_key: Chiave di accesso RSS + label_feeds_access_key: Chiave di accesso Atom notice_api_access_key_reseted: La chiave di accesso API è stata reimpostata. setting_rest_api_enabled: Abilita il servizio web REST label_missing_api_access_key: Chiave di accesso API mancante - label_missing_feeds_access_key: Chiave di accesso RSS mancante + label_missing_feeds_access_key: Chiave di accesso Atom mancante button_show: Mostra text_line_separated: Valori multipli permessi (un valore per ogni riga). setting_mail_handler_body_delimiters: Tronca email dopo una di queste righe @@ -1054,8 +1054,8 @@ label_attribute_of_assigned_to: Assegnatari %{name} label_attribute_of_fixed_version: Target version's %{name} label_copy_subtasks: Copia sottoattività - label_copied_to: copia a - label_copied_from: copia da + label_copied_to: copia + label_copied_from: copiata da label_any_issues_in_project: ogni segnalazione del progetto label_any_issues_not_in_project: ogni segnalazione non nel progetto field_private_notes: Note private @@ -1083,5 +1083,20 @@ setting_jsonp_enabled: Abilita supporto a JSONP field_inherit_members: Eredita membri field_closed_on: Chiuso + field_generate_password: Generate password setting_default_projects_tracker_ids: Trackers di default per nuovi progetti label_total_time: Totale + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + notice_account_register_done: Account was successfully created. An email containing + the instructions to activate your account was sent to %{email}. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/ja.yml redmine-2.4.2/config/locales/ja.yml --- redmine-2.3.3/config/locales/ja.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/ja.yml 2013-12-23 08:48:39.000000000 +0000 @@ -146,10 +146,11 @@ less_than_or_equal_to: "は%{count}以下の値にしてください。" odd: "は奇数にしてください。" even: "は偶数にしてください。" - greater_than_start_date: "を開始日より後にしてください" - not_same_project: "同じプロジェクトに属していません" - circular_dependency: "この関係では、循環依存になります" - cant_link_an_issue_with_a_descendant: "指定したチケットとは親子関係になっているため関連づけられません" + greater_than_start_date: "を開始日より後にしてください。" + not_same_project: "同じプロジェクトに属していません。" + circular_dependency: "この関係では、循環依存になります。" + cant_link_an_issue_with_a_descendant: "親子関係にあるチケット間での関連の設定はできません。" + earlier_than_minimum_start_date: "を%{date}より前にすることはできません。先行するチケットがあります。" actionview_instancetag_blank_option: 選んでください @@ -176,7 +177,7 @@ notice_account_invalid_creditentials: ユーザー名もしくはパスワードが無効です notice_account_password_updated: パスワードが更新されました。 notice_account_wrong_password: パスワードが違います - notice_account_register_done: アカウントが作成されました。有効にするには送信したメールにあるリンクをクリックしてください。 + notice_account_register_done: アカウントを作成しました。アカウントを有効にするための手順を記載したメールを %{email} 宛に送信しました。 notice_account_unknown_email: ユーザーが存在しません。 notice_can_t_change_password: このアカウントでは外部認証を使っています。パスワードは変更できません。 notice_account_lost_email_sent: 新しいパスワードのメールを送信しました。 @@ -187,20 +188,20 @@ notice_successful_connection: 接続しました。 notice_file_not_found: アクセスしようとしたページは存在しないか削除されています。 notice_locking_conflict: 別のユーザーがデータを更新しています。 - notice_not_authorized: このページにアクセスするには認証が必要です。 + notice_not_authorized: このページのアクセスは許可されていません。 notice_not_authorized_archived_project: プロジェクトはアーカイブされています。 notice_email_sent: "%{value} 宛にメールを送信しました。" notice_email_error: "メール送信中にエラーが発生しました (%{value})" - notice_feeds_access_key_reseted: RSSアクセスキーを初期化しました。 + notice_feeds_access_key_reseted: Atomアクセスキーを初期化しました。 notice_api_access_key_reseted: APIアクセスキーを初期化しました。 notice_failed_to_save_issues: "全%{total}件中%{count}件のチケットが保存できませんでした: %{ids}." notice_failed_to_save_members: "メンバーの保存に失敗しました: %{errors}." notice_no_issue_selected: "チケットが選択されていません! 更新対象のチケットを選択してください。" - notice_account_pending: アカウントは作成済みで、システム管理者の承認待ちです。 + notice_account_pending: アカウントを作成しました。システム管理者の承認待ちです。 notice_default_data_loaded: デフォルト設定をロードしました。 notice_unable_delete_version: バージョンを削除できません notice_unable_delete_time_entry: 作業時間を削除できません - notice_issue_done_ratios_updated: チケットの進捗が更新されました。 + notice_issue_done_ratios_updated: チケットの進捗率を更新しました。 notice_gantt_chart_truncated: ガントチャートは、最大表示項目数(%{max})を超えたたため切り捨てられました。 error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}" @@ -216,7 +217,7 @@ error_can_not_remove_role: 'このロールは使用されています。削除できません。' error_can_not_reopen_issue_on_closed_version: '終了したバージョンにひも付けされたチケットの再オープンはできません。' error_can_not_archive_project: このプロジェクトはアーカイブできません - error_issue_done_ratios_not_updated: "チケットの進捗が更新できません。" + error_issue_done_ratios_not_updated: "チケットの進捗率が更新できません。" error_workflow_copy_source: 'コピー元となるトラッカーまたはロールを選択してください' error_workflow_copy_target: 'コピー先となるトラッカーとロールを選択してください' error_can_not_delete_tracker: 'このトラッカーは使用されています。削除できません。' @@ -301,7 +302,7 @@ field_attr_mail: メール属性 field_onthefly: あわせてユーザーを作成 field_start_date: 開始日 - field_done_ratio: 進捗 % + field_done_ratio: 進捗率 field_auth_source: 認証方式 field_hide_mail: メールアドレスを隠す field_comments: コメント @@ -379,7 +380,7 @@ setting_activity_days_default: プロジェクトの活動ページに表示される日数 setting_display_subprojects_issues: サブプロジェクトのチケットをメインプロジェクトに表示する setting_enabled_scm: 使用するバージョン管理システム - setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り取る" + setting_mail_handler_body_delimiters: "メール本文から一致する行以降を切り捨てる" setting_mail_handler_api_enabled: 受信メール用のWebサービスを有効にする setting_mail_handler_api_key: APIキー setting_sequential_project_identifiers: プロジェクト識別子を連番で生成する @@ -392,8 +393,8 @@ setting_password_min_length: パスワードの最低必要文字数 setting_new_project_user_role_id: システム管理者以外のユーザーが作成したプロジェクトに設定するロール setting_default_projects_modules: 新規プロジェクトにおいてデフォルトで有効になるモジュール - setting_issue_done_ratio: 進捗の算出方法 - setting_issue_done_ratio_issue_field: 各チケットにフィールドを用意する + setting_issue_done_ratio: 進捗率の算出方法 + setting_issue_done_ratio_issue_field: チケットのフィールドを使用する setting_issue_done_ratio_issue_status: チケットのステータスを使用する setting_start_of_week: 週の開始曜日 setting_rest_api_enabled: RESTによるWebサービスを有効にする @@ -758,9 +759,9 @@ label_language_based: ユーザーの言語の設定に従う label_sort_by: "並び替え %{value}" label_send_test_email: テストメールを送信 - label_feeds_access_key: RSSアクセスキー - label_missing_feeds_access_key: RSSアクセスキーが見つかりません - label_feeds_access_key_created_on: "RSSアクセスキーは%{value}前に作成されました" + label_feeds_access_key: Atomアクセスキー + label_missing_feeds_access_key: Atomアクセスキーが見つかりません + label_feeds_access_key_created_on: "Atomアクセスキーは%{value}前に作成されました" label_module_plural: モジュール label_added_time_by: "%{author} が%{age}前に追加" label_updated_time_by: "%{author} が%{age}前に更新" @@ -819,7 +820,7 @@ label_version_sharing_hierarchy: プロジェクト階層単位 label_version_sharing_tree: プロジェクトツリー単位 label_version_sharing_system: すべてのプロジェクト - label_update_issue_done_ratios: 進捗の更新 + label_update_issue_done_ratios: 進捗率の更新 label_copy_source: コピー元 label_copy_target: コピー先 label_copy_same_as_target: 同じコピー先 @@ -932,7 +933,7 @@ text_default_administrator_account_changed: デフォルト管理アカウントが変更済 text_file_repository_writable: ファイルリポジトリに書き込み可能 text_plugin_assets_writable: Plugin assetsディレクトリに書き込み可能 - text_rmagick_available: RMagickが使用可能 (オプション) + text_rmagick_available: RMagickが利用可能 (オプション) text_destroy_time_entries_question: このチケットの%{hours}時間分の作業記録の扱いを選択してください。 text_destroy_time_entries: 記録された作業時間を含めて削除 text_assign_time_entries_to_project: 記録された作業時間をプロジェクト自体に割り当て @@ -1115,4 +1116,15 @@ setting_jsonp_enabled: JSONPを有効にする field_inherit_members: メンバーを継承 field_closed_on: 終了日 + field_generate_password: パスワードを自動生成 label_total_time: 合計 + notice_account_not_activated_yet: アカウントが有効化されていません。アカウントを有効にするためのメールをもう一度受信したいときはこのリンクをクリックしてください。 + notice_account_locked: アカウントがロックされています + label_hidden: 非表示 + label_visibility_private: 自分のみ + label_visibility_roles: 以下のロールのみ + label_visibility_public: すべてのユーザー + field_must_change_passwd: 次回ログイン時にパスワード変更を強制 + notice_new_password_must_be_different: 新しいパスワードは現在のパスワードと異なるものでなければなりません + setting_mail_handler_excluded_filenames: 除外する添付ファイル名 + text_convert_available: ImageMagickのconvertコマンドが利用可能 (オプション) diff -Nru redmine-2.3.3/config/locales/ko.yml redmine-2.4.2/config/locales/ko.yml --- redmine-2.3.3/config/locales/ko.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/ko.yml 2013-12-23 08:48:39.000000000 +0000 @@ -176,6 +176,7 @@ not_same_project: "는 같은 프로젝트에 속해 있지 않습니다" circular_dependency: "이 관계는 순환 의존관계를 만들 수 있습니다" cant_link_an_issue_with_a_descendant: "일감은 하위 일감과 연결할 수 없습니다." + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: 선택하세요 @@ -208,7 +209,7 @@ notice_not_authorized: 이 페이지에 접근할 권한이 없습니다. notice_email_sent: "%{value}님에게 메일이 발송되었습니다." notice_email_error: "메일을 전송하는 과정에 오류가 발생했습니다. (%{value})" - notice_feeds_access_key_reseted: RSS에 접근가능한 열쇠(key)가 생성되었습니다. + notice_feeds_access_key_reseted: Atom에 접근가능한 열쇠(key)가 생성되었습니다. notice_failed_to_save_issues: "저장에 실패하였습니다: 실패 %{count}(선택 %{total}): %{ids}." notice_no_issue_selected: "일감이 선택되지 않았습니다. 수정하기 원하는 일감을 선택하세요" notice_account_pending: "계정이 만들어졌으며 관리자 승인 대기중입니다." @@ -921,11 +922,11 @@ label_revision_id: 개정판 %{value} label_api_access_key: API 접근키 label_api_access_key_created_on: API 접근키가 %{value} 전에 생성되었습니다. - label_feeds_access_key: RSS 접근키 + label_feeds_access_key: Atom 접근키 notice_api_access_key_reseted: API 접근키가 초기화되었습니다. setting_rest_api_enabled: REST 웹서비스 활성화 label_missing_api_access_key: API 접근키가 없습니다. - label_missing_feeds_access_key: RSS 접근키가 없습니다. + label_missing_feeds_access_key: Atom 접근키가 없습니다. button_show: 보기 text_line_separated: 여러 값이 허용됨(값 마다 한 줄씩) setting_mail_handler_body_delimiters: 메일 본문 구분자 @@ -1134,5 +1135,18 @@ setting_jsonp_enabled: JSONP 허용 field_inherit_members: 상위 프로젝트로부터 구성원을 상속 field_closed_on: 완료일 + field_generate_password: Generate password setting_default_projects_tracker_ids: 새 프로젝트에 기본적으로 추가할 일감 유형 label_total_time: 합계 + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/lt.yml redmine-2.4.2/config/locales/lt.yml --- redmine-2.3.3/config/locales/lt.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/lt.yml 2013-12-23 08:48:39.000000000 +0000 @@ -188,6 +188,7 @@ not_same_project: "nepriklauso tam pačiam projektui" circular_dependency: "Šis ryšys sukurtų ciklinę priklausomybę" cant_link_an_issue_with_a_descendant: "Darbas negali būti susietas su viena iš savo darbo dalių" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Prašom parinkti @@ -221,21 +222,21 @@ notice_not_authorized_archived_project: Projektas, kurį bandote atidaryti, buvo suarchyvuotas. notice_email_sent: "Laiškas išsiųstas %{value}" notice_email_error: "Laiško siuntimo metu įvyko klaida (%{value})" - notice_feeds_access_key_reseted: Jūsų RSS raktas buvo atnaujintas. + notice_feeds_access_key_reseted: Jūsų Atom raktas buvo atnaujintas. notice_api_access_key_reseted: Jūsų API prieigos raktas buvo atnaujintas. notice_failed_to_save_issues: "Nepavyko išsaugoti %{count} problemos(ų) iš %{total} pasirinkto: %{ids}." notice_failed_to_save_members: "Nepavyko išsaugoti nario(ių): %{errors}." notice_no_issue_selected: "Nepasirinkta nė viena problema! Prašom pažymėti problemą, kurią norite redaguoti." notice_account_pending: "Jūsų paskyra buvo sukurta ir dabar laukiama administratoriaus patvirtinimo." - notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta. + notice_default_data_loaded: Numatytoji konfigūracija sėkmingai įkrauta. notice_unable_delete_version: Neįmanoma panaikinti versiją. notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašą. notice_issue_done_ratios_updated: Problemos baigtumo rodikliai atnaujinti. notice_gantt_chart_truncated: Grafikas buvo sutrumpintas, kadangi jis viršija maksimalų (%{max}) leistinų atvaizduoti elementų kiekį notice_issue_successful_create: Darbas %{id} sukurtas. - error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}" - error_scm_not_found: "Duomenys ir/ar pakeitimai saugykloje(repozitorojoje) neegzistuoja." + error_can_t_load_default_data: "Numatytoji konfigūracija negali būti užkrauta: %{value}" + error_scm_not_found: "Duomenys ir/ar pakeitimai saugykloje (repozitorijoje) neegzistuoja." error_scm_command_failed: "Įvyko klaida jungiantis prie saugyklos: %{value}" error_scm_annotate: "Įrašas neegzistuoja arba negalima jo atvaizduoti." error_scm_annotate_big_text_file: "Įrašo negalima atvaizduoti, nes jis viršija maksimalų tekstinio failo dydį." @@ -253,7 +254,7 @@ error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso' error_unable_to_connect: Negalima prisijungti (%{value}) error_attachment_too_big: "Ši byla negali būti įkelta, nes viršija maksimalią (%{max_size}) leistiną bylos apimtį" - warning_attachments_not_saved: "%{count} byla(ų) negali būti išsaugota." + warning_attachments_not_saved: "%{count} byla(-ų) negali būti išsaugota." mail_subject_lost_password: "Jūsų %{value} slaptažodis" mail_body_lost_password: 'Norėdami pakeisti slaptažodį, spauskite nuorodą:' @@ -339,11 +340,11 @@ field_comments: Komentaras field_url: URL field_start_page: Pradžios puslapis - field_subproject: Subprojektas + field_subproject: Sub-projektas field_hours: valandos field_activity: Veikla field_spent_on: Data - field_identifier: Identifikuotojas + field_identifier: Identifikatorius field_is_filter: Panaudotas kaip filtras field_issue_to: Susijęs darbas field_delay: Užlaikymas @@ -371,10 +372,10 @@ field_warn_on_leaving_unsaved: "Įspėti mane, kai paliekamas puslapis su neišsaugotu tekstu" field_issues_visibility: Darbų matomumas field_is_private: Privatus - field_commit_logs_encoding: Commit pranešimų koduotė - field_scm_path_encoding: Kelio koduotė + field_commit_logs_encoding: Commit žurnalų koduotė + field_scm_path_encoding: SCM kelio koduotė field_path_to_repository: Saugyklos kelias - field_root_directory: Root directorija + field_root_directory: Šakninis katalogas field_cvsroot: CVSROOT field_cvs_module: Modulis @@ -383,8 +384,8 @@ setting_welcome_text: Pasveikinimas setting_default_language: Numatytoji kalba setting_login_required: Reikalingas autentiškumo nustatymas - setting_self_registration: Saviregistracija - setting_attachment_max_size: Priedo maks. dydis + setting_self_registration: Savi-registracija + setting_attachment_max_size: Priedo maksimalus dydis setting_issues_export_limit: Darbų eksportavimo riba setting_mail_from: Išleidimo elektroninio pašto adresas setting_bcc_recipients: Akli tikslios kopijos gavėjai (bcc) @@ -401,16 +402,16 @@ setting_autologin: Automatinis prisijungimas setting_date_format: Datos formatas setting_time_format: Laiko formatas - setting_cross_project_issue_relations: Leisti tarprojektinius darbų ryšius + setting_cross_project_issue_relations: Leisti tarp-projektinius darbų ryšius setting_issue_list_default_columns: Numatytosios skiltys darbų sąraše setting_repositories_encodings: Pridėtų failų ir saugyklų šifravimas setting_emails_header: Laiško antraštė - setting_emails_footer: Laiško poraštė + setting_emails_footer: Laiško paraštė setting_protocol: Protokolas - setting_per_page_options: Įrašų puslapyje nustatymas + setting_per_page_options: Įrašų puslapyje nustatymas setting_user_format: Vartotojo atvaizdavimo formatas setting_activity_days_default: Atvaizduojamos dienos projekto veikloje - setting_display_subprojects_issues: Pagal nutylėjimą rodyti subprojektų darbus pagrindiniame projekte + setting_display_subprojects_issues: Pagal nutylėjimą rodyti sub-projektų darbus pagrindiniame projekte setting_enabled_scm: Įgalinti SCM setting_mail_handler_body_delimiters: "Trumpinti laiškus po vienos iš šių eilučių" setting_mail_handler_api_enabled: Įgalinti WS įeinantiems laiškams @@ -420,7 +421,7 @@ setting_gravatar_default: Gravatar paveiksliukas pagal nutylėjimą setting_diff_max_lines_displayed: Maksimalus rodomas pakeitimų eilučių skaičius setting_file_max_size_displayed: Maksimalus testinių failų dydis rodomas vienoje eilutėje - setting_repository_log_display_limit: Maksimalus revizijų skaičius rodomas failo loge + setting_repository_log_display_limit: Maksimalus revizijų skaičius rodomas žurnale setting_openid: Leisti OpenID prisijungimą ir registraciją setting_password_min_length: Minimalus slaptažodžio ilgis setting_new_project_user_role_id: Vartotojo vaidmuo, suteikiamas ne administratoriui, kuris sukuria projektą @@ -429,7 +430,7 @@ setting_issue_done_ratio_issue_field: Naudoti darbo lauką setting_issue_done_ratio_issue_status: Naudoti darbo statusą setting_start_of_week: Savaitės pradžios diena - setting_rest_api_enabled: Įjungti REST web service + setting_rest_api_enabled: Įjungti REST tinklo servisą setting_cache_formatted_text: Paslėpti formatuotą tekstą setting_default_notification_option: Numatytosios pranešimų nuostatos setting_commit_logtime_enabled: Įjungti laiko registravimą @@ -439,7 +440,7 @@ setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą permission_add_project: Sukurti projektą - permission_add_subprojects: Kurti subprojektus + permission_add_subprojects: Kurti sub-projektus permission_edit_project: Taisyti projektą permission_select_project_modules: Parinkti projekto modulius permission_manage_members: Valdyti narius @@ -467,7 +468,7 @@ permission_log_time: Regsitruoti dirbtą laiką permission_view_time_entries: Matyti dirbtą laiką permission_edit_time_entries: Redaguoti laiko įrašus - permission_edit_own_time_entries: Redguoti savo laiko įrašus + permission_edit_own_time_entries: Redaguoti savo laiko įrašus permission_manage_news: Valdyti naujienas permission_comment_news: Komentuoti naujienas permission_view_documents: Matyti dokumentus @@ -526,7 +527,7 @@ label_issues_by: "Darbai pagal %{value}" label_issue_added: Darbas pridėtas label_issue_updated: Darbas atnaujintas - label_issue_note_added: Pastaba pridėta + label_issue_note_added: Pastaba pridėta label_issue_status_updated: Statusas atnaujintas label_issue_priority_updated: Prioritetas atnaujintas label_document: Dokumentas @@ -586,9 +587,9 @@ label_auth_source: Autentiškumo nustatymo būdas label_auth_source_new: Naujas autentiškumo nustatymo būdas label_auth_source_plural: Autentiškumo nustatymo būdai - label_subproject_plural: Subprojektai - label_subproject_new: Naujas subprojektas - label_and_its_subprojects: "%{value} projektas ir jo subprojektai" + label_subproject_plural: Sub-projektai + label_subproject_new: Naujas sub-projektas + label_and_its_subprojects: "%{value} projektas ir jo sub-projektai" label_min_max_length: Min - Maks ilgis label_list: Sąrašas label_date: Data @@ -602,7 +603,7 @@ label_no_data: Nėra ką atvaizduoti label_change_status: Pakeitimo būsena label_history: Istorija - label_attachment: Filas + label_attachment: Failas label_attachment_new: Naujas failas label_attachment_delete: Pašalinkite failą label_attachment_plural: Failai @@ -659,7 +660,7 @@ label_months_from: mėnesiai nuo label_gantt: Gantt label_internal: Vidinis - label_last_changes: "paskutiniai %{count} pokyčiai(ių)" + label_last_changes: "paskutiniai %{count} pokyčiai(-ių)" label_change_view_all: Peržiūrėti visus pakeitimus label_personalize_page: Suasmeninti šį puslapį label_comment: Komentaras @@ -691,7 +692,7 @@ label_this_week: šią savaitę label_last_week: praeita savaitė label_last_n_days: "paskutinių %{count} dienų" - label_this_month: šis menuo + label_this_month: šis mėnuo label_last_month: praeitas mėnuo label_this_year: šiemet label_date_range: Dienų diapazonas @@ -700,7 +701,7 @@ label_ago: prieš label_contains: turi label_not_contains: neturi - label_day_plural: dienų(os) + label_day_plural: dienų(-os) label_repository: Saugykla label_repository_plural: Saugyklos label_browse: Naršyti @@ -717,8 +718,8 @@ label_deleted: pašalintas label_latest_revision: Paskutinė revizija label_latest_revision_plural: Paskutinės revizijos - label_view_revisions: Pežiūrėti revizijas - label_view_all_revisions: Pežiūrėti visas revizijas + label_view_revisions: Peržiūrėti revizijas + label_view_all_revisions: Peržiūrėti visas revizijas label_max_size: Maksimalus dydis label_sort_highest: Perkelti į viršūnę label_sort_higher: Perkelti į viršų @@ -746,7 +747,7 @@ label_spent_time: Dirbtas laikas label_overall_spent_time: Visas dirbtas laikas label_f_hour: "%{value} valanda" - label_f_hour_plural: "%{value} valandų(os)" + label_f_hour_plural: "%{value} valandų(-os)" label_time_tracking: Laiko sekimas label_change_plural: Pakeitimai label_statistics: Statistika @@ -770,14 +771,14 @@ label_duplicated_by: dubliuojasi su label_blocks: blokuoja label_blocked_by: blokuojamas - label_precedes: ankstesnė(is) + label_precedes: ankstesnė(-is) label_follows: seka label_end_to_start: užbaigti, kad pradėti label_end_to_end: užbaigti, kad pabaigti label_start_to_start: pradėkite pradėti label_start_to_end: pradėkite užbaigti label_stay_logged_in: Likti prisijungus - label_disabled: išjungta(as) + label_disabled: išjungta(-as) label_show_completed_versions: Rodyti užbaigtas versijas label_me: aš label_board: Forumas @@ -800,9 +801,9 @@ label_language_based: Pagrįsta vartotojo kalba label_sort_by: "Rūšiuoti pagal %{value}" label_send_test_email: Nusiųsti bandomąjį laišką - label_feeds_access_key: RSS prieigos raktas - label_missing_feeds_access_key: TRūksta RSS prieigos rakto - label_feeds_access_key_created_on: "RSS prieigos raktas sukurtas prieš %{value}" + label_feeds_access_key: Atom prieigos raktas + label_missing_feeds_access_key: Trūksta Atom prieigos rakto + label_feeds_access_key_created_on: "Atom prieigos raktas sukurtas prieš %{value}" label_module_plural: Moduliai label_added_time_by: "Pridėjo %{author} prieš %{age}" label_updated_time_by: "Atnaujino %{author} prieš %{age}" @@ -812,17 +813,17 @@ label_changeset_plural: Pakeitimų rinkiniai label_default_columns: Numatytieji stulpeliai label_no_change_option: (Jokio pakeitimo) - label_bulk_edit_selected_issues: Masiškai readguoti pasirinktus darbus + label_bulk_edit_selected_issues: Masiškai redaguoti pasirinktus darbus label_bulk_edit_selected_time_entries: Masiškai redaguotumėte pasirinktus laiko įrašus label_theme: Tema - label_default: Numatyta(as) - label_search_titles_only: Ieškoti tiktai pavadinimų + label_default: Numatyta(-as) + label_search_titles_only: Ieškoti tiktai pavadinimų label_user_mail_option_all: "Bet kokiam įvykiui visuose mano projektuose" label_user_mail_option_selected: "Bet kokiam įvykiui tiktai pasirinktuose projektuose ..." label_user_mail_option_none: "Nėra įvykių" - label_user_mail_option_only_my_events: "Tiktai įvikiai, kuriuos stebiu arba esu įtrauktas" + label_user_mail_option_only_my_events: "Tiktai įvykiai, kuriuos stebiu arba esu įtrauktas" label_user_mail_option_only_assigned: "Tiktai įvykiai, kuriems esu priskirtas" - label_user_mail_option_only_owner: "Tiktai įvikiai, kurių šeikininkas esu" + label_user_mail_option_only_owner: "Tiktai įvykiai, kurių šeimininkas esu aš" label_user_mail_no_self_notified: "Nenoriu būti informuotas apie pakeitimus, kuriuos pats atlieku" label_registration_activation_by_email: paskyros aktyvacija per e-paštą label_registration_manual_activation: rankinė paskyros aktyvacija @@ -830,7 +831,7 @@ label_display_per_page: "%{value} įrašų puslapyje" label_age: Amžius label_change_properties: Pakeisti nustatymus - label_general: Bendri(as) + label_general: Bendri(-as) label_more: Daugiau label_scm: SCM label_plugins: Įskiepiai @@ -858,7 +859,7 @@ label_group_new: Nauja grupė label_time_entry_plural: Sprendimo laikas label_version_sharing_none: Nesidalinama - label_version_sharing_descendants: Su subprojektais + label_version_sharing_descendants: Su sub-projektais label_version_sharing_hierarchy: Su projekto hierarchija label_version_sharing_tree: Su projekto medžiu label_version_sharing_system: Su visais projektais @@ -946,7 +947,7 @@ text_regexp_info: pvz. ^[A-Z0-9]+$ text_min_max_length_info: 0 reiškia jokių apribojimų text_project_destroy_confirmation: Ar esate įsitikinęs, kad norite pašalinti šį projektą ir visus susijusius duomenis? - text_subprojects_destroy_warning: "Šis(ie) subprojektas(ai): %{value} taip pat bus ištrintas(i)." + text_subprojects_destroy_warning: "Šis(-ie) sub-projektas(-ai): %{value} taip pat bus ištrintas(-i)." text_workflow_edit: Išrinkite vaidmenį ir pėdsekį, kad redaguotumėte darbų eigą text_are_you_sure: Ar esate įsitikinęs? text_journal_changed: "%{label} pakeistas(a) iš %{old} į %{new}" @@ -973,13 +974,13 @@ text_issue_category_destroy_assignments: Pašalinti kategorijos užduotis text_issue_category_reassign_to: Iš naujo priskirti darbus šiai kategorijai text_user_mail_option: "Neišrinktiems projektams, jūs gausite tiktai pranešimus apie tuos įvykius, kuriuos jūs stebite, arba į kuriuos esate įtrauktas (pvz. darbai, kurių autorius jūs esate ar esate priskirtas)." - text_no_configuration_data: "Vaidmenys, pėdsekiai, darbų būsenos ir darbų eiga dar nebuvo konfigūruoti.\nGriežtai rekomenduojam užkrauti numatytąją (default) konfiguraciją. Užkrovus, galėsite ją modifikuoti." - text_load_default_configuration: Užkrauti numatytąj konfiguraciją + text_no_configuration_data: "Vaidmenys, pėdsekiai, darbų būsenos ir darbų eiga dar nebuvo konfigūruoti.\nGriežtai rekomenduojam užkrauti numatytąją (default) konfigūraciją. Užkrovus, galėsite ją modifikuoti." + text_load_default_configuration: Užkrauti numatytąją konfigūraciją text_status_changed_by_changeset: "Pakeista %{value} revizijoje." text_time_logged_by_changeset: "Applied in changeset %{value}." - text_issues_destroy_confirmation: 'Ar jūs tikrai norite sunaikinti pažymėtą(us) darbą(us)?' - text_issues_destroy_descendants_confirmation: Taip pat bus ištrinta(os) %{count} darbo dalis(ys). - text_time_entries_destroy_confirmation: 'Ar jūs tikrai norite ištrinti pasirinktą(us) laiko įrašą(us)?' + text_issues_destroy_confirmation: 'Ar jūs tikrai norite sunaikinti pažymėtą(-us) darbą(-us)?' + text_issues_destroy_descendants_confirmation: Taip pat bus ištrinta(-os) %{count} darbo dalis(ys). + text_time_entries_destroy_confirmation: 'Ar jūs tikrai norite ištrinti pasirinktą(-us) laiko įrašą(-us)?' text_select_project_modules: 'Parinkite modulius, kuriuos norite naudoti šiame projekte:' text_default_administrator_account_changed: Administratoriaus numatytoji paskyra pakeista text_file_repository_writable: Į failų saugyklą saugoti galima (RW) @@ -993,14 +994,14 @@ text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei." text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:' text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas, ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus." - text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos log'e.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el.paštą yra automatiškai surišti." + text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos žurnale.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el. paštą yra automatiškai surišti." text_diff_truncated: "... Šis diff'as nukarpytas, nes jis viršijo maksimalų rodomų eilučių skaičių." text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei' text_wiki_page_destroy_question: "Šis puslapis turi %{descendants} susijusių arba išvestinių puslapių. Ką norėtumėte daryti?" - text_wiki_page_nullify_children: Laikyti child puslapius kaip pagrindinius puslapius - text_wiki_page_destroy_children: "Pašalinti child puslapius ir jų palikuonis" - text_wiki_page_reassign_children: "Priskirkite iš naujo 'child' puslapius šiam pagrindiniam puslapiui" - text_own_membership_delete_confirmation: "Jūs esate pasiruošęs panaikinti dalį arba visus leidimus ir po šio pakeitimo galite prarasti šio projekto redagavimo galimybę. \n Ar jūs esate įsitikinęs ir tęsti?" + text_wiki_page_nullify_children: Laikyti susijusius puslapius kaip pagrindinius puslapius + text_wiki_page_destroy_children: "Pašalinti susijusius puslapius ir jų palikuonis" + text_wiki_page_reassign_children: "Priskirkite iš naujo 'susijusius' puslapius šiam pagrindiniam puslapiui" + text_own_membership_delete_confirmation: "Jūs esate pasiruošęs panaikinti dalį arba visus leidimus ir po šio pakeitimo galite prarasti šio projekto redagavimo galimybę.\nAr jūs esate įsitikinęs ir tęsti?" text_zoom_in: Priartinti text_zoom_out: Nutolinti text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį." @@ -1034,7 +1035,7 @@ enumeration_issue_priorities: Darbo prioritetai enumeration_doc_categories: Dokumento kategorijos - enumeration_activities: Veiklos (laiko sekimas) + enumeration_activities: Veiklos (laiko) sekimas enumeration_system_activity: Sistemos veikla description_filter: Filtras @@ -1124,7 +1125,7 @@ label_any: visi label_last_n_weeks: prieš %{count} sav. setting_cross_project_subtasks: Leisti susieti skirtingų projektų užduočių dalis - label_cross_project_descendants: Su subprojektais + label_cross_project_descendants: Su sub-projektais label_cross_project_tree: Su projekto medžiu label_cross_project_hierarchy: Su projekto hierarchija label_cross_project_system: Su visais projektais @@ -1142,7 +1143,20 @@ setting_jsonp_enabled: Įgalinti JSONP palaikymą field_inherit_members: Paveldėti narius field_closed_on: Uždarytas + field_generate_password: Sugeneruoti slaptažodį setting_default_projects_tracker_ids: Sekliai pagal nutylėjimą naujiems projektams label_total_time: Iš viso text_scm_config: Jūs galite pakeisti SCM komandas byloje config/configuration.yml. Prašome perkrauti programą po redagavimo, idant įgalinti pakeitimus. text_scm_command_not_available: SCM komanda nepasiekiama. Patikrinkite administravimo skydelio nustatymus. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/lv.yml redmine-2.4.2/config/locales/lv.yml --- redmine-2.3.3/config/locales/lv.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/lv.yml 2013-12-23 08:48:39.000000000 +0000 @@ -123,6 +123,7 @@ not_same_project: "nepieder pie tā paša projekta" circular_dependency: "Šī relācija radītu ciklisku atkarību" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Izvēlieties @@ -155,7 +156,7 @@ notice_not_authorized: Jums nav tiesību piekļūt šai lapai. notice_email_sent: "E-pasts tika nosūtīts uz %{value}" notice_email_error: "Kļūda sūtot e-pastu (%{value})" - notice_feeds_access_key_reseted: Jūsu RSS pieejas atslēga tika iestatīta sākuma stāvoklī. + notice_feeds_access_key_reseted: Jūsu Atom pieejas atslēga tika iestatīta sākuma stāvoklī. notice_api_access_key_reseted: Jūsu API pieejas atslēga tika iestatīta sākuma stāvoklī. notice_failed_to_save_issues: "Neizdevās saglabāt %{count} uzdevumu(us) no %{total} izvēlēti: %{ids}." notice_no_issue_selected: "Nav izvēlēts uzdevums! Lūdzu, atzīmējiet uzdevumus, kurus vēlaties rediģēt!" @@ -684,9 +685,9 @@ label_language_based: Izmantot lietotāja valodu label_sort_by: "Kārtot pēc %{value}" label_send_test_email: "Sūtīt testa e-pastu" - label_feeds_access_key: RSS piekļuves atslēga - label_missing_feeds_access_key: Trūkst RSS piekļuves atslēgas - label_feeds_access_key_created_on: "RSS piekļuves atslēga izveidota pirms %{value}" + label_feeds_access_key: Atom piekļuves atslēga + label_missing_feeds_access_key: Trūkst Atom piekļuves atslēgas + label_feeds_access_key_created_on: "Atom piekļuves atslēga izveidota pirms %{value}" label_module_plural: Moduļi label_added_time_by: "Pievienojis %{author} pirms %{age}" label_updated_time_by: "Atjaunojis %{author} pirms %{age}" @@ -1076,8 +1077,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Kopā text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/mk.yml redmine-2.4.2/config/locales/mk.yml --- redmine-2.3.3/config/locales/mk.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/mk.yml 2013-12-23 08:48:39.000000000 +0000 @@ -130,6 +130,7 @@ not_same_project: "не припаѓа на истиот проект" circular_dependency: "Оваа врска ќе креира кружна зависност" cant_link_an_issue_with_a_descendant: "Задача неможе да се поврзе со една од нејзините подзадачи" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Изберете @@ -162,7 +163,7 @@ notice_not_authorized: You are not authorized to access this page. notice_email_sent: "Е-порака е пратена на %{value}" notice_email_error: "Се случи грешка при праќање на е-пораката (%{value})" - notice_feeds_access_key_reseted: Вашиот RSS клуч за пристап е reset. + notice_feeds_access_key_reseted: Вашиот Atom клуч за пристап е reset. notice_api_access_key_reseted: Вашиот API клуч за пристап е reset. notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." notice_failed_to_save_members: "Failed to save member(s): %{errors}." @@ -704,9 +705,9 @@ label_language_based: Според јазикот на корисникот label_sort_by: "Подреди според %{value}" label_send_test_email: Испрати тест е-порака - label_feeds_access_key: RSS клуч за пристап - label_missing_feeds_access_key: Недостика RSS клуч за пристап - label_feeds_access_key_created_on: "RSS клучот за пристап креиран пред %{value}" + label_feeds_access_key: Atom клуч за пристап + label_missing_feeds_access_key: Недостика Atom клуч за пристап + label_feeds_access_key_created_on: "Atom клучот за пристап креиран пред %{value}" label_module_plural: Модули label_added_time_by: "Додадено од %{author} пред %{age}" label_updated_time_by: "Ажурирано од %{author} пред %{age}" @@ -1081,9 +1082,22 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Вкупно text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_footer: Email footer setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/mn.yml redmine-2.4.2/config/locales/mn.yml --- redmine-2.3.3/config/locales/mn.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/mn.yml 2013-12-23 08:48:39.000000000 +0000 @@ -129,6 +129,7 @@ not_same_project: "нэг ижил төсөлд хамаарахгүй байна" circular_dependency: "Энэ харьцаа нь гинжин(рекурсив) харьцаа үүсгэх юм байна" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Сонгоно уу @@ -161,7 +162,7 @@ notice_not_authorized: Танд энэ хуудсыг үзэх эрх байхгүй байна. notice_email_sent: "%{value} - руу мэйл илгээлээ" notice_email_error: "Мэйл илгээхэд алдаа гарлаа (%{value})" - notice_feeds_access_key_reseted: Таны RSS хандалтын түлхүүрийг дахин эхлүүллээ. + notice_feeds_access_key_reseted: Таны Atom хандалтын түлхүүрийг дахин эхлүүллээ. notice_api_access_key_reseted: Your API access key was reset. notice_failed_to_save_issues: "%{total} асуудал сонгогдсоноос %{count} асуудлыг нь хадгалахад алдаа гарлаа: %{ids}." notice_no_issue_selected: "Ямар ч асуудал сонгогдоогүй байна! Засварлах асуудлуудаа сонгоно уу." @@ -690,9 +691,9 @@ label_language_based: Хэрэглэгчийн хэлнас шалтгаалан label_sort_by: "%{value} талбараар нь эрэмбэлэх" label_send_test_email: Турших мэйл илгээх - label_feeds_access_key: RSS хандах түлхүүр - label_missing_feeds_access_key: RSS хандах түлхүүр алга - label_feeds_access_key_created_on: "RSS хандалтын түлхүүр %{value}-ийн өмнө үүссэн" + label_feeds_access_key: Atom хандах түлхүүр + label_missing_feeds_access_key: Atom хандах түлхүүр алга + label_feeds_access_key_created_on: "Atom хандалтын түлхүүр %{value}-ийн өмнө үүссэн" label_module_plural: Модулууд label_added_time_by: "%{author} %{age}-ийн өмнө нэмсэн" label_updated_time_by: "%{author} %{age}-ийн өмнө өөрчилсөн" @@ -1083,8 +1084,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Нийт text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/nl.yml redmine-2.4.2/config/locales/nl.yml --- redmine-2.3.3/config/locales/nl.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/nl.yml 2013-12-23 08:48:39.000000000 +0000 @@ -110,8 +110,8 @@ accepted: "moet geaccepteerd worden" empty: "mag niet leeg zijn" blank: "mag niet blanco zijn" - too_long: "is te lang" - too_short: "is te kort" + too_long: "is te lang (maximaal %{count} tekens)" + too_short: "is te kort (minimaal %{count} tekens)" wrong_length: "heeft een onjuiste lengte" taken: "is al in gebruik" not_a_number: "is geen getal" @@ -127,6 +127,7 @@ not_same_project: "hoort niet bij hetzelfde project" circular_dependency: "Deze relatie zou een circulaire afhankelijkheid tot gevolg hebben" cant_link_an_issue_with_a_descendant: "Een issue kan niet gelinked worden met een subtask" + earlier_than_minimum_start_date: "kan niet eerder zijn dan %{date} wegens voorafgaande issues" actionview_instancetag_blank_option: Selecteer @@ -397,7 +398,7 @@ label_f_hour: "%{value} uur" label_f_hour_plural: "%{value} uren" label_feed_plural: Feeds - label_feeds_access_key_created_on: "RSS toegangssleutel %{value} geleden gemaakt." + label_feeds_access_key_created_on: "Atom toegangssleutel %{value} geleden gemaakt." label_file_added: Bestand toegevoegd label_file_plural: Bestanden label_filter_add: Voeg filter toe @@ -420,19 +421,19 @@ label_information_plural: Informatie label_integer: Integer label_internal: Intern - label_issue: Incident - label_issue_added: Incident toegevoegd - label_issue_category: Incident categorie + label_issue: Issue + label_issue_added: Issue toegevoegd + label_issue_category: Issue categorie label_issue_category_new: Nieuwe categorie label_issue_category_plural: Issuecategorieën - label_issue_new: Nieuw incident - label_issue_plural: Incidenten - label_issue_status: Incident status + label_issue_new: Nieuw issue + label_issue_plural: Issues + label_issue_status: Issue status label_issue_status_new: Nieuwe status - label_issue_status_plural: Incident statussen - label_issue_tracking: Incident-tracking - label_issue_updated: Incident bijgewerkt - label_issue_view_all: Bekijk alle incidenten + label_issue_status_plural: Issue statussen + label_issue_tracking: Issue-tracking + label_issue_updated: Issue bijgewerkt + label_issue_view_all: Bekijk alle issues label_issue_watchers: Monitoren label_issues_by: "Issues door %{value}" label_jump_to_a_project: Ga naar een project... @@ -582,7 +583,7 @@ label_user: Gebruiker label_user_activity: "%{value}'s activiteit" label_user_mail_no_self_notified: Ik wil niet op de hoogte gehouden worden van mijn eigen wijzigingen - label_user_mail_option_all: "Bij elk gebeurtenis in al mijn projecten..." + label_user_mail_option_all: "Bij elke gebeurtenis in al mijn projecten..." label_user_mail_option_selected: "Enkel bij elke gebeurtenis op het geselecteerde project..." label_user_new: Nieuwe gebruiker label_user_plural: Gebruikers @@ -616,7 +617,6 @@ notice_account_lost_email_sent: Er is een e-mail naar u verstuurd met instructies over het kiezen van een nieuw wachtwoord. notice_account_password_updated: Wachtwoord is met succes gewijzigd notice_account_pending: "Uw account is aangemaakt, maar wacht nog op goedkeuring van de beheerder." - notice_account_register_done: Account is met succes aangemaakt. notice_account_unknown_email: Onbekende gebruiker. notice_account_updated: Account is met succes gewijzigd notice_account_wrong_password: Incorrect wachtwoord @@ -625,7 +625,7 @@ notice_email_error: "Er is een fout opgetreden tijdens het versturen van (%{value})" notice_email_sent: "Een e-mail werd verstuurd naar %{value}" notice_failed_to_save_issues: "Fout bij bewaren van %{count} issue(s) (%{total} geselecteerd): %{ids}." - notice_feeds_access_key_reseted: Je RSS toegangssleutel werd gereset. + notice_feeds_access_key_reseted: Je Atom toegangssleutel werd gereset. notice_file_not_found: De pagina die u probeerde te benaderen bestaat niet of is verwijderd. notice_locking_conflict: De gegevens zijn gewijzigd door een andere gebruiker. notice_no_issue_selected: "Er is geen issue geselecteerd. Selecteer de issue die u wilt bewerken." @@ -856,11 +856,11 @@ label_revision_id: Revisie %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key gemaakt %{value} geleden - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Uw API access key was gereset. setting_rest_api_enabled: Activeer REST web service label_missing_api_access_key: Geen API access key - label_missing_feeds_access_key: Geen RSS access key + label_missing_feeds_access_key: Geen Atom access key button_show: Laat zien text_line_separated: Meerdere waarden toegestaan (elke regel is een waarde). setting_mail_handler_body_delimiters: Breek email verwerking af na een van deze regels @@ -922,26 +922,26 @@ button_collapse_all: Klap in label_additional_workflow_transitions_for_assignee: Aanvullende veranderingen toegestaan wanneer de gebruiker de toegewezene is label_additional_workflow_transitions_for_author: Aanvullende veranderingen toegestaan wanneer de gebruiker de auteur is - label_bulk_edit_selected_time_entries: Massa wijziging geselecteerd tijd-registraties? + label_bulk_edit_selected_time_entries: Alle geselecteerde tijdregistraties wijzigen? text_time_entries_destroy_confirmation: Weet u zeker dat u de geselecteerde item(s) wilt verwijderen ? label_role_anonymous: Anoniem label_role_non_member: Geen lid label_issue_note_added: Notitie toegevoegd label_issue_status_updated: Status gewijzigd - label_issue_priority_updated: Prioriteit geupdate - label_issues_visibility_own: Probleem aangemaakt door of toegewezen aan - field_issues_visibility: Incidenten weergave - label_issues_visibility_all: Alle incidenten - permission_set_own_issues_private: Zet eigen incidenten publiekelijk of privé + label_issue_priority_updated: Prioriteit gewijzigd + label_issues_visibility_own: Issue aangemaakt door of toegewezen aan + field_issues_visibility: Issues weergave + label_issues_visibility_all: Alle issues + permission_set_own_issues_private: Zet eigen issues publiekelijk of privé field_is_private: Privé - permission_set_issues_private: Zet incidenten publiekelijk of privé - label_issues_visibility_public: Alle niet privé-incidenten + permission_set_issues_private: Zet issues publiekelijk of privé + label_issues_visibility_public: Alle niet privé-issues text_issues_destroy_descendants_confirmation: Dit zal ook de %{count} subtaken verwijderen. field_commit_logs_encoding: Encodering van commit berichten field_scm_path_encoding: Pad encodering text_scm_path_encoding_note: "Standaard: UTF-8" field_path_to_repository: Pad naar versie overzicht - field_root_directory: Root directorie + field_root_directory: Root directory field_cvs_module: Module field_cvsroot: CVSROOT text_mercurial_repository_note: "Lokale versie overzicht (Voorbeeld: /hgrepo, c:\\hgrepo)" @@ -950,10 +950,10 @@ label_git_report_last_commit: Rapporteer laatste toevoegen voor bestanden en directories text_scm_config: U kan de scm commando's configureren in config/configuration.yml. Herstart de applicatie na het wijzigen ervan. text_scm_command_not_available: Scm commando is niet beschikbaar. Controleer de instellingen in het administratiepaneel. - notice_issue_successful_create: Probleem %{id} aangemaakt. + notice_issue_successful_create: Issue %{id} aangemaakt. label_between: tussen setting_issue_group_assignment: Sta groepstoewijzingen toe - label_diff: Verschil + label_diff: diff text_git_repository_note: "Versie overzicht lokaal is leeg (Voorbeeld: /gitrepo, c:\\gitrepo)" description_query_sort_criteria_direction: Sortering description_project_scope: Zoek bereik @@ -963,7 +963,7 @@ description_message_content: Inhoud bericht description_available_columns: Beschikbare kolommen description_date_range_interval: Kies een bereik bij het selecteren van een start en eind datum - description_issue_category_reassign: Kies probleem categorie + description_issue_category_reassign: Kies issue categorie description_search: Zoekveld description_notes: Notities description_date_range_list: Kies bereik vanuit de lijst @@ -975,7 +975,7 @@ label_parent_revision: Hoofd label_child_revision: Sub error_scm_annotate_big_text_file: De vermelding kan niet worden geannoteerd, omdat het groter is dan de maximale toegewezen grootte. - setting_default_issue_start_date_to_creation_date: Gebruik huidige datum als start datum voor nieuwe incidenten. + setting_default_issue_start_date_to_creation_date: Gebruik huidige datum als start datum voor nieuwe issues. button_edit_section: Wijzig deze sectie setting_repositories_encodings: Bijlage en opgeslagen bestanden coderingen description_all_columns: Alle kolommen @@ -984,23 +984,23 @@ error_attachment_too_big: Dit bestand kan niet worden geupload omdat het de maximaal toegestane grootte overschrijd (%{max_size}) notice_failed_to_save_time_entries: "Opslaan gefaald voor %{count} tijdsnotatie(s) van %{total} geselecteerde: %{ids}." label_x_issues: - zero: 0 incidenten - one: 1 incidenten - other: "%{count} incidenten" + zero: 0 issues + one: 1 issue + other: "%{count} issues" label_repository_new: Nieuw repository field_repository_is_default: Hoofd repository - label_copy_attachments: Copieer bijlage(n) + label_copy_attachments: Kopieer bijlage(n) label_item_position: "%{position}/%{count}" label_completed_versions: Versies compleet field_multiple: Meerdere waardes - setting_commit_cross_project_ref: Sta toe om incidenten van alle projecten te refereren en oplossen + setting_commit_cross_project_ref: Sta toe om issues van alle projecten te refereren en oplossen text_issue_conflict_resolution_add_notes: Voeg mijn notities toe en annuleer andere wijzigingen text_issue_conflict_resolution_overwrite: Voeg mijn wijzigingen alsnog toe (voorgaande notities worden bewaard, maar sommige kunnen overschreden worden) - notice_issue_update_conflict: Dit incident is reeds geupdate door een andere gebruiker terwijl jij bezig was + notice_issue_update_conflict: Dit issue is reeds geupdate door een andere gebruiker terwijl jij bezig was text_issue_conflict_resolution_cancel: Annuleer mijn wijzigingen en geef pagina opnieuw weer %{link} - permission_manage_related_issues: Beheer gerelateerde incidenten + permission_manage_related_issues: Beheer gerelateerde issues field_auth_source_ldap_filter: LDAP filter - label_search_for_watchers: Zoek om monitoorders toe te voegen + label_search_for_watchers: Zoek om monitors toe te voegen notice_account_deleted: Uw account is permanent verwijderd setting_unsubscribe: Sta gebruikers toe hun eigen account te verwijderen button_delete_my_account: Verwijder mijn account @@ -1065,6 +1065,18 @@ setting_jsonp_enabled: Schakel JSONP support in field_inherit_members: Neem leden over field_closed_on: Gesloten + field_generate_password: Genereer wachtwoord setting_default_projects_tracker_ids: Standaard trackers voor nieuwe projecten label_total_time: Totaal setting_emails_header: Email header + notice_account_not_activated_yet: Je hebt je account nog niet geactiveerd. Om een nieuwe activatie email te ontvangen, klik op deze link. + notice_account_locked: Je account is vergrendeld. + notice_account_register_done: "Account aanmaken is gelukt. Een email met instructies om je account te activeren is gestuurd naar: %{email}." + label_hidden: Verborgen + label_visibility_private: voor mij alleen + label_visibility_roles: alleen voor deze rollen + label_visibility_public: voor elke gebruiker + field_must_change_passwd: Moet wachtwoord wijziging bij volgende keer inloggen + notice_new_password_must_be_different: Het nieuwe wachtwoord mag niet hetzelfde zijn als het huidige wachtwoord + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert beschikbaar (optioneel) diff -Nru redmine-2.3.3/config/locales/no.yml redmine-2.4.2/config/locales/no.yml --- redmine-2.3.3/config/locales/no.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/no.yml 2013-12-23 08:48:39.000000000 +0000 @@ -118,6 +118,7 @@ not_same_project: "hører ikke til samme prosjekt" circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet" cant_link_an_issue_with_a_descendant: "En sak kan ikke kobles mot en av sine undersaker" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Vennligst velg @@ -151,7 +152,7 @@ notice_not_authorized: Du har ikke adgang til denne siden. notice_email_sent: "En e-post er sendt til %{value}" notice_email_error: "En feil oppstod under sending av e-post (%{value})" - notice_feeds_access_key_reseted: Din RSS-tilgangsnøkkel er nullstilt. + notice_feeds_access_key_reseted: Din Atom-tilgangsnøkkel er nullstilt. notice_failed_to_save_issues: "Lykkes ikke å lagre %{count} sak(er) på %{total} valgt: %{ids}." notice_no_issue_selected: "Ingen sak valgt! Vennligst merk sakene du vil endre." notice_account_pending: "Din konto ble opprettet og avventer nå administrativ godkjenning." @@ -568,7 +569,7 @@ label_language_based: Basert på brukerens språk label_sort_by: "Sorter etter %{value}" label_send_test_email: Send en epost-test - label_feeds_access_key_created_on: "RSS tilgangsnøkkel opprettet for %{value} siden" + label_feeds_access_key_created_on: "Atom tilgangsnøkkel opprettet for %{value} siden" label_module_plural: Moduler label_added_time_by: "Lagt til av %{author} for %{age} siden" label_updated_time: "Oppdatert for %{value} siden" @@ -860,11 +861,11 @@ label_revision_id: Revision %{value} label_api_access_key: API tilgangsnøkkel label_api_access_key_created_on: API tilgangsnøkkel opprettet for %{value} siden - label_feeds_access_key: RSS tilgangsnøkkel + label_feeds_access_key: Atom tilgangsnøkkel notice_api_access_key_reseted: Din API tilgangsnøkkel ble resatt. setting_rest_api_enabled: Aktiver REST webservice label_missing_api_access_key: Mangler en API tilgangsnøkkel - label_missing_feeds_access_key: Mangler en RSS tilgangsnøkkel + label_missing_feeds_access_key: Mangler en Atom tilgangsnøkkel button_show: Vis text_line_separated: Flere verdier er tillatt (en linje per verdi). setting_mail_handler_body_delimiters: Avkort epost etter en av disse linjene @@ -1045,8 +1046,8 @@ label_attribute_of_assigned_to: Assignee's %{name} label_attribute_of_fixed_version: Target version's %{name} label_copy_subtasks: Copy subtasks - label_copied_to: copied to - label_copied_from: copied from + label_copied_to: kopiert til + label_copied_from: kopiert fra label_any_issues_in_project: any issues in project label_any_issues_not_in_project: any issues not in project field_private_notes: Private notes @@ -1075,5 +1076,18 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Totalt + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/pl.yml redmine-2.4.2/config/locales/pl.yml --- redmine-2.3.3/config/locales/pl.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/pl.yml 2013-12-23 08:48:39.000000000 +0000 @@ -137,6 +137,7 @@ not_same_project: "nie należy do tego samego projektu" circular_dependency: "Ta relacja może wytworzyć zapętloną zależność" cant_link_an_issue_with_a_descendant: "Zagadnienie nie może zostać powiązane z jednym z własnych podzagadnień" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" support: array: @@ -651,7 +652,6 @@ notice_account_lost_email_sent: E-mail z instrukcjami zmiany hasła został wysłany do Ciebie. notice_account_password_updated: Hasło prawidłowo zmienione. notice_account_pending: "Twoje konto zostało utworzone i oczekuje na zatwierdzenie administratora." - notice_account_register_done: Konto prawidłowo utworzone. notice_account_unknown_email: Nieznany użytkownik. notice_account_updated: Konto prawidłowo zaktualizowane. notice_account_wrong_password: Złe hasło @@ -1103,8 +1103,23 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Ogółem text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + notice_account_register_done: Account was successfully created. An email containing + the instructions to activate your account was sent to %{email}. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/pt-BR.yml redmine-2.4.2/config/locales/pt-BR.yml --- redmine-2.3.3/config/locales/pt-BR.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/pt-BR.yml 2013-12-23 08:48:39.000000000 +0000 @@ -149,6 +149,7 @@ not_same_project: "não pertence ao mesmo projeto" circular_dependency: "Esta relação geraria uma dependência circular" cant_link_an_issue_with_a_descendant: "Uma tarefa não pode ser relaciona a uma de suas subtarefas" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Selecione @@ -181,7 +182,7 @@ notice_not_authorized: Você não está autorizado a acessar esta página. notice_email_sent: "Um e-mail foi enviado para %{value}" notice_email_error: "Ocorreu um erro ao enviar o e-mail (%{value})" - notice_feeds_access_key_reseted: Sua chave RSS foi reconfigurada. + notice_feeds_access_key_reseted: Sua chave Atom foi reconfigurada. notice_failed_to_save_issues: "Problema ao salvar %{count} tarefa(s) de %{total} selecionadas: %{ids}." notice_no_issue_selected: "Nenhuma tarefa selecionada! Por favor, marque as tarefas que você deseja editar." notice_account_pending: "Sua conta foi criada e está aguardando aprovação do administrador." @@ -274,7 +275,7 @@ field_comments: Comentário field_url: URL field_start_page: Página inicial - field_subproject: Sub-projeto + field_subproject: Subprojeto field_hours: Horas field_activity: Atividade field_spent_on: Data @@ -293,7 +294,7 @@ field_parent_title: Página pai setting_app_title: Título da aplicação - setting_app_subtitle: Sub-título da aplicação + setting_app_subtitle: Subtítulo da aplicação setting_welcome_text: Texto de boas-vindas setting_default_language: Idioma padrão setting_login_required: Exigir autenticação @@ -309,8 +310,8 @@ setting_default_projects_public: Novos projetos são públicos por padrão setting_autofetch_changesets: Obter commits automaticamente setting_sys_api_enabled: Ativa WS para gerenciamento do repositório (SVN) - setting_commit_ref_keywords: Palavras de referência - setting_commit_fix_keywords: Palavras de fechamento + setting_commit_ref_keywords: Palavras-chave de referência + setting_commit_fix_keywords: Definição de palavras-chave setting_autologin: Auto-login setting_date_format: Formato da data setting_time_format: Formato de hora @@ -410,8 +411,8 @@ label_auth_source: Modo de autenticação label_auth_source_new: Novo modo de autenticação label_auth_source_plural: Modos de autenticação - label_subproject_plural: Sub-projetos - label_and_its_subprojects: "%{value} e seus sub-projetos" + label_subproject_plural: Subprojetos + label_and_its_subprojects: "%{value} e seus subprojetos" label_min_max_length: Tamanho mín-máx label_list: Lista label_date: Data @@ -563,7 +564,7 @@ label_commits_per_month: Commits por mês label_commits_per_author: Commits por autor label_view_diff: Ver diferenças - label_diff_inline: inline + label_diff_inline: em linha label_diff_side_by_side: lado a lado label_options: Opções label_copy_workflow_from: Copiar fluxo de trabalho de @@ -607,16 +608,16 @@ label_language_based: Com base no idioma do usuário label_sort_by: "Ordenar por %{value}" label_send_test_email: Enviar um e-mail de teste - label_feeds_access_key_created_on: "chave de acesso RSS criada %{value} atrás" + label_feeds_access_key_created_on: "chave de acesso Atom criada %{value} atrás" label_module_plural: Módulos label_added_time_by: "Adicionado por %{author} %{age} atrás" label_updated_time: "Atualizado %{value} atrás" label_jump_to_a_project: Ir para o projeto... label_file_plural: Arquivos - label_changeset_plural: Changesets + label_changeset_plural: Conjunto de alterações label_default_columns: Colunas padrão label_no_change_option: (Sem alteração) - label_bulk_edit_selected_issues: Edição em massa das tarefas selecionados. + label_bulk_edit_selected_issues: Edição em massa das tarefas selecionadas. label_theme: Tema label_default: Padrão label_search_titles_only: Pesquisar somente títulos @@ -714,7 +715,7 @@ text_user_mail_option: "Para projetos (não selecionados), você somente receberá notificações sobre o que você está observando ou está envolvido (ex. tarefas das quais você é o autor ou que estão atribuídas a você)" text_no_configuration_data: "Os Papéis, tipos de tarefas, situação de tarefas e fluxos de trabalho não foram configurados ainda.\nÉ altamente recomendado carregar as configurações padrão. Você poderá modificar estas configurações assim que carregadas." text_load_default_configuration: Carregar a configuração padrão - text_status_changed_by_changeset: "Aplicado no changeset %{value}." + text_status_changed_by_changeset: "Aplicado no conjunto de alterações %{value}." text_issues_destroy_confirmation: 'Você tem certeza que deseja excluir a(s) tarefa(s) selecionada(s)?' text_select_project_modules: 'Selecione módulos para habilitar para este projeto:' text_default_administrator_account_changed: Conta padrão do administrador alterada @@ -761,10 +762,10 @@ permission_view_files: Ver arquivos permission_edit_issues: Editar tarefas permission_edit_own_time_entries: Editar o próprio tempo de trabalho - permission_manage_public_queries: Gerenciar consultas publicas + permission_manage_public_queries: Gerenciar consultas públicas permission_add_issues: Adicionar tarefas permission_log_time: Adicionar tempo gasto - permission_view_changesets: Ver changesets + permission_view_changesets: Ver conjunto de alterações permission_view_time_entries: Ver tempo gasto permission_manage_versions: Gerenciar versões permission_manage_wiki: Gerenciar wiki @@ -793,7 +794,7 @@ permission_delete_issues: Excluir tarefas permission_view_issue_watchers: Ver lista de observadores permission_manage_repository: Gerenciar repositório - permission_commit_access: Acesso de commit + permission_commit_access: Acesso do commit permission_browse_repository: Pesquisar repositório permission_view_documents: Ver documentos permission_edit_project: Editar projeto @@ -819,7 +820,7 @@ label_display: Exibição field_editable: Editável setting_repository_log_display_limit: Número máximo de revisões exibidas no arquivo de log - setting_file_max_size_displayed: Tamanho máximo dos arquivos textos exibidos inline + setting_file_max_size_displayed: Tamanho máximo dos arquivos textos exibidos em linha field_identity_urler: Observador setting_openid: Permitir Login e Registro via OpenID field_identity_url: OpenID URL @@ -846,8 +847,8 @@ permission_add_project: Criar projeto setting_new_project_user_role_id: Papel atribuído a um usuário não-administrador que cria um projeto label_view_all_revisions: Ver todas as revisões - label_tag: Etiqueta - label_branch: Ramo + label_tag: Tag + label_branch: Branch text_journal_changed: "%{label} alterado de %{old} para %{new}" text_journal_set_to: "%{label} ajustado para %{value}" text_journal_deleted: "%{label} excluído (%{old})" @@ -860,13 +861,13 @@ enumeration_system_activity: Atividade do sistema permission_delete_issue_watchers: Excluir observadores version_status_closed: fechado - version_status_locked: travado + version_status_locked: bloqueado version_status_open: aberto error_can_not_reopen_issue_on_closed_version: Uma tarefa atribuída a uma versão fechada não pode ser reaberta label_user_anonymous: Anônimo button_move_and_follow: Mover e seguir setting_default_projects_modules: Módulos habilitados por padrão para novos projetos - setting_gravatar_default: Imagem-padrão de Gravatar + setting_gravatar_default: Imagem-padrão do Gravatar field_sharing: Compartilhamento label_version_sharing_hierarchy: Com a hierarquia do projeto label_version_sharing_system: Com todos os projetos @@ -895,27 +896,27 @@ label_api_access_key: Chave de acesso a API button_show: Exibir label_api_access_key_created_on: Chave de acesso a API criado a %{value} atrás - label_feeds_access_key: Chave de acesso ao RSS + label_feeds_access_key: Chave de acesso ao Atom notice_api_access_key_reseted: Sua chave de acesso a API foi redefinida. setting_rest_api_enabled: Habilitar a api REST label_missing_api_access_key: Chave de acesso a API faltando - label_missing_feeds_access_key: Chave de acesso ao RSS faltando + label_missing_feeds_access_key: Chave de acesso ao Atom faltando text_line_separated: Múltiplos valores permitidos (uma linha para cada valor). setting_mail_handler_body_delimiters: Truncar e-mails após uma destas linhas permission_add_subprojects: Criar subprojetos label_subproject_new: Novo subprojeto text_own_membership_delete_confirmation: |- - Você está para excluir algumas de suas próprias permissões e pode não mais estar apto a editar este projeto após esta operação. + Você irá excluir algumas de suas próprias permissões e não estará mais apto a editar este projeto após esta operação. Você tem certeza que deseja continuar? label_close_versions: Fechar versões concluídas label_board_sticky: Marcado - label_board_locked: Travado + label_board_locked: Bloqueado permission_export_wiki_pages: Exportar páginas wiki setting_cache_formatted_text: Realizar cache de texto formatado permission_manage_project_activities: Gerenciar atividades do projeto error_unable_delete_issue_status: Não foi possível excluir situação da tarefa label_profile: Perfil - permission_manage_subtasks: Gerenciar sub-tarefas + permission_manage_subtasks: Gerenciar subtarefas field_parent_issue: Tarefa pai label_subtask_plural: Subtarefas label_project_copy_notifications: Enviar notificações por e-mail ao copiar projeto @@ -925,7 +926,7 @@ error_can_not_delete_tracker: Este tipo de tarefa está atribuído a alguma(s) tarefa(s) e não pode ser excluído. field_principal: Principal label_my_page_block: Meu bloco de página - notice_failed_to_save_members: "Falha ao gravar membro(s): %{errors}." + notice_failed_to_save_members: "Falha ao salvar membro(s): %{errors}." text_zoom_out: Afastar zoom text_zoom_in: Aproximar zoom notice_unable_delete_time_entry: Não foi possível excluir a entrada no registro de horas trabalhadas. @@ -940,7 +941,7 @@ label_user_mail_option_only_my_events: Somente para as coisas que eu esteja observando ou esteja envolvido label_user_mail_option_only_assigned: Somente para as coisas que estejam atribuídas a mim label_user_mail_option_none: Sem eventos - field_member_of_group: Grupo do responsável + field_member_of_group: Responsável pelo grupo field_assigned_to_role: Papel do responsável notice_not_authorized_archived_project: O projeto que você está tentando acessar foi arquivado. label_principal_search: "Pesquisar por usuários ou grupos:" @@ -948,12 +949,12 @@ field_visible: Visível setting_emails_header: Cabeçalho do e-mail setting_commit_logtime_activity_id: Atividade para registrar horas - text_time_logged_by_changeset: Aplicado no changeset %{value}. + text_time_logged_by_changeset: Aplicado no conjunto de alterações %{value}. setting_commit_logtime_enabled: Habilitar registro de horas notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max}) - setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt + setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gantt field_warn_on_leaving_unsaved: Alertar-me ao sair de uma página sem salvar o texto - text_warn_on_leaving_unsaved: A página atual contem texto que não foi salvo e será perdido se você sair desta página. + text_warn_on_leaving_unsaved: A página atual contém texto que não foi salvo e será perdido se você sair desta página. label_my_queries: Minhas consultas personalizadas text_journal_changed_no_detail: "%{label} atualizado(a)" label_news_comment_added: Notícia recebeu um comentário @@ -993,30 +994,30 @@ label_diff: diff text_git_repository_note: "Repositório esta vazio e é local (ex: /gitrepo, c:\\gitrepo)" - description_query_sort_criteria_direction: Direção da ordenação + description_query_sort_criteria_direction: Escolher ordenação description_project_scope: Escopo da pesquisa description_filter: Filtro description_user_mail_notification: Configuração de notificações por e-mail - description_date_from: Digita a data inicial + description_date_from: Digite a data inicial description_message_content: Conteúdo da mensagem description_available_columns: Colunas disponíveis description_date_range_interval: Escolha um período selecionando a data de início e fim description_issue_category_reassign: Escolha uma categoria de tarefas - description_search: Searchfield + description_search: Campo de busca description_notes: Notas - description_date_range_list: Escolha um período a partira da lista + description_date_range_list: Escolha um período a partir da lista description_choose_project: Projetos description_date_to: Digite a data final description_query_sort_criteria_attribute: Atributo de ordenação description_wiki_subpages_reassign: Escolha uma nova página pai description_selected_columns: Colunas selecionadas - label_parent_revision: Pais - label_child_revision: Filhos + label_parent_revision: Pai + label_child_revision: Filho error_scm_annotate_big_text_file: A entrada não pode ser anotada, pois excede o tamanho máximo do arquivo de texto. setting_default_issue_start_date_to_creation_date: Usar data corrente como data inicial para novas tarefas button_edit_section: Editar esta seção - setting_repositories_encodings: Encoding dos repositórios e anexos + setting_repositories_encodings: Codificação dos repositórios e anexos description_all_columns: Todas as colunas button_export: Exportar label_export_options: "Opções de exportação %{export_format}" @@ -1030,36 +1031,36 @@ field_repository_is_default: Repositório principal label_copy_attachments: Copiar anexos label_item_position: "%{position}/%{count}" - label_completed_versions: Versões completadas - text_project_identifier_info: Somente letras minúsculas (az), números, traços e sublinhados são permitidos.
    Uma vez salvo, o identificador não pode ser alterado. - field_multiple: Multiplos valores + label_completed_versions: Versões concluídas + text_project_identifier_info: Somente letras minúsculas (a-z), números, traços e sublinhados são permitidos.
    Uma vez salvo, o identificador não pode ser alterado. + field_multiple: Múltiplos valores setting_commit_cross_project_ref: Permitir que tarefas de todos os outros projetos sejam refenciadas e resolvidas - text_issue_conflict_resolution_add_notes: Adicione minhas anotações e descartar minhas outras mudanças - text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações de qualquer maneira (notas anteriores serão mantidos, mas algumas mudanças podem ser substituídos) + text_issue_conflict_resolution_add_notes: Adicionar minhas anotações e descartar minhas outras mudanças + text_issue_conflict_resolution_overwrite: Aplicar as minhas alterações de qualquer maneira (notas anteriores serão mantidas, mas algumas mudanças podem ser substituídas) notice_issue_update_conflict: A tarefa foi atualizada por um outro usuário, enquanto você estava editando. - text_issue_conflict_resolution_cancel: Descartar todas as minhas mudanças e re-exibir %{link} + text_issue_conflict_resolution_cancel: Descartar todas as minhas mudanças e reexibir %{link} permission_manage_related_issues: Gerenciar tarefas relacionadas field_auth_source_ldap_filter: Filtro LDAP label_search_for_watchers: Procurar por outros observadores para adiconar notice_account_deleted: Sua conta foi excluída permanentemente. - setting_unsubscribe: Permitir aos usuários excluir sua conta própria + setting_unsubscribe: Permitir aos usuários excluir sua própria conta button_delete_my_account: Excluir minha conta text_account_destroy_confirmation: |- - Tem certeza de que quer continuar? - Sua conta será excluída permanentemente, sem qualquer forma de reativá-lo. + Tem certeza que quer continuar? + Sua conta será excluída permanentemente, sem qualquer forma de reativá-la. error_session_expired: A sua sessão expirou. Por favor, faça login novamente. text_session_expiration_settings: "Aviso: a alteração dessas configurações pode expirar as sessões atuais, incluindo a sua." setting_session_lifetime: duração máxima da sessão setting_session_timeout: tempo limite de inatividade da sessão label_session_expiration: "Expiração da sessão" permission_close_project: Fechar / reabrir o projeto - label_show_closed_projects: Visualização de projetos fechados + label_show_closed_projects: Visualizar projetos fechados button_close: Fechar button_reopen: Reabrir project_status_active: ativo project_status_closed: fechado project_status_archived: arquivado - text_project_closed: Este projeto é fechado e somente leitura. + text_project_closed: Este projeto está fechado e somente leitura. notice_user_successful_create: Usuário %{id} criado. field_core_fields: campos padrão field_timeout: Tempo de espera (em segundos) @@ -1073,37 +1074,50 @@ field_board_parent: Fórum Pai label_attribute_of_project: "Projeto %{name}" label_attribute_of_author: "autor %{name}" - label_attribute_of_assigned_to: "atribuído %{name}" - label_attribute_of_fixed_version: "versão alvo %{name}" - label_copy_subtasks: Copiar sub-tarefas + label_attribute_of_assigned_to: "atribuído a %{name}" + label_attribute_of_fixed_version: "versão %{name}" + label_copy_subtasks: Copiar subtarefas label_copied_to: copiada label_copied_from: copiado - label_any_issues_in_project: quaisquer problemas em projeto - label_any_issues_not_in_project: todas as questões que não estão em projeto + label_any_issues_in_project: qualquer tarefa do projeto + label_any_issues_not_in_project: qualquer tarefa que não está no projeto field_private_notes: notas privadas permission_view_private_notes: Ver notas privadas permission_set_notes_private: Permitir alterar notas para privada - label_no_issues_in_project: sem problemas em projeto + label_no_issues_in_project: sem tarefas no projeto label_any: todos label_last_n_weeks: "últimas %{count} semanas" - setting_cross_project_subtasks: Permitir cruzamento de sub-tarefas entre projetos - label_cross_project_descendants: com sub-Projetos - label_cross_project_tree: Com uma Árvore fazer o Projeto - label_cross_project_hierarchy: Com uma hierarquia fazer o Projeto - label_cross_project_system: Com de Todos os Projetos - button_hide: Esconder + setting_cross_project_subtasks: Permitir subtarefas entre projetos + label_cross_project_descendants: com subprojetos + label_cross_project_tree: Com a árvore do Projeto + label_cross_project_hierarchy: Com uma hierarquia do Projeto + label_cross_project_system: Com todos os Projetos + button_hide: Omitir setting_non_working_week_days: dias não úteis - label_in_the_next_days: na próxima - label_in_the_past_days: no passado + label_in_the_next_days: nos próximos dias + label_in_the_past_days: nos dias anteriores label_attribute_of_user: Usuário %{name} - text_turning_multiple_off: Se você desativar vários valores, vários valores serão removidas, a fim de preservar a somente um valor por item. - label_attribute_of_issue: Emissão de %{name} + text_turning_multiple_off: Se você desativar vários valores, eles serão removidos, a fim de preservar somente um valor por item. + label_attribute_of_issue: Tarefa %{name} permission_add_documents: Adicionar documentos permission_edit_documents: Editar documentos - permission_delete_documents: excluir documentos + permission_delete_documents: Excluir documentos label_gantt_progress_line: Linha de progresso setting_jsonp_enabled: Ativar suporte JSONP field_inherit_members: Herdar membros - field_closed_on: Fechado + field_closed_on: Concluído + field_generate_password: Gerar senha setting_default_projects_tracker_ids: Tipos padrões para novos projeto label_total_time: Total + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/pt.yml redmine-2.4.2/config/locales/pt.yml --- redmine-2.3.3/config/locales/pt.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/pt.yml 2013-12-23 08:48:39.000000000 +0000 @@ -137,6 +137,7 @@ not_same_project: "não pertence ao mesmo projecto" circular_dependency: "Esta relação iria criar uma dependência circular" cant_link_an_issue_with_a_descendant: "Não é possível ligar uma tarefa a uma sub-tarefa que lhe é pertencente" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" ## Translated by: Pedro Araújo actionview_instancetag_blank_option: Seleccione @@ -156,7 +157,6 @@ notice_account_invalid_creditentials: Utilizador ou palavra-chave inválidos. notice_account_password_updated: A palavra-chave foi alterada com sucesso. notice_account_wrong_password: Palavra-chave errada. - notice_account_register_done: A conta foi criada com sucesso. notice_account_unknown_email: Utilizador desconhecido. notice_can_t_change_password: Esta conta utiliza uma fonte de autenticação externa. Não é possível alterar a palavra-chave. notice_account_lost_email_sent: Foi-lhe enviado um e-mail com as instruções para escolher uma nova palavra-chave. @@ -170,7 +170,7 @@ notice_not_authorized: Não está autorizado a visualizar esta página. notice_email_sent: "Foi enviado um e-mail para %{value}" notice_email_error: "Ocorreu um erro ao enviar o e-mail (%{value})" - notice_feeds_access_key_reseted: A sua chave de RSS foi inicializada. + notice_feeds_access_key_reseted: A sua chave de Atom foi inicializada. notice_failed_to_save_issues: "Não foi possível guardar %{count} tarefa(s) das %{total} seleccionadas: %{ids}." notice_no_issue_selected: "Nenhuma tarefa seleccionada! Por favor, seleccione as tarefas que quer editar." notice_account_pending: "A sua conta foi criada e está agora à espera de aprovação do administrador." @@ -594,7 +594,7 @@ label_language_based: Baseado na língua do utilizador label_sort_by: "Ordenar por %{value}" label_send_test_email: enviar um e-mail de teste - label_feeds_access_key_created_on: "Chave RSS criada há %{value} atrás" + label_feeds_access_key_created_on: "Chave Atom criada há %{value} atrás" label_module_plural: Módulos label_added_time_by: "Adicionado por %{author} há %{age} atrás" label_updated_time: "Alterado há %{value} atrás" @@ -879,11 +879,11 @@ label_revision_id: Revisão %{value} label_api_access_key: Chave de acesso API label_api_access_key_created_on: Chave de acesso API criada há %{value} - label_feeds_access_key: Chave de acesso RSS + label_feeds_access_key: Chave de acesso Atom notice_api_access_key_reseted: A sua chave de acesso API foi reinicializada. setting_rest_api_enabled: Activar serviço Web REST label_missing_api_access_key: Chave de acesso API em falta - label_missing_feeds_access_key: Chave de acesso RSS em falta + label_missing_feeds_access_key: Chave de acesso Atom em falta button_show: Mostrar text_line_separated: Vários valores permitidos (uma linha para cada valor). setting_mail_handler_body_delimiters: Truncar mensagens de correio electrónico após uma destas linhas @@ -1091,5 +1091,19 @@ setting_jsonp_enabled: Activar suporte JSONP field_inherit_members: Herdar membros field_closed_on: Fechado + field_generate_password: Gerar palavra-chave setting_default_projects_tracker_ids: Tipo de tarefa padrão para novos projectos label_total_time: Total + notice_account_not_activated_yet: Ainda não activou a sua conta. Se quiser + receber um novo email de activação, por favor carregue nesta ligação. + notice_account_locked: A sua conta está bloqueada. + notice_account_register_done: A conta foi criada com sucesso. Um email contendo + as instruções para activar a sua conta foi enviado para %{email}. + label_hidden: Escondido + label_visibility_private: apenas para mim + label_visibility_roles: apenas para estas funções + label_visibility_public: para qualquer utilizador + field_must_change_passwd: Tem que alterar a palavra-passe no próximo início de sessão + notice_new_password_must_be_different: A palavra-passe tem de ser diferente da actual + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/ro.yml redmine-2.4.2/config/locales/ro.yml --- redmine-2.3.3/config/locales/ro.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/ro.yml 2013-12-23 08:48:39.000000000 +0000 @@ -124,6 +124,7 @@ not_same_project: "trebuie să aparțină aceluiași proiect" circular_dependency: "Această relație ar crea o dependență circulară" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Selectați @@ -156,7 +157,7 @@ notice_not_authorized: Nu sunteți autorizat sa accesați această pagină. notice_email_sent: "S-a trimis un email către %{value}" notice_email_error: "A intervenit o eroare la trimiterea de email (%{value})" - notice_feeds_access_key_reseted: Cheia de acces RSS a fost resetată. + notice_feeds_access_key_reseted: Cheia de acces Atom a fost resetată. notice_failed_to_save_issues: "Nu s-au putut salva %{count} tichete din cele %{total} selectate: %{ids}." notice_no_issue_selected: "Niciun tichet selectat! Vă rugăm să selectați tichetele pe care doriți să le editați." notice_account_pending: "Contul dumneavoastră a fost creat și așteaptă aprobarea administratorului." @@ -868,11 +869,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1077,8 +1078,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/ru.yml redmine-2.4.2/config/locales/ru.yml --- redmine-2.3.3/config/locales/ru.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/ru.yml 2013-12-23 08:48:39.000000000 +0000 @@ -206,6 +206,7 @@ not_same_project: "не относится к одному проекту" circular_dependency: "Такая связь приведет к циклической зависимости" cant_link_an_issue_with_a_descendant: "Задача не может быть связана со своей подзадачей" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" support: array: @@ -498,8 +499,8 @@ label_equals: соответствует label_example: Пример label_export_to: Экспортировать в - label_feed_plural: RSS - label_feeds_access_key_created_on: "Ключ доступа RSS создан %{value} назад" + label_feed_plural: Atom + label_feeds_access_key_created_on: "Ключ доступа Atom создан %{value} назад" label_f_hour: "%{value} час" label_f_hour_plural: "%{value} часов" label_file_added: Добавлен файл @@ -717,31 +718,31 @@ label_workflow: Последовательность действий label_x_closed_issues_abbr: zero: "0 закрыто" - one: "1 закрыт" + one: "%{count} закрыта" few: "%{count} закрыто" many: "%{count} закрыто" other: "%{count} закрыто" label_x_comments: zero: "нет комментариев" - one: "1 комментарий" + one: "%{count} комментарий" few: "%{count} комментария" many: "%{count} комментариев" other: "%{count} комментариев" label_x_open_issues_abbr: zero: "0 открыто" - one: "1 открыт" + one: "%{count} открыта" few: "%{count} открыто" many: "%{count} открыто" other: "%{count} открыто" label_x_open_issues_abbr_on_total: zero: "0 открыто / %{total}" - one: "1 открыт / %{total}" + one: "%{count} открыта / %{total}" few: "%{count} открыто / %{total}" many: "%{count} открыто / %{total}" other: "%{count} открыто / %{total}" label_x_projects: zero: "нет проектов" - one: "1 проект" + one: "%{count} проект" few: "%{count} проекта" many: "%{count} проектов" other: "%{count} проектов" @@ -774,7 +775,7 @@ notice_email_sent: "Отправлено письмо %{value}" notice_failed_to_save_issues: "Не удалось сохранить %{count} пункт(ов) из %{total} выбранных: %{ids}." notice_failed_to_save_members: "Не удалось сохранить участника(ов): %{errors}." - notice_feeds_access_key_reseted: Ваш ключ доступа RSS был сброшен. + notice_feeds_access_key_reseted: Ваш ключ доступа Atom был сброшен. notice_file_not_found: Страница, на которую Вы пытаетесь зайти, не существует или удалена. notice_locking_conflict: Информация обновлена другим пользователем. notice_no_issue_selected: "Не выбрано ни одной задачи! Пожалуйста, отметьте задачи, которые Вы хотите отредактировать." @@ -866,7 +867,7 @@ setting_display_subprojects_issues: Отображение подпроектов по умолчанию setting_emails_footer: Подстрочные примечания письма setting_enabled_scm: Включённые SCM - setting_feeds_limit: Ограничение количества заголовков для RSS потока + setting_feeds_limit: Ограничение количества заголовков для Atom потока setting_file_max_size_displayed: Максимальный размер текстового файла для отображения setting_gravatar_enabled: Использовать аватар пользователя из Gravatar setting_host_name: Имя компьютера @@ -907,7 +908,7 @@ text_email_delivery_not_configured: "Параметры работы с почтовым сервером не настроены и функция уведомления по email не активна.\nНастроить параметры для Вашего SMTP-сервера Вы можете в файле config/configuration.yml. Для применения изменений перезапустите приложение." text_enumeration_category_reassign_to: 'Назначить им следующее значение:' text_enumeration_destroy_question: "%{count} объект(а,ов) связаны с этим значением." - text_file_repository_writable: Хранилище с доступом на запись + text_file_repository_writable: Хранилище файлов доступно для записи text_issue_added: "Создана новая задача %{id} (%{author})." text_issue_category_destroy_assignments: Удалить назначения категории text_issue_category_destroy_question: "Несколько задач (%{count}) назначено в данную категорию. Что Вы хотите предпринять?" @@ -922,7 +923,7 @@ text_load_default_configuration: Загрузить конфигурацию по умолчанию text_min_max_length_info: 0 означает отсутствие ограничений text_no_configuration_data: "Роли, трекеры, статусы задач и оперативный план не были сконфигурированы.\nНастоятельно рекомендуется загрузить конфигурацию по-умолчанию. Вы сможете её изменить потом." - text_plugin_assets_writable: Каталог модулей доступен для записи + text_plugin_assets_writable: Каталог ресурсов модулей доступен для записи text_project_destroy_confirmation: Вы настаиваете на удалении данного проекта и всей относящейся к нему информации? text_reassign_time_entries: 'Перенести зарегистрированное время на следующую задачу:' text_regexp_info: "например: ^[A-Z0-9]+$" @@ -1005,12 +1006,12 @@ permission_view_issues: Просмотр задач label_display_used_statuses_only: Отображать только те статусы, которые используются в этом трекере label_api_access_key_created_on: Ключ доступ к API был создан %{value} назад - label_feeds_access_key: Ключ доступа к RSS + label_feeds_access_key: Ключ доступа к Atom notice_api_access_key_reseted: Ваш ключ доступа к API был сброшен. setting_rest_api_enabled: Включить веб-сервис REST button_show: Показать label_missing_api_access_key: Отсутствует ключ доступа к API - label_missing_feeds_access_key: Отсутствует ключ доступа к RSS + label_missing_feeds_access_key: Отсутствует ключ доступа к Atom setting_mail_handler_body_delimiters: Урезать письмо после одной из этих строк permission_add_subprojects: Создание подпроектов label_subproject_new: Новый подпроект @@ -1129,14 +1130,14 @@ permission_manage_related_issues: Управление связанными задачами field_auth_source_ldap_filter: Фильтр LDAP label_search_for_watchers: Найти наблюдателей - notice_account_deleted: "Ваша учетная запись полностью удалена" - setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" - button_delete_my_account: "Удалить мою учетную запись" - text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" + notice_account_deleted: "Ваша учетная запись полностью удалена" + setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" + button_delete_my_account: "Удалить мою учетную запись" + text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз text_session_expiration_settings: "Внимание! Изменение этих настроек может привести к завершению текущих сессий, включая вашу." setting_session_lifetime: Максимальная продолжительность сессии - setting_session_timeout: Таймут сессии + setting_session_timeout: Таймаут сессии label_session_expiration: Срок истечения сессии permission_close_project: Закрывать / открывать проекты label_show_closed_projects: Просматривать закрытые проекты @@ -1195,5 +1196,17 @@ setting_jsonp_enabled: Поддержка JSONP field_inherit_members: Наследовать участников field_closed_on: Закрыта + field_generate_password: Создание пароля setting_default_projects_tracker_ids: Трекеры по умолчанию для новых проектов label_total_time: Общее время + notice_account_not_activated_yet: Вы пока не имеете активированных учетных записей. + Чтобы получить письмо с активацией, перейдите по ссылке. + notice_account_locked: Ваша учетная запись заблокирована. + label_hidden: Скрытый + label_visibility_private: только мне + label_visibility_roles: только этим ролям + label_visibility_public: всем пользователям + field_must_change_passwd: Изменить пароль при следующем входе + notice_new_password_must_be_different: Новый пароль должен отличаться от текущего + setting_mail_handler_excluded_filenames: Исключать вложения по имени + text_convert_available: Доступно использование ImageMagick (необязательно) diff -Nru redmine-2.3.3/config/locales/sk.yml redmine-2.4.2/config/locales/sk.yml --- redmine-2.3.3/config/locales/sk.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/sk.yml 2013-12-23 08:48:39.000000000 +0000 @@ -1,3 +1,6 @@ +# Slovak translation by Stanislav Pach | stano.pach@seznam.cz +# additions for Redmine 2.3.2 and proofreading by Katarína Nosková | noskova.katarina@gmail.com + sk: direction: ltr date: @@ -24,8 +27,8 @@ time: "%H:%M" short: "%d %b %H:%M" long: "%B %d, %Y %H:%M" - am: "am" - pm: "pm" + am: "dopoludnia" + pm: "popoludní" datetime: distance_in_words: @@ -40,11 +43,11 @@ one: "menej ako minúta" other: "menej ako %{count} minút" x_minutes: - one: "1 minuta" + one: "1 minúta" other: "%{count} minút" about_x_hours: - one: "okolo 1 hodiny" - other: "okolo %{count} hodín" + one: "približne 1 hodinu" + other: "približne %{count} hodín" x_hours: one: "1 hodina" other: "%{count} hodín" @@ -52,20 +55,20 @@ one: "1 deň" other: "%{count} dní" about_x_months: - one: "okolo 1 mesiaca" - other: "okolo %{count} mesiace/ov" + one: "približne 1 mesiac" + other: "približne %{count} mesiacov" x_months: one: "1 mesiac" - other: "%{count} mesiace/ov" + other: "%{count} mesiacov" about_x_years: - one: "okolo 1 roka" - other: "okolo %{count} roky/ov" + one: "približne 1 rok" + other: "približne %{count} rokov" over_x_years: - one: "cez 1 rok" - other: "cez %{count} roky/ov" + one: "viac ako 1 rok" + other: "viac ako %{count} rokov" almost_x_years: - one: "almost 1 year" - other: "almost %{count} years" + one: "takmer 1 rok" + other: "takmer %{count} rokov" number: format: @@ -75,18 +78,18 @@ human: format: - precision: 3 delimiter: "" + precision: 3 storage_units: format: "%n %u" units: - kb: KB - tb: TB - gb: GB byte: - one: Byte - other: Bytes - mb: MB + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" # Used in array.to_sentence. support: @@ -98,37 +101,36 @@ errors: template: header: - one: "1 error prohibited this %{model} from being saved" - other: "%{count} errors prohibited this %{model} from being saved" + one: "1 chyba bráni uloženiu %{model}" + other: "%{count} chýb bráni uloženiu %{model}" messages: - inclusion: "nieje zahrnuté v zozname" - exclusion: "je rezervované" + inclusion: "nie je zahrnuté v zozname" + exclusion: "nie je k dispozícii" invalid: "je neplatné" confirmation: "sa nezhoduje s potvrdením" accepted: "musí byť akceptované" empty: "nemôže byť prázdne" blank: "nemôže byť prázdne" - too_long: "je príliš dlhé" - too_short: "je príliš krátke" - wrong_length: "má chybnú dĺžku" + too_long: "je príliš dlhé (maximálne %{count} znakov)" + too_short: "je príliš krátke (minimálne %{count} znakov)" + wrong_length: "má nesprávnu dĺžku (vyžaduje sa %{count} znakov)" taken: "je už použité" - not_a_number: "nieje číslo" - not_a_date: "nieje platný dátum" - greater_than: "musí byť väčšíe ako %{count}" - greater_than_or_equal_to: "musí byť väčšie alebo rovné %{count}" + not_a_number: "nie je číslo" + not_a_date: "nie je platný dátum" + greater_than: "musí byť viac ako %{count}" + greater_than_or_equal_to: "musí byť viac alebo rovné %{count}" equal_to: "musí byť rovné %{count}" less_than: "musí byť menej ako %{count}" less_than_or_equal_to: "musí byť menej alebo rovné %{count}" odd: "musí byť nepárne" even: "musí byť párne" greater_than_start_date: "musí byť neskôr ako počiatočný dátum" - not_same_project: "nepatrí rovnakému projektu" + not_same_project: "nepatrí k rovnakému projektu" circular_dependency: "Tento vzťah by vytvoril cyklickú závislosť" - cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" - - # SK translation by Stanislav Pach | stano.pach@seznam.cz + cant_link_an_issue_with_a_descendant: "Nemožno prepojiť úlohu s niektorou z podúloh" + earlier_than_minimum_start_date: "nemôže byť skorší ako %{date} z dôvodu nadväznosti na predchádzajúce úlohy" - actionview_instancetag_blank_option: Prosím vyberte + actionview_instancetag_blank_option: Vyberte general_text_No: 'Nie' general_text_Yes: 'Áno' @@ -142,48 +144,48 @@ general_first_day_of_week: '1' notice_account_updated: Účet bol úspešne zmenený. - notice_account_invalid_creditentials: Chybné meno alebo heslo + notice_account_invalid_creditentials: Nesprávne meno alebo heslo notice_account_password_updated: Heslo bolo úspešne zmenené. - notice_account_wrong_password: Chybné heslo - notice_account_register_done: Účet bol úspešne vytvorený. Pre aktiváciu účtu kliknite na odkaz v emailu, ktorý vam bol zaslaný. - notice_account_unknown_email: Neznámy užívateľ. - notice_can_t_change_password: Tento účet používa externú autentifikáciu. Tu heslo zmeniť nemôžete. - notice_account_lost_email_sent: Bol vám zaslaný email s inštrukciami ako si nastavite nové heslo. + notice_account_wrong_password: Nesprávne heslo + notice_account_register_done: Účet bol úspešne vytvorený. Účet aktivujete kliknutím na odkaz v emaile, ktorý vám bol zaslaný na %{email}. + notice_account_unknown_email: Neznámy používateľ. + notice_can_t_change_password: Tento účet používa externú autentifikáciu. Nemôžete zmeniť heslo. + notice_account_lost_email_sent: Bol vám zaslaný email s inštrukciami, ako si nastaviť nové heslo. notice_account_activated: Váš účet bol aktivovaný. Teraz se môžete prihlásiť. notice_successful_create: Úspešne vytvorené. notice_successful_update: Úspešne aktualizované. notice_successful_delete: Úspešne odstránené. notice_successful_connection: Úspešne pripojené. - notice_file_not_found: Stránka, ktorú se snažíte zobraziť, neexistuje alebo bola zmazaná. - notice_locking_conflict: Údaje boli zmenené iným užívateľom. - notice_scm_error: Položka a/alebo revízia neexistuje v repozitári. - notice_not_authorized: Nemáte dostatočné práva pre zobrazenie tejto stránky. - notice_email_sent: "Na adresu %{value} bol odeslaný email" - notice_email_error: "Pri odosielaní emailu nastala chyba (%{value})" - notice_feeds_access_key_reseted: Váš klúč pre prístup k Atomu bol resetovaný. - notice_failed_to_save_issues: "Nastala chyba pri ukládaní %{count} úloh na %{total} zvolený: %{ids}." - notice_no_issue_selected: "Nebola zvolená žiadná úloha. Prosím, zvoľte úlohy, ktoré chcete upraviť" - notice_account_pending: "Váš účet bol vytvorený, teraz čaká na schválenie administrátorom." - notice_default_data_loaded: Výchozia konfigurácia úspešne nahraná. - - error_can_t_load_default_data: "Výchozia konfigurácia nebola nahraná: %{value}" - error_scm_not_found: "Položka a/alebo revízia neexistuje v repozitári." - error_scm_command_failed: "Pri pokuse o prístup k repozitári došlo k chybe: %{value}" - error_issue_not_found_in_project: 'Úloha nebola nájdená alebo nepatrí k tomuto projektu' - - mail_subject_lost_password: "Vaše heslo (%{value})" - mail_body_lost_password: 'Pre zmenu vašeho hesla kliknite na následujúci odkaz:' - mail_subject_register: "Aktivácia účtu (%{value})" - mail_body_register: 'Pre aktiváciu vašeho účtu kliknite na následujúci odkaz:' - mail_body_account_information_external: "Pomocou vašeho účtu %{value} se môžete prihlásiť." + notice_file_not_found: Stránka, ktorú se pokúšate zobraziť, neexistuje, alebo bola odstránená. + notice_locking_conflict: Údaje boli aktualizované iným používateľom. + notice_scm_error: Položka a/alebo revízia v repozitári neexistuje. + notice_not_authorized: Nemáte dostatočné oprávnenia na zobrazenie tejto stránky. + notice_email_sent: "Na adresu %{value} bol odoslaný email" + notice_email_error: "Pri odosielaní emailu sa vyskytla chyba (%{value})" + notice_feeds_access_key_reseted: Váš prístupový kľúč k Atomu bol resetovaný. + notice_failed_to_save_issues: "Nepodarilo sa uložiť %{count} úloh z %{total} vybraných: %{ids}." + notice_no_issue_selected: "Nebola vybraná žiadna úloha. Označte prosím úlohy, ktoré chcete upraviť." + notice_account_pending: "Váš účet bol vytvorený a čaká na schválenie administrátorom." + notice_default_data_loaded: Predvolená konfigurácia bola úspešne nahraná. + + error_can_t_load_default_data: "Predvolená konfigurácia nebola nahraná: %{value}" + error_scm_not_found: "Položka alebo revízia nebola v repozitári nájdená." + error_scm_command_failed: "Pri pokuse o prístup k repozitáru sa vyskytla chyba: %{value}" + error_issue_not_found_in_project: 'Úloha nebola nájdená, alebo nepatrí k tomuto projektu' + + mail_subject_lost_password: "Vaše heslo %{value}" + mail_body_lost_password: 'Na zmenu hesla kliknite na nasledujúci odkaz:' + mail_subject_register: "Aktivácia vášho účtu %{value}" + mail_body_register: 'Ak si želáte aktivovať váš účet, kliknite na nasledujúci odkaz:' + mail_body_account_information_external: "Môžete sa prihlásiť pomocou vášho účtu %{value}." mail_body_account_information: Informácie o vašom účte - mail_subject_account_activation_request: "Aktivácia %{value} účtu" - mail_body_account_activation_request: "Bol zaregistrovaný nový uživateľ %{value}. Aktivácia jeho účtu závisí na vašom potvrdení." + mail_subject_account_activation_request: "Požiadavka na aktiváciu účtu %{value}" + mail_body_account_activation_request: "Bol zaregistrovaný nový používateľ %{value}. Účet čaká na vaše schválenie:" - field_name: Názov + field_name: Meno field_description: Popis - field_summary: Prehľad + field_summary: Zhrnutie field_is_required: Povinné pole field_firstname: Meno field_lastname: Priezvisko @@ -197,7 +199,7 @@ field_field_format: Formát field_is_for_all: Pre všetky projekty field_possible_values: Možné hodnoty - field_regexp: Regulérny výraz + field_regexp: Regulárny výraz field_min_length: Minimálna dĺžka field_max_length: Maximálna dĺžka field_value: Hodnota @@ -206,48 +208,48 @@ field_project: Projekt field_issue: Úloha field_status: Stav - field_notes: Poznámka + field_notes: Poznámky field_is_closed: Úloha uzavretá - field_is_default: Východzí stav - field_tracker: Fronta + field_is_default: Predvolený stav + field_tracker: Front field_subject: Predmet - field_due_date: Uzavrieť do + field_due_date: Odovzdať do field_assigned_to: Priradené field_priority: Priorita - field_fixed_version: Priradené k verzii - field_user: Užívateľ + field_fixed_version: Cieľová verzia + field_user: Používateľ field_role: Rola field_homepage: Domovská stránka - field_is_public: Verejný + field_is_public: Verejné field_parent: Nadradený projekt field_is_in_roadmap: Úlohy zobrazené v pláne - field_login: Login - field_mail_notification: Emailové oznámenie + field_login: Prihlasovacie meno + field_mail_notification: Emailové upozornenie field_admin: Administrátor field_last_login_on: Posledné prihlásenie field_language: Jazyk field_effective_date: Dátum field_password: Heslo field_new_password: Nové heslo - field_password_confirmation: Potvrdenie + field_password_confirmation: Potvrdenie hesla field_version: Verzia field_type: Typ field_host: Host field_port: Port field_account: Účet field_base_dn: Base DN - field_attr_login: Prihlásenie (atribut) - field_attr_firstname: Meno (atribut) - field_attr_lastname: Priezvisko (atribut) - field_attr_mail: Email (atribut) - field_onthefly: Automatické vytváranie užívateľov - field_start_date: Začiatok + field_attr_login: Prihlásenie (atribút) + field_attr_firstname: Meno (atribút) + field_attr_lastname: Priezvisko (atribút) + field_attr_mail: Email (atribút) + field_onthefly: Okamžité vytváranie používateľov + field_start_date: Počiatočný dátum field_done_ratio: "% hotovo" field_auth_source: Autentifikačný mód field_hide_mail: Nezobrazovať môj email field_comments: Komentár field_url: URL - field_start_page: Výchozia stránka + field_start_page: Východzia stránka field_subproject: Podprojekt field_hours: Hodiny field_activity: Aktivita @@ -256,46 +258,45 @@ field_is_filter: Použiť ako filter field_issue_to: Súvisiaca úloha field_delay: Oneskorenie - field_assignable: Úlohy môžu byť priradené tejto roli + field_assignable: Úlohy môžu byť priradené tejto role field_redirect_existing_links: Presmerovať existujúce odkazy - field_estimated_hours: Odhadovaná doba + field_estimated_hours: Odhadovaný čas field_column_names: Stĺpce field_time_zone: Časové pásmo - field_searchable: Umožniť vyhľadávanie - field_default_value: Východzia hodnota + field_searchable: Možné prehľadávanie + field_default_value: Predvolená hodnota field_comments_sorting: Zobraziť komentáre setting_app_title: Názov aplikácie setting_app_subtitle: Podtitulok aplikácie setting_welcome_text: Uvítací text - setting_default_language: Východzí jazyk - setting_login_required: Auten. vyžadovaná - setting_self_registration: Povolenie registrácie + setting_default_language: Predvolený jazyk + setting_login_required: Vyžadovaná autentifikácia + setting_self_registration: Povolená registrácia setting_attachment_max_size: Maximálna veľkosť prílohy - setting_issues_export_limit: Limit pre export úloh + setting_issues_export_limit: Maximálny počet úloh pri exporte setting_mail_from: Odosielať emaily z adresy - setting_bcc_recipients: Príjemcovia skrytej kópie (bcc) - setting_host_name: Hostname + setting_bcc_recipients: Príjemcov do skrytej kópie (bcc) + setting_host_name: Hostname a cesta setting_text_formatting: Formátovanie textu setting_wiki_compression: Kompresia histórie Wiki - setting_feeds_limit: Limit zobrazených položiek (Atom feed) + setting_feeds_limit: Maximálny počet zobrazených položiek v Atom feed setting_default_projects_public: Nové projekty nastavovať ako verejné - setting_autofetch_changesets: Automatický prenos zmien - setting_sys_api_enabled: Povolit Webovú Službu (WS) pre správu repozitára - setting_commit_ref_keywords: Klúčové slová pre odkazy - setting_commit_fix_keywords: Klúčové slová pre uzavretie + setting_autofetch_changesets: Automaticky vykonať commity + setting_sys_api_enabled: Povolit Webovú službu (WS) na správu repozitára + setting_commit_ref_keywords: Kľúčové slová pre referencie + setting_commit_fix_keywords: Kľúčové slová pre opravy setting_autologin: Automatické prihlasovanie setting_date_format: Formát dátumu setting_time_format: Formát času - setting_cross_project_issue_relations: Povoliť väzby úloh skrz projekty - setting_issue_list_default_columns: Východzie stĺpce zobrazené v zozname úloh - setting_ itories_encodings: Kódovanie - setting_emails_footer: Zapätie emailov + setting_cross_project_issue_relations: Povoliť prepojenia úloh naprieč projektmi + setting_issue_list_default_columns: Predvolené stĺpce zobrazené v zozname úloh + setting_emails_footer: Pätička emailu setting_protocol: Protokol - setting_per_page_options: Povolené množstvo riadkov na stránke - setting_user_format: Formát zobrazenia užívateľa - setting_activity_days_default: "Zobrazené dni aktivity projektu:" - setting_display_subprojects_issues: Prednastavenie zobrazenia úloh podporojektov v hlavnom projekte + setting_per_page_options: Povolené množstvo položiek na stránku + setting_user_format: Formát zobrazenia používateľa + setting_activity_days_default: "Počet zobrazených dní na stránku pri aktivitách projektu:" + setting_display_subprojects_issues: Predvolené zobrazovanie úloh podprojektov v hlavnom projekte project_module_issue_tracking: Sledovanie úloh project_module_time_tracking: Sledovanie času @@ -304,81 +305,81 @@ project_module_files: Súbory project_module_wiki: Wiki project_module_repository: Repozitár - project_module_boards: Diskusie + project_module_boards: Diskusné fóra - label_user: Užívateľ - label_user_plural: Užívatelia - label_user_new: Nový užívateľ + label_user: Požívateľ + label_user_plural: Používatelia + label_user_new: Nový používateľ label_project: Projekt label_project_new: Nový projekt label_project_plural: Projekty label_x_projects: zero: žiadne projekty one: 1 projekt - other: "%{count} projekty/ov" + other: "%{count} projektov" label_project_all: Všetky projekty label_project_latest: Posledné projekty label_issue: Úloha label_issue_new: Nová úloha label_issue_plural: Úlohy - label_issue_view_all: Všetky úlohy - label_issues_by: "Úlohy od užívateľa %{value}" - label_issue_added: Úloha pridaná - label_issue_updated: Úloha aktualizovaná + label_issue_view_all: Zobraziť všetky úlohy + label_issues_by: "Úlohy od používateľa %{value}" + label_issue_added: Úloha bola pridaná + label_issue_updated: Úloha bola aktualizovaná label_document: Dokument label_document_new: Nový dokument label_document_plural: Dokumenty - label_document_added: Dokument pridaný + label_document_added: Dokument bol pridaný label_role: Rola - label_role_plural: Role + label_role_plural: Roly label_role_new: Nová rola - label_role_and_permissions: Role a práva + label_role_and_permissions: Roly a oprávnenia label_member: Člen label_member_new: Nový člen label_member_plural: Členovia - label_tracker: Fronta + label_tracker: Front label_tracker_plural: Fronty - label_tracker_new: Nová fronta - label_workflow: Workflow + label_tracker_new: Nový front + label_workflow: Pracovný postup (workflow) label_issue_status: Stav úloh label_issue_status_plural: Stavy úloh label_issue_status_new: Nový stav label_issue_category: Kategória úloh label_issue_category_plural: Kategórie úloh label_issue_category_new: Nová kategória - label_custom_field: Užívateľské pole - label_custom_field_plural: Užívateľské polia - label_custom_field_new: Nové užívateľské pole + label_custom_field: Vlastné pole + label_custom_field_plural: Vlastné polia + label_custom_field_new: Nové pole label_enumerations: Zoznamy label_enumeration_new: Nová hodnota label_information: Informácia label_information_plural: Informácie - label_please_login: Prosím prihláste sa - label_register: Registrovať + label_please_login: Prihláste sa prosím + label_register: Registrácia label_password_lost: Zabudnuté heslo - label_home: Domovská stránka + label_home: Domov label_my_page: Moja stránka label_my_account: Môj účet label_my_projects: Moje projekty label_administration: Administrácia label_login: Prihlásenie label_logout: Odhlásenie - label_help: Nápoveda + label_help: Pomoc label_reported_issues: Nahlásené úlohy label_assigned_to_me_issues: Moje úlohy label_last_login: Posledné prihlásenie - label_registered_on: Registrovaný + label_registered_on: Dátum registrácie label_activity: Aktivita label_overall_activity: Celková aktivita label_new: Nový label_logged_as: Prihlásený ako label_environment: Prostredie label_authentication: Autentifikácia - label_auth_source: Mód autentifikácie - label_auth_source_new: Nový mód autentifikácie - label_auth_source_plural: Módy autentifikácie + label_auth_source: Autentifikačný mód + label_auth_source_new: Nový autentifikačný mód + label_auth_source_plural: Autentifikačné módy label_subproject_plural: Podprojekty - label_min_max_length: Min - Max dĺžka + label_min_max_length: Min. - max. dĺžka label_list: Zoznam label_date: Dátum label_integer: Celé číslo @@ -386,60 +387,60 @@ label_boolean: Áno/Nie label_string: Text label_text: Dlhý text - label_attribute: Atribut - label_attribute_plural: Atributy - label_no_data: Žiadné položky + label_attribute: Atribút + label_attribute_plural: Atribúty + label_no_data: Žiadne položky label_change_status: Zmeniť stav label_history: História label_attachment: Súbor label_attachment_new: Nový súbor - label_attachment_delete: Odstrániť súbor + label_attachment_delete: Vymazať súbor label_attachment_plural: Súbory - label_file_added: Súbor pridaný - label_report: Prehľad - label_report_plural: Prehľady + label_file_added: Súbor bol pridaný + label_report: Hlásenie + label_report_plural: Hlásenia label_news: Novinky label_news_new: Pridať novinku label_news_plural: Novinky label_news_latest: Posledné novinky - label_news_view_all: Zobrazit všetky novinky - label_news_added: Novinka pridaná - label_settings: Nastavenie + label_news_view_all: Zobraziť všetky novinky + label_news_added: Novinka bola pridaná + label_settings: Nastavenia label_overview: Prehľad label_version: Verzia label_version_new: Nová verzia label_version_plural: Verzie label_confirmation: Potvrdenie - label_export_to: 'Tiež k dispozícií:' - label_read: Načíta sa... + label_export_to: 'K dispozícii tiež ako:' + label_read: Načítava sa... label_public_projects: Verejné projekty - label_open_issues: Otvorený - label_open_issues_plural: Otvorené - label_closed_issues: Uzavrený - label_closed_issues_plural: Uzavrené + label_open_issues: otvorená + label_open_issues_plural: otvorené + label_closed_issues: uzavretá + label_closed_issues_plural: uzavreté label_x_open_issues_abbr_on_total: - zero: 0 otvorených z celkovo %{total} - one: 1 otvorený z celkovo %{total} - other: "%{count} otvorené/ých z celkovo %{total}" + zero: 0 otvorených z celkom %{total} + one: 1 otvorená z celkom %{total} + other: "%{count} otvorených z celkom %{total}" label_x_open_issues_abbr: zero: 0 otvorených - one: 1 otvorený - other: "%{count} otvorené/ých" + one: 1 otvorená + other: "%{count} otvorených" label_x_closed_issues_abbr: - zero: 0 zavretých - one: 1 zavretý - other: "%{count} zavreté/ých" - label_total: Celkovo - label_permissions: Práva + zero: 0 uzavretých + one: 1 uzavretá + other: "%{count} uzavretých" + label_total: Celkom + label_permissions: Oprávnenia label_current_status: Aktuálny stav - label_new_statuses_allowed: Nové povolené stavy + label_new_statuses_allowed: Povolené nové stavy label_all: všetko label_none: nič label_nobody: nikto - label_next: Ďalší - label_previous: Predchádzajúci + label_next: Ďalšie + label_previous: Predchádzajúce label_used_by: Použité - label_details: Detaily + label_details: Podrobnosti label_add_note: Pridať poznámku label_per_page: Na stránku label_calendar: Kalendár @@ -452,19 +453,19 @@ label_comment: Komentár label_comment_plural: Komentáre label_x_comments: - zero: žiaden komentár + zero: žiadne komentáre one: 1 komentár - other: "%{count} komentáre/ov" + other: "%{count} komentárov" label_comment_add: Pridať komentár - label_comment_added: Komentár pridaný - label_comment_delete: Odstrániť komentár - label_query: Užívateľský dotaz - label_query_plural: Užívateľské dotazy - label_query_new: Nový dotaz + label_comment_added: Komentár bol pridaný + label_comment_delete: Vymazať komentár + label_query: Vlastný filter + label_query_plural: Vlastné filtre + label_query_new: Nový filter vyhľadávania label_filter_add: Pridať filter label_filter_plural: Filtre label_equals: je - label_not_equals: nieje + label_not_equals: nie je label_in_less_than: je menší ako label_in_more_than: je väčší ako label_in: v @@ -473,7 +474,7 @@ label_yesterday: včera label_this_week: tento týždeň label_last_week: minulý týždeň - label_last_n_days: "posledných %{count} dní" + label_last_n_days: "v posledných %{count} dňoch" label_this_month: tento mesiac label_last_month: minulý mesiac label_this_year: tento rok @@ -488,31 +489,31 @@ label_repository_plural: Repozitáre label_browse: Prechádzať label_revision: Revízia - label_revision_plural: Revízií - label_associated_revisions: Súvisiace verzie + label_revision_plural: Revízie + label_associated_revisions: Súvisiace revízie label_added: pridané label_modified: zmenené - label_deleted: odstránené + label_deleted: vymazané label_latest_revision: Posledná revízia label_latest_revision_plural: Posledné revízie label_view_revisions: Zobraziť revízie label_max_size: Maximálna veľkosť label_sort_highest: Presunúť na začiatok - label_sort_higher: Presunúť navrch - label_sort_lower: Presunúť dole + label_sort_higher: Presunúť vyššie + label_sort_lower: Presunúť nižšie label_sort_lowest: Presunúť na koniec label_roadmap: Plán label_roadmap_due_in: "Zostáva %{value}" - label_roadmap_overdue: "%{value} neskoro" - label_roadmap_no_issues: Pre túto verziu niesú žiadne úlohy + label_roadmap_overdue: "%{value} meškanie" + label_roadmap_no_issues: Pre túto verziu neexistujú žiadne úlohy label_search: Hľadať label_result_plural: Výsledky - label_all_words: Všetky slova + label_all_words: Všetky slová label_wiki: Wiki label_wiki_edit: Wiki úprava label_wiki_edit_plural: Wiki úpravy label_wiki_page: Wiki stránka - label_wiki_page_plural: Wiki stránky + label_wiki_page_plural: Wikistránky label_index_by_title: Index podľa názvu label_index_by_date: Index podľa dátumu label_current_version: Aktuálna verzia @@ -523,35 +524,35 @@ label_spent_time: Strávený čas label_f_hour: "%{value} hodina" label_f_hour_plural: "%{value} hodín" - label_time_tracking: Sledovánie času + label_time_tracking: Sledovanie času label_change_plural: Zmeny label_statistics: Štatistiky - label_commits_per_month: Úkony za mesiac - label_commits_per_author: Úkony podľa autora - label_view_diff: Zobrazit rozdiely + label_commits_per_month: Commity za mesiac + label_commits_per_author: Commity podľa autora + label_view_diff: Zobraziť rozdiely label_diff_inline: vo vnútri label_diff_side_by_side: vedľa seba - label_options: Nastavenie - label_copy_workflow_from: Kopírovať workflow z - label_permissions_report: Prehľad práv + label_options: Nastavenia + label_copy_workflow_from: Kopírovať pracovný postup (workflow) z + label_permissions_report: Prehľad oprávnení label_watched_issues: Sledované úlohy label_related_issues: Súvisiace úlohy label_applied_status: Použitý stav - label_loading: Nahrávam ... - label_relation_new: Nová súvislosť - label_relation_delete: Odstrániť súvislosť - label_relates_to: súvisiací s - label_duplicates: duplicity - label_blocks: blokovaný - label_blocked_by: zablokovaný - label_precedes: predcháza - label_follows: následuje - label_end_to_start: od konca na začiatok + label_loading: Nahráva sa... + label_relation_new: Nové prepojenie + label_relation_delete: Odstrániť prepojenie + label_relates_to: Súvisiace s + label_duplicates: Duplikáty + label_blocks: Blokované + label_blocked_by: Zablokované používateľom + label_precedes: Predchádza + label_follows: Nasleduje po + label_end_to_start: od konca po začiatok label_end_to_end: od konca do konca label_start_to_start: od začiatku do začiatku label_start_to_end: od začiatku do konca label_stay_logged_in: Zostať prihlásený - label_disabled: zakazané + label_disabled: zakázané label_show_completed_versions: Ukázať dokončené verzie label_me: ja label_board: Fórum @@ -561,32 +562,32 @@ label_message_plural: Správy label_message_last: Posledná správa label_message_new: Nová správa - label_message_posted: Správa pridaná + label_message_posted: Správa bola pridaná label_reply_plural: Odpovede - label_send_information: Zaslať informácie o účte užívateľa + label_send_information: Zaslať informácie o účte používateľa label_year: Rok label_month: Mesiac - label_week: Týžden + label_week: Týždeň label_date_from: Od label_date_to: Do - label_language_based: Podľa výchozieho jazyka + label_language_based: Podľa jazyka používateľa label_sort_by: "Zoradenie podľa %{value}" label_send_test_email: Poslať testovací email - label_feeds_access_key_created_on: "Prístupový klúč pre RSS bol vytvorený pred %{value}" + label_feeds_access_key_created_on: "Prístupový kľúč pre Atom bol vytvorený pred %{value}" label_module_plural: Moduly - label_added_time_by: "Pridané užívateľom %{author} pred %{age}" + label_added_time_by: "Pridané používateľom %{author} pred %{age}" label_updated_time: "Aktualizované pred %{value}" - label_jump_to_a_project: Zvoliť projekt... + label_jump_to_a_project: Prejsť na projekt... label_file_plural: Súbory - label_changeset_plural: Sady zmien - label_default_columns: Východzie stĺpce + label_changeset_plural: Súbory zmien + label_default_columns: Predvolené stĺpce label_no_change_option: (bez zmeny) - label_bulk_edit_selected_issues: Skupinová úprava vybraných úloh + label_bulk_edit_selected_issues: Hromadná úprava vybraných úloh label_theme: Téma - label_default: Východzí + label_default: Predvolené label_search_titles_only: Vyhľadávať iba v názvoch - label_user_mail_option_all: "Pre všetky události všetkých mojích projektov" - label_user_mail_option_selected: "Pre všetky události vybraných projektov" + label_user_mail_option_all: "Pre všetky udalosti všetkých mojich projektov" + label_user_mail_option_selected: "Pre všetky udalosti vybraných projektov..." label_user_mail_no_self_notified: "Nezasielať informácie o mnou vytvorených zmenách" label_registration_activation_by_email: aktivácia účtu emailom label_registration_manual_activation: manuálna aktivácia účtu @@ -601,7 +602,7 @@ label_ldap_authentication: Autentifikácia LDAP label_downloads_abbr: D/L label_optional_description: Voliteľný popis - label_add_another_file: Pridať ďaľší súbor + label_add_another_file: Pridať ďalší súbor label_preferences: Nastavenia label_chronological_order: V chronologickom poradí label_reverse_chronological_order: V obrátenom chronologickom poradí @@ -610,7 +611,7 @@ button_submit: Potvrdiť button_save: Uložiť button_check_all: Označiť všetko - button_uncheck_all: Odznačiť všetko + button_uncheck_all: Zrušiť výber button_delete: Odstrániť button_create: Vytvoriť button_test: Test @@ -618,25 +619,25 @@ button_add: Pridať button_change: Zmeniť button_apply: Použiť - button_clear: Zmazať - button_lock: Zamknúť + button_clear: Späť na pôvodné + button_lock: Uzamknúť button_unlock: Odomknúť - button_download: Stiahnúť + button_download: Stiahnuť button_list: Vypísať button_view: Zobraziť button_move: Presunúť - button_back: Naspäť - button_cancel: Storno + button_back: Späť + button_cancel: Zrušiť button_activate: Aktivovať - button_sort: Zoradenie - button_log_time: Pridať čas - button_rollback: Naspäť k tejto verzii + button_sort: Zoradiť + button_log_time: Pridať časový záznam + button_rollback: Naspäť na túto verziu button_watch: Sledovať button_unwatch: Nesledovať button_reply: Odpovedať button_archive: Archivovať - button_unarchive: Odarchivovať - button_reset: Reset + button_unarchive: zrušiť archiváciu + button_reset: Resetovať button_rename: Premenovať button_change_password: Zmeniť heslo button_copy: Kopírovať @@ -645,119 +646,119 @@ button_configure: Konfigurovať status_active: aktívny - status_registered: registrovaný + status_registered: zaregistrovaný status_locked: uzamknutý - text_select_mail_notifications: Vyberte akciu, pri ktorej bude zaslané upozornenie emailom + text_select_mail_notifications: Vyberte akciu, pri ktorej bude zaslané upozornenie emailom. text_regexp_info: napr. ^[A-Z0-9]+$ text_min_max_length_info: 0 znamená bez limitu - text_project_destroy_confirmation: Ste si istý, že chcete odstránit tento projekt a všetky súvisiace dáta ? - text_workflow_edit: Vyberte rolu a frontu k úprave workflow - text_are_you_sure: Ste si istý? + text_project_destroy_confirmation: Naozaj si želáte odstrániť tento projekt a všetky súvisiace údaje? + text_workflow_edit: Vyberte rolu a front na úpravu pracovného postupu (workflow) + text_are_you_sure: Naozaj si želáte vykonať túto akciu? text_tip_issue_begin_day: úloha začína v tento deň text_tip_issue_end_day: úloha končí v tento deň text_tip_issue_begin_end_day: úloha začína a končí v tento deň - text_caracters_maximum: "%{count} znakov maximálne." - text_caracters_minimum: "Musí byť aspoň %{count} znaky/ov dlhé." + text_caracters_maximum: "Maximálne %{count} znakov." + text_caracters_minimum: "Dĺžka musí byť minimálne %{count} znakov." text_length_between: "Dĺžka medzi %{min} až %{max} znakmi." - text_tracker_no_workflow: Pre tuto frontu nieje definovaný žiadný workflow + text_tracker_no_workflow: Pre tento front nie je definovaný žiadny pracovný postup (workflow) text_unallowed_characters: Nepovolené znaky - text_comma_separated: Je povolené viacero hodnôt (oddelené navzájom čiarkou). - text_issues_ref_in_commit_messages: Odkazovať a upravovať úlohy v správach s následovnym obsahom - text_issue_added: "úloha %{id} bola vytvorená užívateľom %{author}." - text_issue_updated: "Úloha %{id} byla aktualizovaná užívateľom %{author}." - text_wiki_destroy_confirmation: Naozaj si prajete odstrániť túto Wiki a celý jej obsah? - text_issue_category_destroy_question: "Niektoré úlohy (%{count}) sú priradené k tejto kategórii. Čo chtete s nimi spraviť?" - text_issue_category_destroy_assignments: Zrušiť priradenie ku kategórii - text_issue_category_reassign_to: Priradiť úlohy do tejto kategórie - text_user_mail_option: "U projektov, které neboli vybrané, budete dostávať oznamenie iba o vašich či o sledovaných položkách (napr. o položkách, ktorých ste autor, alebo ku ktorým ste priradený/á)." - text_no_configuration_data: "Role, fronty, stavy úloh ani workflow neboli zatiaľ nakonfigurované.\nVelmi doporučujeme nahrať východziu konfiguráciu. Potom si môžete všetko upraviť" - text_load_default_configuration: Nahrať východziu konfiguráciu - text_status_changed_by_changeset: "Aktualizované v sade zmien %{value}." - text_issues_destroy_confirmation: 'Naozaj si prajete odstrániť všetky zvolené úlohy?' - text_select_project_modules: 'Aktivne moduly v tomto projekte:' - text_default_administrator_account_changed: Zmenené výchozie nastavenie administrátorského účtu - text_file_repository_writable: Povolený zápis do repozitára - text_rmagick_available: RMagick k dispozícií (voliteľné) - text_destroy_time_entries_question: U úloh, které chcete odstraniť, je evidované %.02f práce. Čo chcete vykonať? - text_destroy_time_entries: Odstrániť evidované hodiny. - text_assign_time_entries_to_project: Priradiť evidované hodiny projektu - text_reassign_time_entries: 'Preradiť evidované hodiny k tejto úlohe:' + text_comma_separated: Je povolených viacero hodnôt (navzájom oddelené čiarkou). + text_issues_ref_in_commit_messages: Referencie a opravy úloh v commitoch + text_issue_added: "úloha %{id} bola vytvorená používateľom %{author}." + text_issue_updated: "Úloha %{id} bola aktualizovaná používateľom %{author}." + text_wiki_destroy_confirmation: Naozaj si želáte vymazať túto Wiki a celý jej obsah? + text_issue_category_destroy_question: "Do tejto kategórie je zaradených niekoľko úloh (%{count}). Čo si želáte s nimi urobiť?" + text_issue_category_destroy_assignments: Zrušiť zaradenie do kategórie + text_issue_category_reassign_to: Preradiť úlohy do tejto kategórie + text_user_mail_option: "Pri projektoch, ktoré neboli vybrané, budete dostávať upozornenia týkajúce sa iba vašich alebo vami sledovaných vecí (napr. vecí, ktorých ste autor, alebo ku ktorým ste priradení)." + text_no_configuration_data: "Roly, fronty, stavy úloh ani pracovné postupy (workflow) neboli zatiaľ nakonfigurované.\nOdporúčame vám nahrať predvolenú konfiguráciu. Následne môžete všetky nastavenia upraviť." + text_load_default_configuration: Nahrať predvolenú konfiguráciu + text_status_changed_by_changeset: "Aplikované v súbore zmien %{value}." + text_issues_destroy_confirmation: 'Naozaj si želáte odstrániť všetky vybrané úlohy?' + text_select_project_modules: 'Vybrať moduly povolené v tomto projekte:' + text_default_administrator_account_changed: Predvolené nastavenie administrátorského účtu bolo zmenené + text_file_repository_writable: Povolený zápis do priečinka s prílohami + text_rmagick_available: RMagick k dispozícii (voliteľné) + text_destroy_time_entries_question: Pri úlohách, ktoré chcete odstrániť, je zaznamenaných %{hours} hodín práce. Čo si želáte urobiť? + text_destroy_time_entries: Odstrániť zaznamenané hodiny + text_assign_time_entries_to_project: Priradiť zaznamenané hodiny k projektu + text_reassign_time_entries: 'Preradiť zaznamenané hodiny k tejto úlohe:' default_role_manager: Manažér default_role_developer: Vývojár default_role_reporter: Reportér default_tracker_bug: Chyba - default_tracker_feature: Rozšírenie + default_tracker_feature: Funkcionalita default_tracker_support: Podpora - default_issue_status_new: Nový - default_issue_status_in_progress: In Progress - default_issue_status_resolved: Vyriešený - default_issue_status_feedback: Čaká sa - default_issue_status_closed: Uzavrený - default_issue_status_rejected: Odmietnutý - default_doc_category_user: Užívateľská dokumentácia + default_issue_status_new: Nová + default_issue_status_in_progress: Rozpracovaná + default_issue_status_resolved: Vyriešená + default_issue_status_feedback: Čaká na odsúhlasenie + default_issue_status_closed: Uzavretá + default_issue_status_rejected: Odmietnutá + default_doc_category_user: Používateľská dokumentácia default_doc_category_tech: Technická dokumentácia default_priority_low: Nízká default_priority_normal: Normálna default_priority_high: Vysoká default_priority_urgent: Urgentná default_priority_immediate: Okamžitá - default_activity_design: Design + default_activity_design: Dizajn default_activity_development: Vývoj enumeration_issue_priorities: Priority úloh - enumeration_doc_categories: Kategorie dokumentov + enumeration_doc_categories: Kategórie dokumentov enumeration_activities: Aktivity (sledovanie času) - error_scm_annotate: "Položka neexistuje alebo nemôže byť komentovaná." + error_scm_annotate: "Položka neexistuje, alebo nemôže byť komentovaná." label_planning: Plánovanie - text_subprojects_destroy_warning: "Jeho podprojekt(y): %{value} budú takisto vymazané." + text_subprojects_destroy_warning: "Jeho podprojekty: %{value} budú tiež vymazané." label_and_its_subprojects: "%{value} a jeho podprojekty" - mail_body_reminder: "%{count} úloha(y), ktorá(é) je(sú) vám priradený(é), ma(jú) byť hotova(é) za %{days} dní:" - mail_subject_reminder: "%{count} úloha(y) ma(jú) byť hotova(é) za pár %{days} dní" - text_user_wrote: "%{value} napísal:" - label_duplicated_by: duplikovaný - setting_enabled_scm: Zapnúť SCM + mail_body_reminder: "Nasledovné úlohy (%{count}), ktoré sú vám priradené, majú byť hotové za %{days} dní:" + mail_subject_reminder: "%{count} úlohy majú byť hotové za %{days} dní" + text_user_wrote: "Používateľ %{value} napísal:" + label_duplicated_by: Duplikoval + setting_enabled_scm: Povolené SCM text_enumeration_category_reassign_to: 'Prenastaviť na túto hodnotu:' - text_enumeration_destroy_question: "%{count} objekty sú nastavené na túto hodnotu." - label_incoming_emails: Príchádzajúce emaily + text_enumeration_destroy_question: "%{count} objektov je nastavených na túto hodnotu." + label_incoming_emails: Prichádzajúce emaily label_generate_key: Vygenerovať kľúč - setting_mail_handler_api_enabled: Zapnúť Webovú Službu (WS) pre príchodzie emaily + setting_mail_handler_api_enabled: Zapnúť Webovú službu (WS) pre prichádzajúce emaily setting_mail_handler_api_key: API kľúč - text_email_delivery_not_configured: "Doručenie emailov nieje nastavené, notifikácie sú vypnuté.\nNastavte váš SMTP server v config/configuration.yml a reštartnite aplikáciu pre aktiváciu funkcie." + text_email_delivery_not_configured: "Doručovanie emailov nie je nastavené, notifikácie sú vypnuté.\nNastavte váš SMTP server v config/configuration.yml a reštartujte aplikáciu, čím funkciu aktivujete." field_parent_title: Nadradená stránka label_issue_watchers: Pozorovatelia button_quote: Citácia setting_sequential_project_identifiers: Generovať sekvenčné identifikátory projektov - notice_unable_delete_version: Verzia nemôže byť zmazaná + notice_unable_delete_version: Verzia nemôže byť zmazaná. label_renamed: premenované label_copied: kopírované setting_plain_text_mail: Len jednoduchý text (bez HTML) permission_view_files: Zobrazenie súborov permission_edit_issues: Úprava úloh - permission_edit_own_time_entries: Úprava vlastných zaznamov o strávenom čase - permission_manage_public_queries: Správa verejných otáziek - permission_add_issues: Pridanie úlohy + permission_edit_own_time_entries: Úprava vlastných záznamov o strávenom čase + permission_manage_public_queries: Správa verejných filtrov vyhľadávania + permission_add_issues: Pridávanie úloh permission_log_time: Zaznamenávanie stráveného času - permission_view_changesets: Zobrazenie sád zmien + permission_view_changesets: Zobrazenie súborov zmien permission_view_time_entries: Zobrazenie stráveného času permission_manage_versions: Správa verzií permission_manage_wiki: Správa Wiki permission_manage_categories: Správa kategórií úloh - permission_protect_wiki_pages: Ochrana Wiki strániek + permission_protect_wiki_pages: Ochrana wikistránok permission_comment_news: Komentovanie noviniek permission_delete_messages: Mazanie správ permission_select_project_modules: Voľba projektových modulov - permission_edit_wiki_pages: Úprava Wiki strániek - permission_add_issue_watchers: Pridanie pozorovateľov - permission_view_gantt: Zobrazenie Ganttovho diagramu + permission_edit_wiki_pages: Úprava wikistránok + permission_add_issue_watchers: Pridávanie pozorovateľov + permission_view_gantt: Zobrazenie Ganttovho grafu permission_move_issues: Presun úloh - permission_manage_issue_relations: Správa vzťahov medzi úlohami - permission_delete_wiki_pages: Mazanie Wiki strániek + permission_manage_issue_relations: Správa prepojení medzi úlohami + permission_delete_wiki_pages: Mazanie wikistránok permission_manage_boards: Správa diskusií - permission_delete_wiki_pages_attachments: Mazanie Wiki príloh - permission_view_wiki_edits: Zobrazenie Wiki úprav - permission_add_messages: Pridanie správ + permission_delete_wiki_pages_attachments: Mazanie wikipríloh + permission_view_wiki_edits: Zobrazenie wikiúprav + permission_add_messages: Pridávanie správ permission_view_messages: Zobrazenie správ permission_manage_files: Správa súborov permission_edit_issue_notes: Úprava poznámok úlohy @@ -768,319 +769,325 @@ permission_delete_issues: Mazanie správ permission_view_issue_watchers: Zobrazenie zoznamu pozorovateľov permission_manage_repository: Správa repozitára - permission_commit_access: Povoliť prístup + permission_commit_access: Prístup ku commitom permission_browse_repository: Prechádzanie repozitára permission_view_documents: Zobrazenie dokumentov permission_edit_project: Úprava projektu - permission_add_issue_notes: Pridanie poznámky úlohy - permission_save_queries: Uloženie otáziek - permission_view_wiki_pages: Zobrazenie Wiki strániek - permission_rename_wiki_pages: Premenovanie Wiki strániek + permission_add_issue_notes: Pridanie poznámky k úlohe + permission_save_queries: Ukladanie filtrov vyhľadávania + permission_view_wiki_pages: Zobrazenie wikistránok + permission_rename_wiki_pages: Premenovanie wikistránok permission_edit_time_entries: Úprava záznamov o strávenom čase - permission_edit_own_issue_notes: Úprava vlastných poznámok úlohy - setting_gravatar_enabled: Použitie užívateľských Gravatar ikon + permission_edit_own_issue_notes: Úprava vlastných poznámok k úlohe + setting_gravatar_enabled: Používať používateľské Gravatar ikonky permission_edit_own_messages: Úprava vlastných správ permission_delete_own_messages: Mazanie vlastných správ - text_repository_usernames_mapping: "Vyberte alebo upravte mapovanie medzi užívateľmi systému Redmine a užívateľskými menami nájdenými v logu repozitára.\nUžívatelia s rovnakým prihlasovacím menom alebo emailom v systéme Redmine a repozitára sú mapovaní automaticky." + text_repository_usernames_mapping: "Vyberte alebo aktualizujte priradenie používateľov systému Redmine k menám používateľov nájdených v logu repozitára.\nPoužívatelia s rovnakým prihlasovacím menom alebo emailom v systéme Redmine a repozitári sú priradení automaticky." label_example: Príklad - label_user_activity: "Aktivita užívateľa %{value}" - label_updated_time_by: "Aktualizované užívateľom %{author} pred %{age}" - text_diff_truncated: '... Tento rozdielový výpis bol skratený, pretože prekračuje maximálnu veľkosť, ktorá môže byť zobrazená.' - setting_diff_max_lines_displayed: Maximálne množstvo zobrazených riadkov rozdielového výpisu - text_plugin_assets_writable: Adresár pre pluginy s možnosťou zápisu - warning_attachments_not_saved: "%{count} súbor(y) nemohol(li) byť uložené." + label_user_activity: "Aktivita používateľa %{value}" + label_updated_time_by: "Aktualizované používateľom %{author} pred %{age}" + text_diff_truncated: '...Tento výpis rozdielov bol skrátený, pretože prekračuje maximálny počet riadkov, ktorý môže byť zobrazený.' + setting_diff_max_lines_displayed: Maximálny počet zobrazených riadkov výpisu rozdielov + text_plugin_assets_writable: Povolený zápis do priečinka pre pluginy + warning_attachments_not_saved: "%{count} súborov nemohlo byť uložených." field_editable: Editovateľné label_display: Zobrazenie button_create_and_continue: Vytvoriť a pokračovať - text_custom_field_possible_values_info: 'Jeden riadok pre každú hodnotu' - setting_repository_log_display_limit: Maximálne množstvo revizií zobrazené v logu + text_custom_field_possible_values_info: 'Každá hodnota na samostatný riadok' + setting_repository_log_display_limit: Maximálny počet revízií zobrazených v log súbore setting_file_max_size_displayed: Maximálna veľkosť textových súborov zobrazených priamo na stránke - field_watcher: Pozorovateľ - setting_openid: Povoliť OpenID prihlasovanie a registráciu + field_watcher: Pozorovatelia + setting_openid: Povoliť prihlasovanie a registráciu pomocou OpenID field_identity_url: OpenID URL label_login_with_open_id_option: alebo sa prihlásiť pomocou OpenID field_content: Obsah - label_descending: Zostupné + label_descending: Zostupne label_sort: Zoradenie - label_ascending: Rastúce + label_ascending: Vzostupne label_date_from_to: Od %{start} do %{end} - label_greater_or_equal: ">=" - label_less_or_equal: <= - text_wiki_page_destroy_question: Táto stránka má %{descendants} podstránku/y a potomka/ov. Čo chcete vykonať? - text_wiki_page_reassign_children: Preradiť podstránky k tejto hlavnej stránke + label_greater_or_equal: '>=' + label_less_or_equal: '<=' + text_wiki_page_destroy_question: Táto stránka má %{descendants} podstránok a potomkov. Čo si želáte urobiť? + text_wiki_page_reassign_children: Preradiť podstránky k tejto nadradenej stránke text_wiki_page_nullify_children: Zachovať podstránky ako hlavné stránky text_wiki_page_destroy_children: Vymazať podstránky a všetkých ich potomkov setting_password_min_length: Minimálna dĺžka hesla - field_group_by: Skupinové výsledky podľa - mail_subject_wiki_content_updated: "'%{id}' Wiki stránka bola aktualizovaná" - label_wiki_content_added: Wiki stránka pridaná - mail_subject_wiki_content_added: "'%{id}' Wiki stránka bola pridaná" - mail_body_wiki_content_added: The '%{id}' Wiki stránka bola pridaná užívateľom %{author}. + field_group_by: Zoskupiť výsledky podľa + mail_subject_wiki_content_updated: "Wikistránka '%{id}' bola aktualizovaná" + label_wiki_content_added: Wikistránka bola pridaná + mail_subject_wiki_content_added: "Bola pridaná wikistránka '%{id}'" + mail_body_wiki_content_added: Používateľ %{author} pridal wikistránku '%{id}'. permission_add_project: Vytvorenie projektu - label_wiki_content_updated: Wiki stránka aktualizovaná - mail_body_wiki_content_updated: Wiki stránka '%{id}' bola aktualizovaná užívateľom %{author}. - setting_new_project_user_role_id: Rola dána non-admin užívateľovi, ktorý vytvorí projekt - label_view_all_revisions: Zobraziť všetkz revízie - label_tag: Tag + label_wiki_content_updated: Wikistránka bola aktualizovaná + mail_body_wiki_content_updated: Používateľ %{author} aktualizoval wikistránku '%{id}'. + setting_new_project_user_role_id: Rola non-admin používateľa, ktorý vytvorí projekt + label_view_all_revisions: Zobraziť všetky revízie + label_tag: Štítok label_branch: Vetva - error_no_tracker_in_project: K tomuto projektu nieje priradená žiadna fronta. Prosím skontrolujte nastavenie projektu. - error_no_default_issue_status: Nieje definovaný východzí stav úlohy. Prosím skontrolujte vase nastavenie (Choďte na "Administrácia -> Stavz úloh"). - text_journal_changed: "%{label} zmenené z %{old} na %{new}" - text_journal_set_to: "%{label} nastavené na %{value}" - text_journal_deleted: "%{label} zmazané (%{old})" + error_no_tracker_in_project: K tomuto projektu nie je priradený žiadny front. Skontrolujte prosím nastavenia projektu. + error_no_default_issue_status: Nie je definovaný predvolený stav úlohy. Skontrolujte prosím vašu konfiguráciu (choďte na "Administrácia -> Stavy úloh"). + text_journal_changed: "%{label} bolo zmenené z %{old} na %{new}" + text_journal_set_to: "%{label} bolo nastavené na %{value}" + text_journal_deleted: "%{label} bolo vymazané (%{old})" label_group_plural: Skupiny label_group: Skupina label_group_new: Nová skupina label_time_entry_plural: Strávený čas - text_journal_added: "%{label} %{value} pridané" + text_journal_added: "%{label} %{value} bolo pridané" field_active: Aktívne enumeration_system_activity: Aktivita systému - permission_delete_issue_watchers: Odstrániť pozorovateľov - version_status_closed: zavreté - version_status_locked: uzavreté + permission_delete_issue_watchers: Odstránenie pozorovateľov + version_status_closed: uzavreté + version_status_locked: uzamknuté version_status_open: otvorené - error_can_not_reopen_issue_on_closed_version: Úloha priradená uzavretej verzií nemôže byť znovu-otvorená + error_can_not_reopen_issue_on_closed_version: Nemožno opäť otvoriť úlohu, ktorá bola priradená uzavretej verzii label_user_anonymous: Anonym - button_move_and_follow: Presunúť a následovať - setting_default_projects_modules: Prednastavené aktívne moduly pre nové projekty - setting_gravatar_default: Východzí Gravatar obrázok + button_move_and_follow: Presunúť a sledovať + setting_default_projects_modules: Predvolené povolené moduly pre nové projekty + setting_gravatar_default: Predvolený Gravatar obrázok field_sharing: Zdieľanie label_version_sharing_hierarchy: S hierarchiou projektu - label_version_sharing_system: So všetkými projektami - label_version_sharing_descendants: S podprojektami + label_version_sharing_system: So všetkými projektmi + label_version_sharing_descendants: S podprojektmi label_version_sharing_tree: S projektovým stromom - label_version_sharing_none: Nezdielané + label_version_sharing_none: Nezdieľané error_can_not_archive_project: Tento projekt nemôže byť archivovaný button_duplicate: Duplikovať - button_copy_and_follow: Kopírovať a následovať + button_copy_and_follow: Kopírovať a sledovať label_copy_source: Zdroj - setting_issue_done_ratio: Vyrátať pomer vypracovania úlohy s + setting_issue_done_ratio: Vyrátať mieru vypracovania úlohy pomocou setting_issue_done_ratio_issue_status: Použiť stav úlohy - error_issue_done_ratios_not_updated: Stav vypracovania úlohy neaktualizovaný. - error_workflow_copy_target: Prosím zvoľte cieľovú frontu(y) a rolu(e) + error_issue_done_ratios_not_updated: Stav vypracovania úlohy nebol aktualizovaný. + error_workflow_copy_target: Vyberte prosím jednu alebo viaceré cieľové fronty a roly setting_issue_done_ratio_issue_field: Použiť pole úlohy label_copy_same_as_target: Rovnaké ako cieľ label_copy_target: Cieľ - notice_issue_done_ratios_updated: Stav vypracovania úlohy aktualizovaný. - error_workflow_copy_source: Prosím zvoľte zdrojovú frontu alebo rolu - label_update_issue_done_ratios: Aktualizácia stavu úloh - setting_start_of_week: Štart pracovného týždňa v - permission_view_issues: Zobraziť úlohy - label_display_used_statuses_only: Zobraziť len stavy, ktoré sú priradené k tejto fronte - label_revision_id: Revízia %{value} - label_api_access_key: API prístupový kľúč - label_api_access_key_created_on: API prístupový kľúč vytvorený pred %{value} - label_feeds_access_key: RSS prístupový kľúč - notice_api_access_key_reseted: Váš API prístupový kľúč bol resetovaný. - setting_rest_api_enabled: Zapnúť REST web službu - label_missing_api_access_key: API prístupový kľuč nenájdený - label_missing_feeds_access_key: RSS prístupový kľúč nenájdený + notice_issue_done_ratios_updated: Stav vypracovania úlohy bol aktualizovaný. + error_workflow_copy_source: Vyberte prosím zdrojový front alebo rolu + label_update_issue_done_ratios: Aktualizovať stav vypracovania úlohy + setting_start_of_week: Pracovný týždeň začína v + permission_view_issues: Zobrazenie úloh + label_display_used_statuses_only: Zobraziť len stavy, ktoré sú priradené k tomuto frontu + label_revision_id: "Revízia %{value}" + label_api_access_key: Prístupový kľúč API + label_api_access_key_created_on: "Prístupový kľúč API bol vytvorený pred %{value}" + label_feeds_access_key: Prístupový kľúč Atom + notice_api_access_key_reseted: Váš prístupový kľúč API bol resetovaný. + setting_rest_api_enabled: Zapnúť webovú službu REST + label_missing_api_access_key: Prístupový kľuč API nenájdený + label_missing_feeds_access_key: Prístupový kľúč Atom nenájdený button_show: Zobraziť - text_line_separated: Možnosť viacerých hodnôt (jeden riadok pre každú hodnotu). - setting_mail_handler_body_delimiters: Orezať emaily po následujúcich riadkoch + text_line_separated: Je povolené zadať viaceré hodnoty (každú hodnotu na samostatný riadok). + setting_mail_handler_body_delimiters: "Orezať emaily po jednom z nasledovných riadkov" permission_add_subprojects: Vytváranie podprojektov label_subproject_new: Nový podprojekt - text_own_membership_delete_confirmation: |- - Práve sa pokúšate o odstránenie niektorých alebo všetkých prístupových práv a možno nebudete mať možnost naďalej upravovať tento projekt. - Ste si istý(á), že chcete pokračovat? - label_close_versions: Uzavrieť ukončené verzie - label_board_sticky: Sticky + text_own_membership_delete_confirmation: "Pokúšate sa odstrániť niektoré alebo všetky svoje prístupové práva a je možné, že už nebudete mať možnosť naďalej upravovať tento projekt.\nNaozaj si želáte pokračovať?" + label_close_versions: Uzavrieť dokončené verzie + label_board_sticky: Dôležité label_board_locked: Uzamknuté - permission_export_wiki_pages: Exportovať WiKi stránky - setting_cache_formatted_text: Cache formatted text - permission_manage_project_activities: Nastavovať aktivity projektu - error_unable_delete_issue_status: Nieje možné zmeniť stav úlohy + permission_export_wiki_pages: Export wikistránok + setting_cache_formatted_text: Uložiť formátovaný text do vyrovnávacej pamäte + permission_manage_project_activities: Správa aktivít projektu + error_unable_delete_issue_status: 'Nie je možné vymazať stav úlohy' label_profile: Profil - permission_manage_subtasks: Nastavovať podúlohy + permission_manage_subtasks: Správa podúloh field_parent_issue: Nadradená úloha label_subtask_plural: Podúlohy - label_project_copy_notifications: Zaslať emailové upozornenie behom kopírovania projektu - error_can_not_delete_custom_field: Nieje možné vymazať užívateľské pole - error_unable_to_connect: Nieje možné vymazať (%{value}) - error_can_not_remove_role: Táto roľa sa používa a nemôže byť vymazaná. - error_can_not_delete_tracker: Táto fronta obsahuje úlohy a nemôže byť vymazaná. - field_principal: Principal - label_my_page_block: My page block - notice_failed_to_save_members: "Failed to save member(s): %{errors}." - text_zoom_out: Zoom out - text_zoom_in: Zoom in - notice_unable_delete_time_entry: Unable to delete time log entry. - label_overall_spent_time: Overall spent time - field_time_entries: Log time - project_module_gantt: Gantt - project_module_calendar: Calendar - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" - field_text: Text field - label_user_mail_option_only_owner: Only for things I am the owner of - setting_default_notification_option: Default notification option - label_user_mail_option_only_my_events: Only for things I watch or I'm involved in - label_user_mail_option_only_assigned: Only for things I am assigned to - label_user_mail_option_none: No events - field_member_of_group: Assignee's group - field_assigned_to_role: Assignee's role - notice_not_authorized_archived_project: The project you're trying to access has been archived. - label_principal_search: "Search for user or group:" - label_user_search: "Search for user:" - field_visible: Visible - setting_commit_logtime_activity_id: Activity for logged time - text_time_logged_by_changeset: Applied in changeset %{value}. - setting_commit_logtime_enabled: Enable time logging - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) - setting_gantt_items_limit: Maximum number of items displayed on the gantt chart - field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text - text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. - label_my_queries: My custom queries - text_journal_changed_no_detail: "%{label} updated" - label_news_comment_added: Comment added to a news - button_expand_all: Expand all - button_collapse_all: Collapse all - label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee - label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author - label_bulk_edit_selected_time_entries: Bulk edit selected time entries - text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? - label_role_anonymous: Anonymous - label_role_non_member: Non member - label_issue_note_added: Note added - label_issue_status_updated: Status updated - label_issue_priority_updated: Priority updated - label_issues_visibility_own: Issues created by or assigned to the user - field_issues_visibility: Issues visibility - label_issues_visibility_all: All issues - permission_set_own_issues_private: Set own issues public or private - field_is_private: Private - permission_set_issues_private: Set issues public or private - label_issues_visibility_public: All non private issues - text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). - field_commit_logs_encoding: Kódovanie prenášaných správ - field_scm_path_encoding: Path encoding - text_scm_path_encoding_note: "Default: UTF-8" - field_path_to_repository: Path to repository - field_root_directory: Root directory - field_cvs_module: Module + label_project_copy_notifications: Zaslať emailové upozornenie počas kopírovania projektu + error_can_not_delete_custom_field: Nie je možné vymazať vlastné pole + error_unable_to_connect: Nie je možné sa pripojiť (%{value}) + error_can_not_remove_role: "Táto rola sa používa a nemôže byť vymazaná." + error_can_not_delete_tracker: "Tento front obsahuje úlohy a nemôže byť vymazaný." + field_principal: Objednávateľ + label_my_page_block: Blok obsahu + notice_failed_to_save_members: "Nepodarilo sa uložiť členov: %{errors}." + text_zoom_out: Oddialiť + text_zoom_in: Priblížiť + notice_unable_delete_time_entry: Nie je možné vymazať časový záznam. + label_overall_spent_time: Celkový strávený čas + field_time_entries: Zaznamenaný čas + project_module_gantt: Ganttov graf + project_module_calendar: Kalendár + button_edit_associated_wikipage: "Upraviť súvisiacu wikistránku: %{page_title}" + field_text: Textové pole + label_user_mail_option_only_owner: "Len pre veci, ktorých som vlastníkom" + setting_default_notification_option: Predvolené nastavenie upozornení + label_user_mail_option_only_my_events: Len pre veci, ktoré sledujem, alebo v ktorých som zapojený + label_user_mail_option_only_assigned: "Len pre veci, ktoré mi boli priradené" + label_user_mail_option_none: "Žiadne udalosti" + field_member_of_group: "Skupina priradeného používateľa" + field_assigned_to_role: "Rola priradeného používateľa" + notice_not_authorized_archived_project: Projekt, ku ktorému sa snažíte pristupovať, bol archivovaný. + label_principal_search: "Hľadať používateľa alebo skupinu:" + label_user_search: "Hľadať používateľa:" + field_visible: Viditeľné + setting_commit_logtime_activity_id: Aktivita pre zaznamenaný čas + text_time_logged_by_changeset: "Aplikované v súbore zmien %{value}." + setting_commit_logtime_enabled: Povoliť zaznamenávanie času + notice_gantt_chart_truncated: "Graf bol skrátený, pretože bol prekročený maximálny povolený počet zobrazených položiek (%{max})" + setting_gantt_items_limit: Maximálny počet položiek zobrazených na Ganttovom grafe + field_warn_on_leaving_unsaved: "Varovať ma, keď opúšťam stránku s neuloženým textom" + text_warn_on_leaving_unsaved: "Stránka, ktorú sa chystáte opustiť, obsahuje neuložený obsah. Ak stránku opustíte, neuložený obsah bude stratený." + label_my_queries: Moje filtre vyhľadávania + text_journal_changed_no_detail: "%{label} bolo aktualizované" + label_news_comment_added: Komentár k novinke bol pridaný + button_expand_all: Rozbaliť všetko + button_collapse_all: Zbaliť všetko + label_additional_workflow_transitions_for_assignee: Ďalšie zmeny stavu sú povolené, len ak je používateľ priradený + label_additional_workflow_transitions_for_author: Ďalšie zmeny stavu sú povolené, len ak je používateľ autorom + label_bulk_edit_selected_time_entries: Hromadne upraviť vybrané časové záznamy + text_time_entries_destroy_confirmation: 'Naozaj si želáte vymazať vybrané časové záznamy?' + label_role_anonymous: Anonymný + label_role_non_member: Nie je členom + label_issue_note_added: Poznámka bola pridaná + label_issue_status_updated: Stav bol aktualizovaný + label_issue_priority_updated: Priorita bola aktualizovaná + label_issues_visibility_own: Úlohy od používateľa alebo priradené používateľovi + field_issues_visibility: Viditeľnosť úloh + label_issues_visibility_all: Všetky úlohy + permission_set_own_issues_private: Nastavenie vlastných úloh ako verejné alebo súkromné + field_is_private: Súkromné + permission_set_issues_private: Nastavenie úloh ako verejné alebo súkromné + label_issues_visibility_public: Všetky úlohy, ktoré nie sú súkromné + text_issues_destroy_descendants_confirmation: "Týmto krokom vymažate aj %{count} podúloh." + field_commit_logs_encoding: Kódovanie komentárov ku kommitom + field_scm_path_encoding: Kódovanie cesty SCM + text_scm_path_encoding_note: "Predvolené: UTF-8" + field_path_to_repository: Cesta k repozitáru + field_root_directory: Koreňový adresár + field_cvs_module: Modul field_cvsroot: CVSROOT - text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) - text_scm_command: Command - text_scm_command_version: Version - label_git_report_last_commit: Report last commit for files and directories - notice_issue_successful_create: Issue %{id} created. - label_between: between - setting_issue_group_assignment: Allow issue assignment to groups - label_diff: diff - text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) - description_query_sort_criteria_direction: Sort direction - description_project_scope: Search scope + text_mercurial_repository_note: Lokálny repozitár (napr. /hgrepo, c:\hgrepo) + text_scm_command: Príkaz + text_scm_command_version: Verzia + label_git_report_last_commit: Hlásiť posledný commit pre súbory a priečinky + notice_issue_successful_create: "Úloha %{id} bola vytvorená." + label_between: medzi + setting_issue_group_assignment: Povoliť priradenie úlohy skupine + label_diff: rozdiely + text_git_repository_note: Repozitár je iba jeden a je lokálny (e.g. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Smer triedenia + description_project_scope: Rozsah vyhľadávania description_filter: Filter - description_user_mail_notification: Mail notification settings - description_date_from: Enter start date - description_message_content: Message content - description_available_columns: Available Columns - description_date_range_interval: Choose range by selecting start and end date - description_issue_category_reassign: Choose issue category - description_search: Searchfield - description_notes: Notes - description_date_range_list: Choose range from list - description_choose_project: Projects - description_date_to: Enter end date - description_query_sort_criteria_attribute: Sort attribute - description_wiki_subpages_reassign: Choose new parent page - description_selected_columns: Selected Columns - label_parent_revision: Parent - label_child_revision: Child - error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. - setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues - button_edit_section: Edit this section - setting_repositories_encodings: Attachments and repositories encodings - description_all_columns: All Columns + description_user_mail_notification: Nastavenia upozornení emailom + description_date_from: Zadajte počiatočný dátum + description_message_content: Obsah správy + description_available_columns: Dostupné stĺpce + description_date_range_interval: Zvoľte obdobie zadaním počiatočného a koncového dátumu + description_issue_category_reassign: Vybrať kategóriu úlohy + description_search: Vyhľadávanie + description_notes: Poznámky + description_date_range_list: Vyberte zo zoznamu obdobie + description_choose_project: Projekty + description_date_to: Zadajte koncový dátum + description_query_sort_criteria_attribute: Atribút triedenia + description_wiki_subpages_reassign: Vybrať novú nadradenú stránku + description_selected_columns: Vybrané stĺpce + label_parent_revision: Rodič + label_child_revision: Potomok + error_scm_annotate_big_text_file: "Komentár nemohol byť pridaný, pretože bola prekročená maximálna povolená veľkosť textového súboru." + setting_default_issue_start_date_to_creation_date: Použiť aktuálny dátum ako počiatočný dátum pri nových úlohách + button_edit_section: Upraviť túto sekciu + setting_repositories_encodings: Kódovania pre prílohy a repozitáre + description_all_columns: Všetky stĺpce button_export: Export - label_export_options: "%{export_format} export options" - error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) - notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_export_options: "Nastavenia exportu do %{export_format}" + error_attachment_too_big: "Súbor nemožno nahrať, pretože prekračuje maximálnu povolenú veľkosť súboru (%{max_size})" + notice_failed_to_save_time_entries: "%{count} časových záznamov z %{total} vybraných nebolo uložených: %{ids}." label_x_issues: - zero: 0 Úloha - one: 1 Úloha - other: "%{count} Úlohy" - label_repository_new: New repository - field_repository_is_default: Main repository - label_copy_attachments: Copy attachments - label_item_position: "%{position}/%{count}" - label_completed_versions: Completed versions - text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. - field_multiple: Multiple values - setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed - text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes - text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) - notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. - text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} - permission_manage_related_issues: Manage related issues - field_auth_source_ldap_filter: LDAP filter - label_search_for_watchers: Search for watchers to add - notice_account_deleted: Your account has been permanently deleted. - setting_unsubscribe: Allow users to delete their own account - button_delete_my_account: Delete my account - text_account_destroy_confirmation: |- - Are you sure you want to proceed? - Your account will be permanently deleted, with no way to reactivate it. - error_session_expired: Your session has expired. Please login again. - text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." - setting_session_lifetime: Session maximum lifetime - setting_session_timeout: Session inactivity timeout - label_session_expiration: Session expiration - permission_close_project: Close / reopen the project - label_show_closed_projects: View closed projects - button_close: Close - button_reopen: Reopen - project_status_active: active - project_status_closed: closed - project_status_archived: archived - text_project_closed: This project is closed and read-only. - notice_user_successful_create: User %{id} created. - field_core_fields: Standard fields - field_timeout: Timeout (in seconds) - setting_thumbnails_enabled: Display attachment thumbnails - setting_thumbnails_size: Thumbnails size (in pixels) - label_status_transitions: Status transitions - label_fields_permissions: Fields permissions - label_readonly: Read-only - label_required: Required - text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. - field_board_parent: Parent forum - label_attribute_of_project: Project's %{name} - label_attribute_of_author: Author's %{name} - label_attribute_of_assigned_to: Assignee's %{name} - label_attribute_of_fixed_version: Target version's %{name} - label_copy_subtasks: Copy subtasks - label_copied_to: copied to - label_copied_from: copied from - label_any_issues_in_project: any issues in project - label_any_issues_not_in_project: any issues not in project - field_private_notes: Private notes - permission_view_private_notes: View private notes - permission_set_notes_private: Set notes as private - label_no_issues_in_project: no issues in project + zero: 0 úloh + one: 1 úloha + other: "%{count} úloh" + label_repository_new: Nový repozitár + field_repository_is_default: Hlavný repozitár + label_copy_attachments: Kopírovať prílohy + label_item_position: "%{position} z %{count}" + label_completed_versions: Dokončené verzie + text_project_identifier_info: 'Sú povolené iba malé písmená (a-z), čísla, pomlčky a podčiarkovníky. Identifikátor musí začínať malým písmenom.
    Po uložení už nie je možné identifikátor zmeniť.' + field_multiple: Viacero hodnôt + setting_commit_cross_project_ref: Povoliť referencie a opravy úloh všetkých ostatných projektov + text_issue_conflict_resolution_add_notes: Pridať moje poznámky a zahodiť ostatné moje zmeny + text_issue_conflict_resolution_overwrite: "Napriek tomu aplikovať moje zmeny (predchádzajúce poznámky budú zachované, ale niektoré zmeny môžu byť prepísané)" + notice_issue_update_conflict: "Počas vašich úprav bola úloha aktualizovaná iným používateľom." + text_issue_conflict_resolution_cancel: "Zahodiť všetky moje zmeny a znovu zobraziť %{link}" + permission_manage_related_issues: Správa súvisiacich úloh + field_auth_source_ldap_filter: Filter LDAP + label_search_for_watchers: Hľadať pozorovateľov, ktorých chcete pridať + notice_account_deleted: "Váš účet bol natrvalo vymazaný." + setting_unsubscribe: Povoliť používateľom vymazať svoj vlastný účet + button_delete_my_account: Vymazať môj účet + text_account_destroy_confirmation: "Naozaj si želáte pokračovať?\nVáš účet bude natrvalo vymazaný, bez možnosti obnovenia." + error_session_expired: "Vaša relácia vypršala. Prihláste sa prosím znovu." + text_session_expiration_settings: "Varovanie: zmenou týchto nastavení môžu vypršať aktuálne relácie vrátane vašej." + setting_session_lifetime: Maximálny čas relácie + setting_session_timeout: Vypršanie relácie pri neaktivite + label_session_expiration: Vypršanie relácie + permission_close_project: Uzavretie / opätovné otvorenie projektu + label_show_closed_projects: Zobraziť uzavreté projekty + button_close: Uzavrieť + button_reopen: Opäť otvoriť + project_status_active: aktívny + project_status_closed: uzavretý + project_status_archived: archivovaný + text_project_closed: Tento projekt je uzavretý a prístupný iba na čítanie. + notice_user_successful_create: "Používateľ %{id} bol vytvorený." + field_core_fields: Štandardné polia + field_timeout: "Vypršanie (v sekundách)" + setting_thumbnails_enabled: Zobraziť miniatúry príloh + setting_thumbnails_size: Veľkosť miniatúry (v pixeloch) + label_status_transitions: Zmeny stavu + label_fields_permissions: Oprávnenia k poliam + label_readonly: Iba na čítanie + label_required: Povinné + text_repository_identifier_info: 'Sú povolené iba malé písmená (a-z), čísla, pomlčky a podčiarkovníky.
    Po uložení už nie je možné identifikátor zmeniť.' + field_board_parent: Nadradené fórum + label_attribute_of_project: "%{name} projektu" + label_attribute_of_author: "%{name} autora" + label_attribute_of_assigned_to: "%{name} priradeného používateľa" + label_attribute_of_fixed_version: "%{name} cieľovej verzie" + label_copy_subtasks: Kopírovať podúlohy + label_copied_to: Skopírované do + label_copied_from: Skopírované z + label_any_issues_in_project: všetky úlohy projektu + label_any_issues_not_in_project: všetky úlohy nepatriace do projektu + field_private_notes: Súkromné poznámky + permission_view_private_notes: Zobrazenie súkromných poznámok + permission_set_notes_private: Nastavenie poznámok ako súkromné + label_no_issues_in_project: žiadne úlohy projektu label_any: všetko - label_last_n_weeks: last %{count} weeks - setting_cross_project_subtasks: Allow cross-project subtasks - label_cross_project_descendants: S podprojektami + label_last_n_weeks: "posledných %{count} týždňov" + setting_cross_project_subtasks: Povoliť podúlohy naprieč projektmi + label_cross_project_descendants: S podprojektmi label_cross_project_tree: S projektovým stromom label_cross_project_hierarchy: S hierarchiou projektu - label_cross_project_system: So všetkými projektami - button_hide: Hide - setting_non_working_week_days: Non-working days - label_in_the_next_days: in the next - label_in_the_past_days: in the past - label_attribute_of_user: User's %{name} - text_turning_multiple_off: If you disable multiple values, multiple values will be - removed in order to preserve only one value per item. - label_attribute_of_issue: Issue's %{name} - permission_add_documents: Add documents - permission_edit_documents: Edit documents - permission_delete_documents: Delete documents - label_gantt_progress_line: Progress line - setting_jsonp_enabled: Enable JSONP support - field_inherit_members: Inherit members - field_closed_on: Closed - setting_default_projects_tracker_ids: Default trackers for new projects - label_total_time: Celkovo - text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. - text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. - setting_emails_header: Email header + label_cross_project_system: So všetkými projektmi + button_hide: Skryť + setting_non_working_week_days: Dni voľna + label_in_the_next_days: počas nasledujúcich + label_in_the_past_days: počas minulých + label_attribute_of_user: "%{name} používateľa" + text_turning_multiple_off: "Ak zakážete výber viacerých hodnôt, polia s výberom viacerých hodnôt budú vyčistené. Tým sa zaistí, aby bola pre každé pole vybraná vždy len jedna hodnota." + label_attribute_of_issue: "%{name} úlohy" + permission_add_documents: Pridávanie dokumentov + permission_edit_documents: Úprava dokumentov + permission_delete_documents: Mazanie dokumentov + label_gantt_progress_line: Indikátor napredovania + setting_jsonp_enabled: Povoliť podporu JSONP + field_inherit_members: Zdediť členov + field_closed_on: Uzavreté + field_generate_password: Vygenerovať heslo + setting_default_projects_tracker_ids: Predvolené fronty pri nových projektoch + label_total_time: Celkový čas + text_scm_config: Svoje príkazy SCM môžete konfigurovať v súbore config/configuration.yml. Po jeho úprave prosím reštartujte aplikáciu. + text_scm_command_not_available: Príkaz SCM nie je k dispozícii. Skontrolujte prosím nastavenia na administračnom paneli. + setting_emails_header: Hlavička emailu + notice_account_not_activated_yet: Váš účet ešte nebol aktivovaný. Ak potrebujete zaslať nový aktivačný email, kliknite prosím na tento odkaz. + notice_account_locked: Váš účet je uzamknutý. + label_hidden: Skryté + label_visibility_private: iba pre mňa + label_visibility_roles: iba pre tieto roly + label_visibility_public: pre všetkých používateľov + field_must_change_passwd: Pri najbližšom prihlásení je potrebné zmeniť heslo + notice_new_password_must_be_different: Nové heslo nesmie byť rovnaké ako súčasné heslo + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/sl.yml redmine-2.4.2/config/locales/sl.yml --- redmine-2.3.3/config/locales/sl.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/sl.yml 2013-12-23 08:48:39.000000000 +0000 @@ -6,9 +6,9 @@ # Use the strftime parameters for formats. # When no format has been given, it uses default. # You can provide other formats here if you like! - default: "%Y-%m-%d" - short: "%b %d" - long: "%B %d, %Y" + default: "%d.%m.%Y" + short: "%d. %b" + long: "%d. %B, %Y" day_names: [Nedelja, Ponedeljek, Torek, Sreda, Četrtek, Petek, Sobota] abbr_day_names: [Ned, Pon, To, Sr, Čet, Pet, Sob] @@ -18,16 +18,16 @@ abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Aug, Sep, Okt, Nov, Dec] # Used in date_select and datime_select. order: - - :year - - :month - :day + - :month + - :year time: formats: - default: "%a, %d %b %Y %H:%M:%S %z" + default: "%a, %d. %b, %Y %H:%M:%S %z" time: "%H:%M" - short: "%d %b %H:%M" - long: "%B %d, %Y %H:%M" + short: "%d. %b %H:%M" + long: "%d. %B, %Y %H:%M" am: "am" pm: "pm" @@ -128,6 +128,7 @@ not_same_project: "ne pripada istemu projektu" circular_dependency: "Ta odnos bi povzročil krožno odvisnost" cant_link_an_issue_with_a_descendant: "Zahtevek ne more biti povezan s svojo podnalogo" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Prosimo izberite @@ -160,7 +161,7 @@ notice_not_authorized: Nimate privilegijev za dostop do te strani. notice_email_sent: "E-poštno sporočilo je bilo poslano %{value}" notice_email_error: "Ob pošiljanju e-sporočila je prišlo do napake (%{value})" - notice_feeds_access_key_reseted: Vaš RSS dostopni ključ je bil ponastavljen. + notice_feeds_access_key_reseted: Vaš Atom dostopni ključ je bil ponastavljen. notice_failed_to_save_issues: "Neuspelo shranjevanje %{count} zahtevka na %{total} izbranem: %{ids}." notice_no_issue_selected: "Izbran ni noben zahtevek! Prosimo preverite zahtevke, ki jih želite urediti." notice_account_pending: "Vaš račun je bil ustvarjen in čaka na potrditev s strani administratorja." @@ -178,7 +179,7 @@ mail_subject_register: "Aktivacija %{value} vašega računa" mail_body_register: 'Za aktivacijo vašega računa kliknite na naslednjo povezavo:' mail_body_account_information_external: "Za prijavo lahko uporabite vaš %{value} račun." - mail_body_account_information: Informacije o vašem računu + mail_body_account_information: "Informacije o vašem računu. Za spremembo gesla sledite linku 'Spremeni geslo' na naslovu za prijavo, spodaj." mail_subject_account_activation_request: "%{value} zahtevek za aktivacijo računa" mail_body_account_activation_request: "Registriral se je nov uporabnik (%{value}). Račun čaka na vašo odobritev:" mail_subject_reminder: "%{count} zahtevek(zahtevki) zapadejo v naslednjih %{days} dneh" @@ -284,7 +285,7 @@ setting_host_name: Ime gostitelja in pot setting_text_formatting: Oblikovanje besedila setting_wiki_compression: Stiskanje Wiki zgodovine - setting_feeds_limit: Meja obsega RSS virov + setting_feeds_limit: Meja obsega Atom virov setting_default_projects_public: Novi projekti so privzeto javni setting_autofetch_changesets: Samodejni izvleček zapisa sprememb setting_sys_api_enabled: Omogoči WS za upravljanje shrambe @@ -414,20 +415,20 @@ label_information_plural: Informacije label_please_login: Prosimo prijavite se label_register: Registracija - label_password_lost: Izgubljeno geslo + label_password_lost: Spremeni geslo label_home: Domov label_my_page: Moja stran label_my_account: Moj račun label_my_projects: Moji projekti label_administration: Upravljanje - label_login: Prijavi se - label_logout: Odjavi se + label_login: Prijava + label_logout: Odjava label_help: Pomoč label_reported_issues: Prijavljeni zahtevki label_assigned_to_me_issues: Zahtevki dodeljeni meni label_last_login: Zadnja povezava label_registered_on: Registriran - label_activity: Aktivnost + label_activity: Aktivnosti label_overall_activity: Celotna aktivnost label_user_activity: "Aktivnost %{value}" label_new: Nov @@ -466,7 +467,7 @@ label_news_view_all: Poglej vse novice label_news_added: Dodane novice label_settings: Nastavitve - label_overview: Pregled + label_overview: Povzetek label_version: Verzija label_version_new: Nova verzija label_version_plural: Verzije @@ -571,16 +572,16 @@ label_search: Išči label_result_plural: Rezultati label_all_words: Vse besede - label_wiki: Wiki - label_wiki_edit: Wiki urejanje - label_wiki_edit_plural: Wiki urejanja - label_wiki_page: Wiki stran - label_wiki_page_plural: Wiki strani + label_wiki: Predstavitev + label_wiki_edit: Uredi stran + label_wiki_edit_plural: Uredi strani + label_wiki_page: Predstavitvena stran + label_wiki_page_plural: Predstavitvene strani label_index_by_title: Razvrsti po naslovu label_index_by_date: Razvrsti po datumu label_current_version: Trenutna verzija label_preview: Predogled - label_feed_plural: RSS viri + label_feed_plural: Atom viri label_changes_details: Podrobnosti o vseh spremembah label_issue_tracking: Sledenje zahtevkom label_spent_time: Porabljen čas @@ -636,11 +637,11 @@ label_language_based: Glede na uporabnikov jezik label_sort_by: "Razporedi po %{value}" label_send_test_email: Pošlji testno e-pismo - label_feeds_access_key_created_on: "RSS dostopni ključ narejen %{value} nazaj" + label_feeds_access_key_created_on: "Atom dostopni ključ narejen %{value} nazaj" label_module_plural: Moduli - label_added_time_by: "Dodan %{author} %{age} nazaj" - label_updated_time_by: "Posodobljen od %{author} %{age} nazaj" - label_updated_time: "Posodobljen %{value} nazaj" + label_added_time_by: "Dodal %{author} %{age} nazaj" + label_updated_time_by: "Posodobil %{author} %{age} nazaj" + label_updated_time: "Posodobljeno %{value} nazaj" label_jump_to_a_project: Skoči na projekt... label_file_plural: Datoteke label_changeset_plural: Zapisi sprememb @@ -738,7 +739,7 @@ text_issues_ref_in_commit_messages: Zahtevki sklicev in popravkov v sporočilu predaje text_issue_added: "Zahtevek %{id} je sporočil(a) %{author}." text_issue_updated: "Zahtevek %{id} je posodobil(a) %{author}." - text_wiki_destroy_confirmation: Ali ste prepričani da želite izbrisati ta wiki in vso njegovo vsebino? + text_wiki_destroy_confirmation: Ali ste prepričani da želite izbrisati to wiki stran in vso njeno vsebino? text_issue_category_destroy_question: "Nekateri zahtevki (%{count}) so dodeljeni tej kategoriji. Kaj želite storiti?" text_issue_category_destroy_assignments: Odstrani naloge v kategoriji text_issue_category_reassign_to: Ponovno dodeli zahtevke tej kategoriji @@ -870,11 +871,11 @@ label_revision_id: Revizija %{value} label_api_access_key: API dostopni ključ label_api_access_key_created_on: API dostopni ključ ustvarjen pred %{value} - label_feeds_access_key: RSS dostopni ključ + label_feeds_access_key: Atom dostopni ključ notice_api_access_key_reseted: Vaš API dostopni ključ je bil ponastavljen. setting_rest_api_enabled: Omogoči REST spletni servis label_missing_api_access_key: Manjkajoč API dostopni ključ - label_missing_feeds_access_key: Manjkajoč RSS dostopni ključ + label_missing_feeds_access_key: Manjkajoč Atom dostopni ključ button_show: Prikaži text_line_separated: Dovoljenih več vrednosti (ena vrstica za vsako vrednost). setting_mail_handler_body_delimiters: Odreži e-pošto po eni od teh vrstic @@ -1085,5 +1086,18 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Skupaj + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/sq.yml redmine-2.4.2/config/locales/sq.yml --- redmine-2.3.3/config/locales/sq.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/sq.yml 2013-12-23 08:48:39.000000000 +0000 @@ -129,6 +129,7 @@ not_same_project: "nuk i perket te njejtit projekt" circular_dependency: "Ky relacion do te krijoje nje varesi ciklike (circular dependency)" cant_link_an_issue_with_a_descendant: "Nje ceshtje nuk mund te lidhet me nenceshtje" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Zgjidhni @@ -162,7 +163,7 @@ notice_not_authorized_archived_project: Projekti, qe po tentoni te te aksesoni eshte arkivuar. notice_email_sent: "Nje email eshte derguar ne %{value}" notice_email_error: "Pati nje gabim gjate dergimit te email-it (%{value})" - notice_feeds_access_key_reseted: Your RSS access key was reset. + notice_feeds_access_key_reseted: Your Atom access key was reset. notice_api_access_key_reseted: Your API access key was reset. notice_failed_to_save_issues: "Deshtoi ne ruajtjen e %{count} ceshtje(ve) ne %{total} te zgjedhura: %{ids}." notice_failed_to_save_time_entries: "Deshtoi ne ruajtjen e %{count} time entrie(s) ne %{total} te zgjedhura: %{ids}." @@ -753,9 +754,9 @@ label_language_based: Based on user's language label_sort_by: "Sort by %{value}" label_send_test_email: Send a test email - label_feeds_access_key: RSS access key - label_missing_feeds_access_key: Missing a RSS access key - label_feeds_access_key_created_on: "RSS access key created %{value} ago" + label_feeds_access_key: Atom access key + label_missing_feeds_access_key: Missing a Atom access key + label_feeds_access_key_created_on: "Atom access key created %{value} ago" label_module_plural: Modules label_added_time_by: "Added by %{author} %{age} ago" label_updated_time_by: "Updated by %{author} %{age} ago" @@ -1077,9 +1078,22 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Total text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_footer: Email footer setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/sr-YU.yml redmine-2.4.2/config/locales/sr-YU.yml --- redmine-2.3.3/config/locales/sr-YU.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/sr-YU.yml 2013-12-23 08:48:39.000000000 +0000 @@ -132,6 +132,7 @@ not_same_project: "ne pripada istom projektu" circular_dependency: "Ova veza će stvoriti kružnu referencu" cant_link_an_issue_with_a_descendant: "Problem ne može biti povezan sa jednim od svojih podzadataka" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Molim odaberite @@ -164,7 +165,7 @@ notice_not_authorized: Niste ovlašćeni za pristup ovoj strani. notice_email_sent: "E-poruka je poslata na %{value}" notice_email_error: "Dogodila se greška prilikom slanja e-poruke (%{value})" - notice_feeds_access_key_reseted: Vaš RSS pristupni ključ je poništen. + notice_feeds_access_key_reseted: Vaš Atom pristupni ključ je poništen. notice_api_access_key_reseted: Vaš API pristupni ključ je poništen. notice_failed_to_save_issues: "Neuspešno snimanje %{count} problema od %{total} odabranih: %{ids}." notice_failed_to_save_members: "Neuspešno snimanje člana(ova): %{errors}." @@ -704,9 +705,9 @@ label_language_based: Bazirano na jeziku korisnika label_sort_by: "Sortirano po %{value}" label_send_test_email: Slanje probne e-poruke - label_feeds_access_key: RSS pristupni ključ - label_missing_feeds_access_key: RSS pristupni ključ nedostaje - label_feeds_access_key_created_on: "RSS pristupni ključ je napravljen pre %{value}" + label_feeds_access_key: Atom pristupni ključ + label_missing_feeds_access_key: Atom pristupni ključ nedostaje + label_feeds_access_key_created_on: "Atom pristupni ključ je napravljen pre %{value}" label_module_plural: Moduli label_added_time_by: "Dodao %{author} pre %{age}" label_updated_time_by: "Ažurirao %{author} pre %{age}" @@ -1085,7 +1086,20 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Ukupno text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/sr.yml redmine-2.4.2/config/locales/sr.yml --- redmine-2.3.3/config/locales/sr.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/sr.yml 2013-12-23 08:48:39.000000000 +0000 @@ -130,6 +130,7 @@ not_same_project: "не припада истом пројекту" circular_dependency: "Ова веза ће створити кружну референцу" cant_link_an_issue_with_a_descendant: "Проблем не може бити повезан са једним од својих подзадатака" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Молим одаберите @@ -162,7 +163,7 @@ notice_not_authorized: Нисте овлашћени за приступ овој страни. notice_email_sent: "E-порука је послата на %{value}" notice_email_error: "Догодила се грешка приликом слања е-поруке (%{value})" - notice_feeds_access_key_reseted: Ваш RSS приступни кључ је поништен. + notice_feeds_access_key_reseted: Ваш Atom приступни кључ је поништен. notice_api_access_key_reseted: Ваш API приступни кључ је поништен. notice_failed_to_save_issues: "Неуспешно снимање %{count} проблема од %{total} одабраних: %{ids}." notice_failed_to_save_members: "Неуспешно снимање члана(ова): %{errors}." @@ -702,9 +703,9 @@ label_language_based: Базирано на језику корисника label_sort_by: "Сортирано по %{value}" label_send_test_email: Слање пробне е-поруке - label_feeds_access_key: RSS приступни кључ - label_missing_feeds_access_key: RSS приступни кључ недостаје - label_feeds_access_key_created_on: "RSS приступни кључ је направљен пре %{value}" + label_feeds_access_key: Atom приступни кључ + label_missing_feeds_access_key: Atom приступни кључ недостаје + label_feeds_access_key_created_on: "Atom приступни кључ је направљен пре %{value}" label_module_plural: Модули label_added_time_by: "Додао %{author} пре %{age}" label_updated_time_by: "Ажурирао %{author} пре %{age}" @@ -1083,8 +1084,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Укупно text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/sv.yml redmine-2.4.2/config/locales/sv.yml --- redmine-2.3.3/config/locales/sv.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/sv.yml 2013-12-23 08:48:39.000000000 +0000 @@ -134,6 +134,7 @@ not_same_project: "tillhör inte samma projekt" circular_dependency: "Denna relation skulle skapa ett cirkulärt beroende" cant_link_an_issue_with_a_descendant: "Ett ärende kan inte länkas till ett av dess underärenden" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" direction: ltr date: @@ -204,7 +205,7 @@ notice_not_authorized_archived_project: Projektet du försöker komma åt har arkiverats. notice_email_sent: "Ett mail skickades till %{value}" notice_email_error: "Ett fel inträffade när mail skickades (%{value})" - notice_feeds_access_key_reseted: Din RSS-nyckel återställdes. + notice_feeds_access_key_reseted: Din Atom-nyckel återställdes. notice_api_access_key_reseted: Din API-nyckel återställdes. notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valda: %{ids}." notice_failed_to_save_time_entries: "Misslyckades med att spara %{count} tidloggning(ar) på %{total} valda: %{ids}." @@ -374,6 +375,7 @@ field_board_parent: Förälderforum field_private_notes: Privata anteckningar field_inherit_members: Ärv medlemmar + field_generate_password: Generera lösenord setting_app_title: Applikationsrubrik setting_app_subtitle: Applikationsunderrubrik @@ -829,9 +831,9 @@ label_language_based: Språkbaserad label_sort_by: "Sortera på %{value}" label_send_test_email: Skicka testmail - label_feeds_access_key: RSS-nyckel - label_missing_feeds_access_key: Saknar en RSS-nyckel - label_feeds_access_key_created_on: "RSS-nyckel skapad för %{value} sedan" + label_feeds_access_key: Atom-nyckel + label_missing_feeds_access_key: Saknar en Atom-nyckel + label_feeds_access_key_created_on: "Atom-nyckel skapad för %{value} sedan" label_module_plural: Moduler label_added_time_by: "Tillagd av %{author} för %{age} sedan" label_updated_time_by: "Uppdaterad av %{author} för %{age} sedan" @@ -1125,3 +1127,15 @@ description_date_from: Ange startdatum description_date_to: Ange slutdatum text_repository_identifier_info: 'Endast gemener (a-z), siffror, streck och understreck är tillåtna.
    När identifieraren sparats kan den inte ändras.' + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/th.yml redmine-2.4.2/config/locales/th.yml --- redmine-2.3.3/config/locales/th.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/th.yml 2013-12-23 08:48:39.000000000 +0000 @@ -127,6 +127,7 @@ not_same_project: "ไม่ได้อยู่ในโครงการเดียวกัน" circular_dependency: "ความสัมพันธ์อ้างอิงเป็นวงกลม" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: กรุณาเลือก @@ -159,7 +160,7 @@ notice_not_authorized: คุณไม่มีสิทธิเข้าถึงหน้านี้. notice_email_sent: "อีเมล์ได้ถูกส่งถึง %{value}" notice_email_error: "เกิดความผิดพลาดขณะกำส่งอีเมล์ (%{value})" - notice_feeds_access_key_reseted: RSS access key ของคุณถูก reset แล้ว. + notice_feeds_access_key_reseted: Atom access key ของคุณถูก reset แล้ว. notice_failed_to_save_issues: "%{count} ปัญหาจาก %{total} ปัญหาที่ถูกเลือกไม่สามารถจัดเก็บ: %{ids}." notice_no_issue_selected: "ไม่มีปัญหาที่ถูกเลือก! กรุณาเลือกปัญหาที่คุณต้องการแก้ไข." notice_account_pending: "บัญชีของคุณสร้างเสร็จแล้ว ขณะนี้รอการอนุมัติจากผู้บริหารจัดการ." @@ -573,7 +574,7 @@ label_language_based: ขึ้นอยู่กับภาษาของผู้ใช้ label_sort_by: "เรียงโดย %{value}" label_send_test_email: ส่งจดหมายทดสอบ - label_feeds_access_key_created_on: "RSS access key สร้างเมื่อ %{value} ที่ผ่านมา" + label_feeds_access_key_created_on: "Atom access key สร้างเมื่อ %{value} ที่ผ่านมา" label_module_plural: ส่วนประกอบ label_added_time_by: "เพิ่มโดย %{author} %{age} ที่ผ่านมา" label_updated_time: "ปรับปรุง %{value} ที่ผ่านมา" @@ -870,11 +871,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1079,8 +1080,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: จำนวนรวม text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/tr.yml redmine-2.4.2/config/locales/tr.yml --- redmine-2.3.3/config/locales/tr.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/tr.yml 2013-12-23 08:48:39.000000000 +0000 @@ -1,6 +1,7 @@ # Turkish translations for Ruby on Rails # by Ozgun Ataman (ozataman@gmail.com) # by Burak Yigit Kaya (ben@byk.im) +# by Mert Salih Kaplan (mail@mertskaplan.com) tr: locale: @@ -151,6 +152,7 @@ not_same_project: "aynı projeye ait değil" circular_dependency: "Bu ilişki döngüsel bağımlılık meydana getirecektir" cant_link_an_issue_with_a_descendant: "Bir iş, alt işlerinden birine bağlanamaz" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" models: actionview_instancetag_blank_option: Lütfen Seçin @@ -183,7 +185,7 @@ notice_not_authorized: Bu sayfaya erişme yetkiniz yok. notice_email_sent: "E-posta gönderildi %{value}" notice_email_error: "E-posta gönderilirken bir hata oluştu (%{value})" - notice_feeds_access_key_reseted: RSS erişim anahtarınız sıfırlandı. + notice_feeds_access_key_reseted: Atom erişim anahtarınız sıfırlandı. notice_failed_to_save_issues: "Failed to save %{count} issue(s) on %{total} selected: %{ids}." notice_no_issue_selected: "Seçili iş yok! Lütfen, düzenlemek istediğiniz işleri işaretleyin." notice_account_pending: "Hesabınız oluşturuldu ve yönetici onayı bekliyor." @@ -253,7 +255,7 @@ field_effective_date: Tarih field_password: Parola field_new_password: Yeni Parola - field_password_confirmation: Onay + field_password_confirmation: Parola Doğrulama field_version: Sürüm field_type: Tip field_host: Host @@ -277,7 +279,7 @@ field_activity: Etkinlik field_spent_on: Tarih field_identifier: Tanımlayıcı - field_is_filter: filtre olarak kullanılmış + field_is_filter: süzgeç olarak kullanılmış field_issue_to: İlişkili iş field_delay: Gecikme field_assignable: Bu role atanabilecek işler @@ -470,7 +472,7 @@ label_gantt: İş-Zaman Çizelgesi label_internal: Dahili label_last_changes: "Son %{count} değişiklik" - label_change_view_all: Tüm Değişiklikleri gör + label_change_view_all: Tüm Değişiklikleri göster label_personalize_page: Bu sayfayı kişiselleştir label_comment: Yorum label_comment_plural: Yorumlar @@ -484,8 +486,8 @@ label_query: Özel Sorgu label_query_plural: Özel Sorgular label_query_new: Yeni Sorgu - label_filter_add: Filtre ekle - label_filter_plural: Filtreler + label_filter_add: Süzgeç ekle + label_filter_plural: Süzgeçler label_equals: Eşit label_not_equals: Eşit değil label_in_less_than: küçüktür @@ -595,7 +597,7 @@ label_language_based: Kullanıcı dili bazlı label_sort_by: "%{value} göre sırala" label_send_test_email: Test e-postası gönder - label_feeds_access_key_created_on: "RSS erişim anahtarı %{value} önce oluşturuldu" + label_feeds_access_key_created_on: "Atom erişim anahtarı %{value} önce oluşturuldu" label_module_plural: Modüller label_added_time_by: "%{author} tarafından %{age} önce eklendi" label_updated_time: "%{value} önce güncellendi" @@ -740,7 +742,7 @@ label_generate_key: "Anahtar oluştur" setting_sequential_project_identifiers: "Sıralı proje tanımlayıcıları oluştur" field_parent_title: Üst sayfa - text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/configuration.yml and restart the application to enable them." + text_email_delivery_not_configured: "E-posta gönderme yapılandırılmadı ve bildirimler devre dışı.\nconfig/configuration.yml içinden SMTP sunucusunu yapılandırın ve uygulamayı yeniden başlatın." text_enumeration_category_reassign_to: 'Hepsini şuna çevir:' label_issue_watchers: Takipçiler mail_body_reminder: "Size atanmış olan %{count} iş %{days} gün içerisinde bitirilmeli:" @@ -757,14 +759,14 @@ label_renamed: yeniden adlandırılmış label_copied: kopyalanmış setting_plain_text_mail: sadece düz metin (HTML yok) - permission_view_files: Dosyaları görme + permission_view_files: Dosyaları gösterme permission_edit_issues: İşleri düzenleme permission_edit_own_time_entries: Kendi zaman girişlerini düzenleme permission_manage_public_queries: Herkese açık sorguları yönetme permission_add_issues: İş ekleme permission_log_time: Harcanan zamanı kaydetme - permission_view_changesets: Değişimleri görme(SVN, vs.) - permission_view_time_entries: Harcanan zamanı görme + permission_view_changesets: Değişimleri gösterme(SVN, vs.) + permission_view_time_entries: Harcanan zamanı gösterme permission_manage_versions: Sürümleri yönetme permission_manage_wiki: Wiki'yi yönetme permission_manage_categories: İş kategorilerini yönetme @@ -774,37 +776,37 @@ permission_select_project_modules: Proje modüllerini seçme permission_edit_wiki_pages: Wiki sayfalarını düzenleme permission_add_issue_watchers: Takipçi ekleme - permission_view_gantt: İş-Zaman çizelgesi görme + permission_view_gantt: İş-Zaman çizelgesi gösterme permission_move_issues: İşlerin yerini değiştirme permission_manage_issue_relations: İşlerin biribiriyle bağlantılarını yönetme permission_delete_wiki_pages: Wiki sayfalarını silme permission_manage_boards: Panoları yönetme permission_delete_wiki_pages_attachments: Ekleri silme - permission_view_wiki_edits: Wiki geçmişini görme + permission_view_wiki_edits: Wiki geçmişini gösterme permission_add_messages: Mesaj gönderme - permission_view_messages: Mesajları görme + permission_view_messages: Mesajları gösterme permission_manage_files: Dosyaları yönetme permission_edit_issue_notes: Notları düzenleme permission_manage_news: Haberleri yönetme - permission_view_calendar: Takvimleri görme + permission_view_calendar: Takvimleri gösterme permission_manage_members: Üyeleri yönetme permission_edit_messages: Mesajları düzenleme permission_delete_issues: İşleri silme - permission_view_issue_watchers: Takipçi listesini görme + permission_view_issue_watchers: Takipçi listesini gösterme permission_manage_repository: Depo yönetimi permission_commit_access: Gönderme erişimi permission_browse_repository: Depoya gözatma - permission_view_documents: Belgeleri görme + permission_view_documents: Belgeleri gösterme permission_edit_project: Projeyi düzenleme permission_add_issue_notes: Not ekleme permission_save_queries: Sorgu kaydetme - permission_view_wiki_pages: Wiki görme + permission_view_wiki_pages: Wiki gösterme permission_rename_wiki_pages: Wiki sayfasının adını değiştirme permission_edit_time_entries: Zaman kayıtlarını düzenleme permission_edit_own_issue_notes: Kendi notlarını düzenleme setting_gravatar_enabled: Kullanıcı resimleri için Gravatar kullan label_example: Örnek - text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." + text_repository_usernames_mapping: "Redmine kullanıcı adlarını depo değişiklik kayıtlarındaki kullanıcı adlarıyla eşleştirin veya eşleştirmeleri güncelleyin.\nRedmine kullanıcı adları ile depo kullanıcı adları aynı olan kullanıcılar otomatik olarak eşlendirilecektir." permission_edit_own_messages: Kendi mesajlarını düzenleme permission_delete_own_messages: Kendi mesajlarını silme label_user_activity: "%{value} kullanıcısının etkinlikleri" @@ -844,7 +846,7 @@ mail_body_wiki_content_updated: "'%{id}' wiki sayfası, %{author} tarafından güncellendi." permission_add_project: Proje oluştur setting_new_project_user_role_id: Yönetici olmayan ancak proje yaratabilen kullanıcıya verilen rol - label_view_all_revisions: Tüm değişiklikleri gör + label_view_all_revisions: Tüm değişiklikleri göster label_tag: Etiket label_branch: Kol error_no_tracker_in_project: Bu projeye bağlanmış bir iş tipi yok. Lütfen proje ayarlarını kontrol edin. @@ -889,16 +891,16 @@ error_workflow_copy_source: Lütfen kaynak iş tipi ve rolleri seçin label_update_issue_done_ratios: İş tamamlanma oranlarını güncelle setting_start_of_week: Takvimleri şundan başlat - permission_view_issues: İşleri Gör + permission_view_issues: İşleri Göster label_display_used_statuses_only: Sadece bu iş tipi tarafından kullanılan durumları göster label_revision_id: Değişiklik %{value} label_api_access_key: API erişim anahtarı label_api_access_key_created_on: API erişim anahtarı %{value} önce oluşturuldu - label_feeds_access_key: RSS erişim anahtarı + label_feeds_access_key: Atom erişim anahtarı notice_api_access_key_reseted: API erişim anahtarınız sıfırlandı. setting_rest_api_enabled: REST web servisini etkinleştir label_missing_api_access_key: Bir API erişim anahtarı eksik - label_missing_feeds_access_key: Bir RSS erişim anahtarı eksik + label_missing_feeds_access_key: Bir Atom erişim anahtarı eksik button_show: Göster text_line_separated: Çoklu değer girilebilir (her satıra bir değer). setting_mail_handler_body_delimiters: Şu satırların birinden sonra e-postayı sonlandır @@ -931,7 +933,7 @@ field_time_entries: Zaman Kayıtları project_module_gantt: İş-Zaman Çizelgesi project_module_calendar: Takvim - button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" + button_edit_associated_wikipage: "İlişkilendirilmiş Wiki sayfasını düzenle: %{page_title}" field_text: Metin alanı label_user_mail_option_only_owner: Sadece sahibi olduğum şeyler için setting_default_notification_option: Varsayılan bildirim seçeneği @@ -946,9 +948,9 @@ field_visible: Görünür setting_emails_header: "E-Posta başlığı" setting_commit_logtime_activity_id: Kaydedilen zaman için etkinlik - text_time_logged_by_changeset: Applied in changeset %{value}. + text_time_logged_by_changeset: Değişiklik uygulandı %{value}. setting_commit_logtime_enabled: Zaman kaydını etkinleştir - notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) + notice_gantt_chart_truncated: Görüntülenebilir öğelerin sayısını aştığı için tablo kısaltıldı (%{max}) setting_gantt_items_limit: İş-Zaman çizelgesinde gösterilecek en fazla öğe sayısı field_warn_on_leaving_unsaved: Kaydedilmemiş metin bulunan bir sayfadan çıkarken beni uyar text_warn_on_leaving_unsaved: Bu sayfada terkettiğiniz takdirde kaybolacak kaydedilmemiş metinler var. @@ -957,8 +959,8 @@ label_news_comment_added: Bir habere yorum eklendi button_expand_all: Tümünü genişlet button_collapse_all: Tümünü daralt - label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee - label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author + label_additional_workflow_transitions_for_assignee: Kullanıcı atanan olduğu zaman tanınacak ek yetkiler + label_additional_workflow_transitions_for_author: Kullanıcı yazar olduğu zaman tanınacak ek yetkiler label_bulk_edit_selected_time_entries: Seçilen zaman kayıtlarını toplu olarak düzenle text_time_entries_destroy_confirmation: Seçilen zaman kaydını/kayıtlarını silmek istediğinize emin misiniz? label_role_anonymous: Anonim @@ -966,143 +968,154 @@ label_issue_note_added: Not eklendi label_issue_status_updated: Durum güncellendi label_issue_priority_updated: Öncelik güncellendi - label_issues_visibility_own: Issues created by or assigned to the user + label_issues_visibility_own: Kullanıcı tarafından oluşturulmuş ya da kullanıcıya atanmış sorunlar field_issues_visibility: İşlerin görünürlüğü label_issues_visibility_all: Tüm işler - permission_set_own_issues_private: Set own issues public or private + permission_set_own_issues_private: Kendi işlerini özel ya da genel olarak işaretle field_is_private: Özel permission_set_issues_private: İşleri özel ya da genel olarak işaretleme label_issues_visibility_public: Özel olmayan tüm işler - text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). - field_commit_logs_encoding: Commit messages encoding + text_issues_destroy_descendants_confirmation: "%{count} alt görev de silinecek." + field_commit_logs_encoding: Değişiklik mesajı kodlaması(encoding) field_scm_path_encoding: Yol kodlaması(encoding) text_scm_path_encoding_note: "Varsayılan: UTF-8" - field_path_to_repository: Path to repository + field_path_to_repository: Depo yolu field_root_directory: Ana dizin field_cvs_module: Modül field_cvsroot: CVSROOT - text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) + text_mercurial_repository_note: Yerel depo (ör. /hgrepo, c:\hgrepo) text_scm_command: Komut text_scm_command_version: Sürüm - label_git_report_last_commit: Report last commit for files and directories - notice_issue_successful_create: Issue %{id} created. - label_between: between - setting_issue_group_assignment: Allow issue assignment to groups - label_diff: diff - text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) - description_query_sort_criteria_direction: Sort direction - description_project_scope: Search scope - description_filter: Filter - description_user_mail_notification: Mail notification settings - description_date_from: Enter start date - description_message_content: Message content - description_available_columns: Available Columns - description_date_range_interval: Choose range by selecting start and end date - description_issue_category_reassign: Choose issue category - description_search: Searchfield - description_notes: Notes - description_date_range_list: Choose range from list - description_choose_project: Projects - description_date_to: Enter end date - description_query_sort_criteria_attribute: Sort attribute - description_wiki_subpages_reassign: Choose new parent page - description_selected_columns: Selected Columns - label_parent_revision: Parent - label_child_revision: Child - error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. - setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues - button_edit_section: Edit this section - setting_repositories_encodings: Attachments and repositories encodings - description_all_columns: All Columns - button_export: Export - label_export_options: "%{export_format} export options" - error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) - notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." + label_git_report_last_commit: Son gönderilen dosya ve dizinleri raporla + notice_issue_successful_create: İş %{id} oluşturuldu. + label_between: arasında + setting_issue_group_assignment: Gruplara iş atanmasına izin ver + label_diff: farklar + text_git_repository_note: Depo yalın halde (bare) ve yerel sistemde bulunuyor. (örn. /gitrepo, c:\gitrepo) + description_query_sort_criteria_direction: Sıralama yönü + description_project_scope: Arama kapsamı + description_filter: Süzgeç + description_user_mail_notification: E-posta bildirim ayarları + description_date_from: Başlangıç tarihini gir + description_message_content: Mesaj içeriği + description_available_columns: Kullanılabilir Sütunlar + description_date_range_interval: Başlangıç ve bitiş tarihini seçerek tarih aralığını belirleyin + description_issue_category_reassign: İş kategorisini seçin + description_search: Arama alanı + description_notes: Notlar + description_date_range_list: Listeden tarih aralığını seçin + description_choose_project: Projeler + description_date_to: Bitiş tarihini gir + description_query_sort_criteria_attribute: Sıralama ölçütü + description_wiki_subpages_reassign: Yeni üst sayfa seç + description_selected_columns: Seçilmiş Sütunlar + label_parent_revision: Üst + label_child_revision: Alt + error_scm_annotate_big_text_file: Girdi maksimum metin dosyası boyutundan büyük olduğu için ek açıklama girilemiyor. + setting_default_issue_start_date_to_creation_date: Geçerli tarihi yeni işler için başlangıç tarihi olarak kullan + button_edit_section: Bölümü düzenle + setting_repositories_encodings: Eklerin ve depoların kodlamaları + description_all_columns: Tüm sütunlar + button_export: Dışarı aktar + label_export_options: "%{export_format} dışa aktarım seçenekleri" + error_attachment_too_big: İzin verilen maksimum dosya boyutunu (%{max_size}) aştığı için dosya yüklenemedi. + notice_failed_to_save_time_entries: "Seçilen %{total} adet zaman girdisinden %{count} tanesi kaydedilemedi: %{ids}." label_x_issues: zero: 0 İş one: 1 İş other: "%{count} İşler" - label_repository_new: New repository - field_repository_is_default: Main repository - label_copy_attachments: Copy attachments + label_repository_new: Yeni depo + field_repository_is_default: Ana depo + label_copy_attachments: Ekleri kopyala label_item_position: "%{position}/%{count}" - label_completed_versions: Completed versions - text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. - field_multiple: Multiple values - setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed - text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes - text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) - notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. - text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} - permission_manage_related_issues: Manage related issues - field_auth_source_ldap_filter: LDAP filter - label_search_for_watchers: Search for watchers to add - notice_account_deleted: Your account has been permanently deleted. - setting_unsubscribe: Allow users to delete their own account - button_delete_my_account: Delete my account + label_completed_versions: Tamamlanmış sürümler + text_project_identifier_info: Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir.
    Kaydedilen tanımlayıcı daha sonra değiştirilemez. + field_multiple: Çoklu değer + setting_commit_cross_project_ref: Diğer bütün projelerdeki iş kayıtlarının kaynak gösterilmesine ve kayıtların kapatılabilmesine izin ver + text_issue_conflict_resolution_add_notes: Notlarımı ekle ve diğer değişikliklerimi iptal et + text_issue_conflict_resolution_overwrite: Değişikliklerimi yine de uygula (önceki notlar saklanacak ancak bazı değişikliklerin üzerine yazılabilir) + notice_issue_update_conflict: Düzenleme yaparken başka bir kullanıcı tarafından sorun güncellendi. + text_issue_conflict_resolution_cancel: Tüm değişiklikleri iptal et ve yeniden görüntüle %{link} + permission_manage_related_issues: Benzer sorunları yönet + field_auth_source_ldap_filter: LDAP süzgeçi + label_search_for_watchers: Takipçi eklemek için ara + notice_account_deleted: Hesabınız kalıcı olarak silinmiştir. + setting_unsubscribe: Kullanıcıların kendi hesaplarını silebilmesine izin ver + button_delete_my_account: Hesabımı sil text_account_destroy_confirmation: |- - Are you sure you want to proceed? - Your account will be permanently deleted, with no way to reactivate it. - error_session_expired: Your session has expired. Please login again. - text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours." - setting_session_lifetime: Session maximum lifetime - setting_session_timeout: Session inactivity timeout - label_session_expiration: Session expiration - permission_close_project: Close / reopen the project - label_show_closed_projects: View closed projects - button_close: Close - button_reopen: Reopen - project_status_active: active - project_status_closed: closed - project_status_archived: archived - text_project_closed: This project is closed and read-only. - notice_user_successful_create: User %{id} created. - field_core_fields: Standard fields - field_timeout: Timeout (in seconds) - setting_thumbnails_enabled: Display attachment thumbnails - setting_thumbnails_size: Thumbnails size (in pixels) - label_status_transitions: Status transitions - label_fields_permissions: Fields permissions - label_readonly: Read-only - label_required: Required - text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.
    Once saved, the identifier cannot be changed. - field_board_parent: Parent forum - label_attribute_of_project: Project's %{name} - label_attribute_of_author: Author's %{name} - label_attribute_of_assigned_to: Assignee's %{name} - label_attribute_of_fixed_version: Target version's %{name} - label_copy_subtasks: Copy subtasks - label_copied_to: copied to - label_copied_from: copied from - label_any_issues_in_project: any issues in project - label_any_issues_not_in_project: any issues not in project - field_private_notes: Private notes - permission_view_private_notes: View private notes - permission_set_notes_private: Set notes as private - label_no_issues_in_project: no issues in project + Devam etmek istediğinize emin misiniz? + Hesabınız tekrar açılmamak üzere kalıcı olarak silinecektir. + error_session_expired: Oturum zaman aşımına uğradı. Lütfen tekrar giriş yapın. + text_session_expiration_settings: "Uyarı: Bu ayarları değiştirmek (sizinki de dahil) tüm oturumları sonlandırabilir." + setting_session_lifetime: Maksimum oturum süresi + setting_session_timeout: Maksimum hareketsizlik zaman aşımı + label_session_expiration: Oturum süre sonu + permission_close_project: Projeyi kapat/yeniden aç + label_show_closed_projects: Kapatılmış projeleri göster + button_close: Kapat + button_reopen: Yeniden aç + project_status_active: etkin + project_status_closed: kapalı + project_status_archived: arşivlenmiş + text_project_closed: Proje kapatıldı ve artık değiştirilemez. + notice_user_successful_create: Kullanıcı %{id} yaratıldı. + field_core_fields: Standart alanlar + field_timeout: Zaman aşımı (saniye olarak) + setting_thumbnails_enabled: Küçük resmi görüntüle + setting_thumbnails_size: Küçük resim boyutu (pixel olarak) + label_status_transitions: Durum değiştirme + label_fields_permissions: Alan izinleri + label_readonly: Salt okunur + label_required: Zorunlu + text_repository_identifier_info: Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir.
    Kaydedilen tanımlayıcı daha sonra değiştirilemez. + field_board_parent: Üst forum + label_attribute_of_project: Proje %{name} + label_attribute_of_author: Yazar %{name} + label_attribute_of_assigned_to: Atanan %{name} + label_attribute_of_fixed_version: Hedef sürüm %{name} + label_copy_subtasks: Alt görevi kopyala + label_copied_to: Kopyalama hedefi + label_copied_from: Kopyalanacak kaynak + label_any_issues_in_project: projedeki herhangi bir sorun + label_any_issues_not_in_project: projede olmayan herhangi bir sorun + field_private_notes: Özel notlar + permission_view_private_notes: Özel notları görüntüle + permission_set_notes_private: Notları özel olarak işaretle + label_no_issues_in_project: projede hiçbir sorun yok label_any: Hepsi - label_last_n_weeks: last %{count} weeks - setting_cross_project_subtasks: Allow cross-project subtasks + label_last_n_weeks: son %{count} hafta + setting_cross_project_subtasks: Projeler arası alt işlere izin ver label_cross_project_descendants: Alt projeler ile label_cross_project_tree: Proje ağacı ile label_cross_project_hierarchy: Proje hiyerarşisi ile label_cross_project_system: Tüm projeler ile - button_hide: Hide - setting_non_working_week_days: Non-working days - label_in_the_next_days: in the next - label_in_the_past_days: in the past - label_attribute_of_user: User's %{name} - text_turning_multiple_off: If you disable multiple values, multiple values will be - removed in order to preserve only one value per item. - label_attribute_of_issue: Issue's %{name} - permission_add_documents: Add documents - permission_edit_documents: Edit documents - permission_delete_documents: Delete documents - label_gantt_progress_line: Progress line - setting_jsonp_enabled: Enable JSONP support - field_inherit_members: Inherit members - field_closed_on: Closed - setting_default_projects_tracker_ids: Default trackers for new projects + button_hide: Gizle + setting_non_working_week_days: Tatil günleri + label_in_the_next_days: gelecekte + label_in_the_past_days: geçmişte + label_attribute_of_user: Kullanıcı %{name} + text_turning_multiple_off: Çoklu değer seçimini devre dışı bırakırsanız, çoklu değer içeren alanlar, her alan için yalnızca tek değer girilecek şekilde düzenlenecektir. + label_attribute_of_issue: Sorun %{name} + permission_add_documents: Belgeleri ekle + permission_edit_documents: Belgeleri düzenle + permission_delete_documents: Belgeleri sil + label_gantt_progress_line: İlerleme çizgisi + setting_jsonp_enabled: JSONP desteğini etkinleştir + field_inherit_members: Devralan kullanıcılar + field_closed_on: Kapanış tarihi + field_generate_password: Parola oluştur + setting_default_projects_tracker_ids: Yeni projeler için varsayılan iş tipi label_total_time: Toplam - text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. - text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. + text_scm_config: config/configuration.yml içinden SCM komutlarını yapılandırabilirsiniz. Lütfen yapılandırmadan sonra uygulamayı tekrar başlatın. + text_scm_command_not_available: SCM komutu kullanılamıyor. Lütfen yönetim panelinden ayarları kontrol edin. + notice_account_not_activated_yet: Hesabınız henüz etkinleştirilmedi. Yeni bir hesap etkinleştirme e-postası istiyorsanız, lütfen buraya tıklayınız.. + notice_account_locked: Hesabınız kilitlendi. + label_hidden: Gizle + label_visibility_private: yalnız benim için + label_visibility_roles: yalnız bu roller için + label_visibility_public: herhangi bir kullanıcı için + field_must_change_passwd: Bir sonraki girişinizde şifrenizi değiştirmeniz gerekir. + notice_new_password_must_be_different: Yeni parola geçerli paroladan + farklı olmalı + setting_mail_handler_excluded_filenames: Dosya adı belirtilen ekleri hariç tut + text_convert_available: ImageMagick dönüştürmesi kullanılabilir (isteğe bağlı) diff -Nru redmine-2.3.3/config/locales/uk.yml redmine-2.4.2/config/locales/uk.yml --- redmine-2.3.3/config/locales/uk.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/uk.yml 2013-12-23 08:48:39.000000000 +0000 @@ -127,6 +127,7 @@ not_same_project: "не відносяться до одного проекту" circular_dependency: "Такий зв'язок приведе до циклічної залежності" cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: Оберіть @@ -160,7 +161,7 @@ notice_not_authorized: У вас немає прав для відвідини даної сторінки. notice_email_sent: "Відправлено листа %{value}" notice_email_error: "Під час відправки листа відбулася помилка (%{value})" - notice_feeds_access_key_reseted: Ваш ключ доступу RSS було скинуто. + notice_feeds_access_key_reseted: Ваш ключ доступу Atom було скинуто. notice_failed_to_save_issues: "Не вдалося зберегти %{count} пункт(ів) з %{total} вибраних: %{ids}." notice_no_issue_selected: "Не вибрано жодної задачі! Будь ласка, відзначте задачу, яку ви хочете відредагувати." notice_account_pending: "Ваш обліковий запис створено і він чекає на підтвердження адміністратором." @@ -532,7 +533,7 @@ label_language_based: На основі мови користувача label_sort_by: "Сортувати за %{value}" label_send_test_email: Послати email для перевірки - label_feeds_access_key_created_on: "Ключ доступу RSS створений %{value} назад " + label_feeds_access_key_created_on: "Ключ доступу Atom створений %{value} назад " label_module_plural: Модулі label_added_time_by: "Доданий %{author} %{age} назад" label_updated_time: "Оновлений %{value} назад" @@ -870,11 +871,11 @@ label_revision_id: Revision %{value} label_api_access_key: API access key label_api_access_key_created_on: API access key created %{value} ago - label_feeds_access_key: RSS access key + label_feeds_access_key: Atom access key notice_api_access_key_reseted: Your API access key was reset. setting_rest_api_enabled: Enable REST web service label_missing_api_access_key: Missing an API access key - label_missing_feeds_access_key: Missing a RSS access key + label_missing_feeds_access_key: Missing a Atom access key button_show: Show text_line_separated: Multiple values allowed (one line for each value). setting_mail_handler_body_delimiters: Truncate emails after one of these lines @@ -1077,8 +1078,21 @@ setting_jsonp_enabled: Enable JSONP support field_inherit_members: Inherit members field_closed_on: Closed + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Всього text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. setting_emails_header: Email header + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/vi.yml redmine-2.4.2/config/locales/vi.yml --- redmine-2.3.3/config/locales/vi.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/vi.yml 2013-12-23 08:48:39.000000000 +0000 @@ -144,6 +144,7 @@ not_same_project: "không thuộc cùng dự án" circular_dependency: "quan hệ có thể gây ra lặp vô tận" cant_link_an_issue_with_a_descendant: "Một vấn đề không thể liên kết tới một trong số những tác vụ con của nó" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" direction: ltr date: @@ -214,7 +215,7 @@ notice_not_authorized: Bạn không có quyền xem trang này. notice_email_sent: "Email đã được gửi tới %{value}" notice_email_error: "Lỗi xảy ra khi gửi email (%{value})" - notice_feeds_access_key_reseted: Mã số chứng thực RSS đã được tạo lại. + notice_feeds_access_key_reseted: Mã số chứng thực Atom đã được tạo lại. notice_failed_to_save_issues: "Thất bại khi lưu %{count} vấn đề trong %{total} lựa chọn: %{ids}." notice_no_issue_selected: "Không có vấn đề được chọn! Vui lòng kiểm tra các vấn đề bạn cần chỉnh sửa." notice_account_pending: "Thông tin tài khoản đã được tạo ra và đang chờ chứng thực từ ban quản trị." @@ -637,7 +638,7 @@ label_language_based: Theo ngôn ngữ người dùng label_sort_by: "Sắp xếp theo %{value}" label_send_test_email: Gửi một email kiểm tra - label_feeds_access_key_created_on: "Mã chứng thực RSS được tạo ra cách đây %{value}" + label_feeds_access_key_created_on: "Mã chứng thực Atom được tạo ra cách đây %{value}" label_module_plural: Module label_added_time_by: "Thêm bởi %{author} cách đây %{age}" label_updated_time: "Cập nhật cách đây %{value}" @@ -924,11 +925,11 @@ label_revision_id: "Bản điều chỉnh %{value}" label_api_access_key: Khoá truy cập API label_api_access_key_created_on: "Khoá truy cập API đựơc tạo cách đây %{value}. Khóa này được dùng cho eDesignLab Client." - label_feeds_access_key: Khoá truy cập RSS + label_feeds_access_key: Khoá truy cập Atom notice_api_access_key_reseted: Khoá truy cập API của bạn đã được đặt lại. setting_rest_api_enabled: Cho phép dịch vụ web REST label_missing_api_access_key: Mất Khoá truy cập API - label_missing_feeds_access_key: Mất Khoá truy cập RSS + label_missing_feeds_access_key: Mất Khoá truy cập Atom button_show: Hiện text_line_separated: Nhiều giá trị được phép(mỗi dòng một giá trị). setting_mail_handler_body_delimiters: "Cắt bớt email sau những dòng :" @@ -1138,5 +1139,18 @@ setting_jsonp_enabled: Cho phép trợ giúp JSONP field_inherit_members: Các thành viên kế thừa field_closed_on: Đã đóng + field_generate_password: Generate password setting_default_projects_tracker_ids: Default trackers for new projects label_total_time: Tổng cộng + notice_account_not_activated_yet: You haven't activated your account yet. If you want + to receive a new activation email, please click this link. + notice_account_locked: Your account is locked. + label_hidden: Hidden + label_visibility_private: to me only + label_visibility_roles: to these roles only + label_visibility_public: to any users + field_must_change_passwd: Must change password at next logon + notice_new_password_must_be_different: The new password must be different from the + current password + setting_mail_handler_excluded_filenames: Exclude attachments by name + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/locales/zh-TW.yml redmine-2.4.2/config/locales/zh-TW.yml --- redmine-2.3.3/config/locales/zh-TW.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/locales/zh-TW.yml 2013-12-23 08:48:39.000000000 +0000 @@ -186,6 +186,7 @@ not_same_project: "不屬於同一個專案" circular_dependency: "這個關聯會導致環狀相依" cant_link_an_issue_with_a_descendant: "問題無法被連結至自己的子任務" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" # You can define own errors for models or model attributes. # The values :model, :attribute and :value are always available for interpolation. @@ -233,6 +234,8 @@ notice_account_wrong_password: 密碼不正確 notice_account_register_done: 帳號已建立成功。欲啟用您的帳號,請點擊系統確認信函中的啟用連結。 notice_account_unknown_email: 未知的使用者 + notice_account_not_activated_yet: 您尚未完成啟用您的帳號。若您要索取新的帳號啟用 Email ,請 點擊此連結 。 + notice_account_locked: 您的帳號已被鎖定。 notice_can_t_change_password: 這個帳號使用外部認證方式,無法變更其密碼。 notice_account_lost_email_sent: 包含選擇新密碼指示的電子郵件,已經寄出給您。 notice_account_activated: 您的帳號已經啟用,可用它登入系統。 @@ -246,7 +249,7 @@ notice_not_authorized_archived_project: 您欲存取的專案已經被封存。 notice_email_sent: "郵件已經成功寄送至以下收件者: %{value}" notice_email_error: "寄送郵件的過程中發生錯誤 (%{value})" - notice_feeds_access_key_reseted: 您的 RSS 存取金鑰已被重新設定。 + notice_feeds_access_key_reseted: 您的 Atom 存取金鑰已被重新設定。 notice_api_access_key_reseted: 您的 API 存取金鑰已被重新設定。 notice_failed_to_save_issues: "無法儲存 %{count} 問題到下列所選取的 %{total} 個項目中: %{ids}。" notice_failed_to_save_time_entries: "無法儲存 %{count} 個工時到下列所選取的 %{total} 個項目中: %{ids}。" @@ -262,6 +265,7 @@ notice_issue_update_conflict: "當您正在編輯這個問題的時候,它已經被其他人搶先一步更新過。" notice_account_deleted: "您的帳戶已被永久刪除。" notice_user_successful_create: "已建立用戶 %{id}。" + notice_new_password_must_be_different: 新舊密碼必須相異 error_can_t_load_default_data: "無法載入預設組態: %{value}" error_scm_not_found: "在儲存機制中找不到這個項目或修訂版。" @@ -416,6 +420,8 @@ field_board_parent: 父論壇 field_private_notes: 私人筆記 field_inherit_members: 繼承父專案成員 + field_generate_password: 產生密碼 + field_must_change_passwd: 必須在下次登入時變更密碼 setting_app_title: 標題 setting_app_subtitle: 副標題 @@ -431,7 +437,7 @@ setting_host_name: 主機名稱 setting_text_formatting: 文字格式 setting_wiki_compression: 壓縮 Wiki 歷史文章 - setting_feeds_limit: RSS 新聞限制 + setting_feeds_limit: Atom 新聞限制 setting_autofetch_changesets: 自動擷取認可 setting_default_projects_public: 新建立之專案預設為「公開」 setting_sys_api_enabled: 啟用管理儲存機制的網頁服務 (Web Service) @@ -486,6 +492,7 @@ setting_non_working_week_days: 非工作日 setting_jsonp_enabled: 啟用 JSONP 支援 setting_default_projects_tracker_ids: 新專案預設使用的追蹤標籤 + setting_mail_handler_excluded_filenames: 移除符合下列名稱的附件 permission_add_project: 建立專案 permission_add_subprojects: 建立子專案 @@ -703,6 +710,7 @@ one: 1 個問題 other: "%{count} 個問題" label_total: 總計 + label_total_time: 工時總計 label_permissions: 權限 label_current_status: 目前狀態 label_new_statuses_allowed: 可變更至以下狀態 @@ -870,9 +878,9 @@ label_language_based: 依用戶之語系決定 label_sort_by: "按 %{value} 排序" label_send_test_email: 寄送測試郵件 - label_feeds_access_key: RSS 存取金鑰 - label_missing_feeds_access_key: 找不到 RSS 存取金鑰 - label_feeds_access_key_created_on: "RSS 存取鍵建立於 %{value} 之前" + label_feeds_access_key: Atom 存取金鑰 + label_missing_feeds_access_key: 找不到 Atom 存取金鑰 + label_feeds_access_key_created_on: "Atom 存取鍵建立於 %{value} 之前" label_module_plural: 模組 label_added_time_by: "是由 %{author} 於 %{age} 前加入" label_updated_time_by: "是由 %{author} 於 %{age} 前更新" @@ -965,6 +973,7 @@ label_fields_permissions: 欄位權限 label_readonly: 唯讀 label_required: 必填 + label_hidden: 隱藏 label_attribute_of_project: "專案是 %{name}" label_attribute_of_issue: "問題是 %{name}" label_attribute_of_author: "作者是 %{name}" @@ -976,6 +985,9 @@ label_cross_project_hierarchy: 與專案階層架構共用 label_cross_project_system: 與全部的專案共用 label_gantt_progress_line: 進度線 + label_visibility_private: 僅我自己可見 + label_visibility_roles: 僅選取之角色可見 + label_visibility_public: 任何用戶均可見 button_login: 登入 button_submit: 送出 @@ -1087,6 +1099,7 @@ text_file_repository_writable: 可寫入附加檔案目錄 text_plugin_assets_writable: 可寫入附加元件目錄 text_rmagick_available: 可使用 RMagick (選配) + text_convert_available: 可使用 ImageMagick 轉換圖片格式 (選配) text_destroy_time_entries_question: 您即將刪除的問題已報工 %{hours} 小時. 您的選擇是? text_destroy_time_entries: 刪除已報工的時數 text_assign_time_entries_to_project: 指定已報工的時數至專案中 @@ -1168,4 +1181,3 @@ description_date_from: 輸入起始日期 description_date_to: 輸入結束日期 text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。
    一旦儲存之後, 代碼便無法再次被更改。' - label_total_time: 總計 diff -Nru redmine-2.3.3/config/locales/zh.yml redmine-2.4.2/config/locales/zh.yml --- redmine-2.3.3/config/locales/zh.yml 2013-09-14 06:48:37.000000000 +0000 +++ redmine-2.4.2/config/locales/zh.yml 2013-12-23 08:48:39.000000000 +0000 @@ -133,6 +133,7 @@ not_same_project: "不属于同一个项目" circular_dependency: "此关联将导致循环依赖" cant_link_an_issue_with_a_descendant: "问题不能关联到它的子任务" + earlier_than_minimum_start_date: "cannot be earlier than %{date} because of preceding issues" actionview_instancetag_blank_option: 请选择 @@ -166,7 +167,7 @@ notice_not_authorized_archived_project: 要访问的项目已经归档。 notice_email_sent: "邮件已发送至 %{value}" notice_email_error: "发送邮件时发生错误 (%{value})" - notice_feeds_access_key_reseted: 您的RSS存取键已被重置。 + notice_feeds_access_key_reseted: 您的Atom存取键已被重置。 notice_api_access_key_reseted: 您的API访问键已被重置。 notice_failed_to_save_issues: "%{count} 个问题保存失败(共选择 %{total} 个问题):%{ids}." notice_failed_to_save_members: "成员保存失败: %{errors}." @@ -325,7 +326,7 @@ setting_host_name: 主机名称 setting_text_formatting: 文本格式 setting_wiki_compression: 压缩Wiki历史文档 - setting_feeds_limit: RSS Feed内容条数限制 + setting_feeds_limit: Atom Feed内容条数限制 setting_default_projects_public: 新建项目默认为公开项目 setting_autofetch_changesets: 自动获取程序变更 setting_sys_api_enabled: 启用用于版本库管理的Web Service @@ -719,9 +720,9 @@ label_language_based: 根据用户的语言 label_sort_by: "根据 %{value} 排序" label_send_test_email: 发送测试邮件 - label_feeds_access_key: RSS存取键 - label_missing_feeds_access_key: 缺少RSS存取键 - label_feeds_access_key_created_on: "RSS存取键是在 %{value} 之前建立的" + label_feeds_access_key: Atom存取键 + label_missing_feeds_access_key: 缺少Atom存取键 + label_feeds_access_key_created_on: "Atom存取键是在 %{value} 之前建立的" label_module_plural: 模块 label_added_time_by: "由 %{author} 在 %{age} 之前添加" label_updated_time: " 更新于 %{value} 之前" @@ -1075,19 +1076,29 @@ label_cross_project_hierarchy: 与项目继承层次共享 label_cross_project_system: 与所有项目共享 button_hide: 隐藏 - setting_non_working_week_days: Non-working days - label_in_the_next_days: in the next - label_in_the_past_days: in the past - label_attribute_of_user: User's %{name} - text_turning_multiple_off: If you disable multiple values, multiple values will be - removed in order to preserve only one value per item. - label_attribute_of_issue: Issue's %{name} - permission_add_documents: Add documents - permission_edit_documents: Edit documents - permission_delete_documents: Delete documents - label_gantt_progress_line: Progress line - setting_jsonp_enabled: Enable JSONP support - field_inherit_members: Inherit members - field_closed_on: Closed - setting_default_projects_tracker_ids: Default trackers for new projects + setting_non_working_week_days: 非工作日 + label_in_the_next_days: 在未来几天之内 + label_in_the_past_days: 在过去几天之内 + label_attribute_of_user: 用户是 %{name} + text_turning_multiple_off: 如果您停用多重值设定,重复的值将被移除,以使每个项目仅保留一个值 + label_attribute_of_issue: 问题是 %{name} + permission_add_documents: 添加文档 + permission_edit_documents: 编辑文档 + permission_delete_documents: 删除文档 + label_gantt_progress_line: 进度线 + setting_jsonp_enabled: 启用JSONP支持 + field_inherit_members: 继承父项目成员 + field_closed_on: 结束日期 + field_generate_password: 生成密码 + setting_default_projects_tracker_ids: 新建项目默认跟踪标签 label_total_time: 合计 + notice_account_not_activated_yet: 您的账号尚未激活. 若您要重新收取激活邮件, 请单击此链接. + notice_account_locked: 您的帐号已被锁定 + label_hidden: 隐藏 + label_visibility_private: 仅对我可见 + label_visibility_roles: 仅对选取角色可见 + label_visibility_public: 对任何人可见 + field_must_change_passwd: 下次登录时必须修改密码 + notice_new_password_must_be_different: 新密码必须和旧密码不同 + setting_mail_handler_excluded_filenames: 移除符合下列名称的附件 + text_convert_available: ImageMagick convert available (optional) diff -Nru redmine-2.3.3/config/routes.rb redmine-2.4.2/config/routes.rb --- redmine-2.3.3/config/routes.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/routes.rb 2013-12-23 08:48:39.000000000 +0000 @@ -23,6 +23,7 @@ match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register' match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password' match 'account/activate', :to => 'account#activate', :via => :get + get 'account/activation_email', :to => 'account#activation_email', :as => 'activation_email' match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put] match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue', :via => [:get, :post, :put] diff -Nru redmine-2.3.3/config/settings.yml redmine-2.4.2/config/settings.yml --- redmine-2.3.3/config/settings.yml 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/config/settings.yml 2013-12-23 08:48:39.000000000 +0000 @@ -106,13 +106,9 @@ default: 0 commit_ref_keywords: default: 'refs,references,IssueID' -commit_fix_keywords: - default: 'fixes,closes' -commit_fix_status_id: - format: int - default: 0 -commit_fix_done_ratio: - default: 100 +commit_update_keywords: + serialized: true + default: [] commit_logtime_enabled: default: 0 commit_logtime_activity_id: @@ -147,6 +143,8 @@ - issue_updated mail_handler_body_delimiters: default: '' +mail_handler_excluded_filenames: + default: '' mail_handler_api_enabled: default: 0 mail_handler_api_key: diff -Nru redmine-2.3.3/db/migrate/20130602092539_create_queries_roles.rb redmine-2.4.2/db/migrate/20130602092539_create_queries_roles.rb --- redmine-2.3.3/db/migrate/20130602092539_create_queries_roles.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130602092539_create_queries_roles.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,13 @@ +class CreateQueriesRoles < ActiveRecord::Migration + def self.up + create_table :queries_roles, :id => false do |t| + t.column :query_id, :integer, :null => false + t.column :role_id, :integer, :null => false + end + add_index :queries_roles, [:query_id, :role_id], :unique => true, :name => :queries_roles_ids + end + + def self.down + drop_table :queries_roles + end +end diff -Nru redmine-2.3.3/db/migrate/20130710182539_add_queries_visibility.rb redmine-2.4.2/db/migrate/20130710182539_add_queries_visibility.rb --- redmine-2.3.3/db/migrate/20130710182539_add_queries_visibility.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130710182539_add_queries_visibility.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,13 @@ +class AddQueriesVisibility < ActiveRecord::Migration + def up + add_column :queries, :visibility, :integer, :default => 0 + Query.where(:is_public => true).update_all(:visibility => 2) + remove_column :queries, :is_public + end + + def down + add_column :queries, :is_public, :boolean, :default => true, :null => false + Query.where('visibility <> ?', 2).update_all(:is_public => false) + remove_column :queries, :visibility + end +end diff -Nru redmine-2.3.3/db/migrate/20130713104233_create_custom_fields_roles.rb redmine-2.4.2/db/migrate/20130713104233_create_custom_fields_roles.rb --- redmine-2.3.3/db/migrate/20130713104233_create_custom_fields_roles.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130713104233_create_custom_fields_roles.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,14 @@ +class CreateCustomFieldsRoles < ActiveRecord::Migration + def self.up + create_table :custom_fields_roles, :id => false do |t| + t.column :custom_field_id, :integer, :null => false + t.column :role_id, :integer, :null => false + end + add_index :custom_fields_roles, [:custom_field_id, :role_id], :unique => true, :name => :custom_fields_roles_ids + CustomField.update_all({:visible => true}, {:type => 'IssueCustomField'}) + end + + def self.down + drop_table :custom_fields_roles + end +end diff -Nru redmine-2.3.3/db/migrate/20130713111657_add_queries_options.rb redmine-2.4.2/db/migrate/20130713111657_add_queries_options.rb --- redmine-2.3.3/db/migrate/20130713111657_add_queries_options.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130713111657_add_queries_options.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,9 @@ +class AddQueriesOptions < ActiveRecord::Migration + def up + add_column :queries, :options, :text + end + + def down + remove_column :queries, :options + end +end diff -Nru redmine-2.3.3/db/migrate/20130729070143_add_users_must_change_passwd.rb redmine-2.4.2/db/migrate/20130729070143_add_users_must_change_passwd.rb --- redmine-2.3.3/db/migrate/20130729070143_add_users_must_change_passwd.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130729070143_add_users_must_change_passwd.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,9 @@ +class AddUsersMustChangePasswd < ActiveRecord::Migration + def up + add_column :users, :must_change_passwd, :boolean, :default => false, :null => false + end + + def down + remove_column :users, :must_change_passwd + end +end diff -Nru redmine-2.3.3/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb redmine-2.4.2/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb --- redmine-2.3.3/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20130911193200_remove_eols_from_attachments_filename.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,12 @@ +class RemoveEolsFromAttachmentsFilename < ActiveRecord::Migration + def up + Attachment.where("filename like ? or filename like ?", "%\r%", "%\n%").each do |attachment| + filename = attachment.filename.to_s.tr("\r\n", "_") + Attachment.where(:id => attachment.id).update_all(:filename => filename) + end + end + + def down + # nop + end +end diff -Nru redmine-2.3.3/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb redmine-2.4.2/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb --- redmine-2.3.3/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20131004113137_support_for_multiple_commit_keywords.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,17 @@ +class SupportForMultipleCommitKeywords < ActiveRecord::Migration + def up + # Replaces commit_fix_keywords, commit_fix_status_id, commit_fix_done_ratio settings + # with commit_update_keywords setting + keywords = Setting.where(:name => 'commit_fix_keywords').limit(1).pluck(:value).first + status_id = Setting.where(:name => 'commit_fix_status_id').limit(1).pluck(:value).first + done_ratio = Setting.where(:name => 'commit_fix_done_ratio').limit(1).pluck(:value).first + if keywords.present? + Setting.commit_update_keywords = [{'keywords' => keywords, 'status_id' => status_id, 'done_ratio' => done_ratio}] + end + Setting.where(:name => %w(commit_fix_keywords commit_fix_status_id commit_fix_done_ratio)).delete_all + end + + def down + Setting.where(:name => 'commit_update_keywords').delete_all + end +end diff -Nru redmine-2.3.3/db/migrate/20131005100610_add_repositories_created_on.rb redmine-2.4.2/db/migrate/20131005100610_add_repositories_created_on.rb --- redmine-2.3.3/db/migrate/20131005100610_add_repositories_created_on.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/db/migrate/20131005100610_add_repositories_created_on.rb 2013-12-23 08:48:38.000000000 +0000 @@ -0,0 +1,9 @@ +class AddRepositoriesCreatedOn < ActiveRecord::Migration + def up + add_column :repositories, :created_on, :timestamp + end + + def down + remove_column :repositories, :created_on + end +end diff -Nru redmine-2.3.3/debian/changelog redmine-2.4.2/debian/changelog --- redmine-2.3.3/debian/changelog 2013-12-30 23:08:21.000000000 +0000 +++ redmine-2.4.2/debian/changelog 2014-01-28 10:25:32.000000000 +0000 @@ -1,3 +1,17 @@ +redmine (2.4.2-1) unstable; urgency=low + + * New upstream version 2.4.2 + * Update patches for 2.4.2 release + + -- Ondřej Surý Tue, 28 Jan 2014 11:25:00 +0100 + +redmine (2.4.1-1) unstable; urgency=low + + * New upstream version 2.4.1 + * Refresh patches for 2.4.1 release + + -- Ondřej Surý Tue, 03 Dec 2013 12:04:41 +0100 + redmine (2.3.3-3.1) unstable; urgency=medium * Non-maintainer upload. @@ -182,6 +196,35 @@ -- Ondřej Surý Mon, 10 Dec 2012 12:33:19 +0100 +redmine (1.4.4+dfsg1-3) unstable; urgency=low + + [ Jérémy Lal ] + * This release is a candidate for proposed-updates. + Changes have been kept to the minimum. + + [ Ondřej Surý ] + * Pull upstream fixes for Ruby 1.9 as default interpreter: + + Replace missing ParseDate with DateTime (Closes: #700754) + + Fix broken REST API (Closes: #700009) + + -- Jérémy Lal Sat, 11 May 2013 16:26:27 +0200 + +redmine (1.4.4+dfsg1-2) unstable; urgency=low + + * Manage and set dbuser default value like dbname. (Closes: #695774) + + -- Jérémy Lal Sat, 19 Jan 2013 15:54:02 +0100 + +redmine (1.4.4+dfsg1-1.1) unstable; urgency=medium + + * Non-maintainer upload. + * debian/control: add dependency on rubygems or recent enough ruby + (Closes: #693994) [Axel Beckert]. + * debian/postinst: replace exit status -1 with 2 for shell compatibility + (e.g. ksh) (Closes: #687449). + + -- Dominik George Sun, 29 Nov 2012 14:18:29 +0200 + redmine (1.4.4+dfsg1-1) unstable; urgency=low * Upstream update. diff -Nru redmine-2.3.3/debian/config redmine-2.4.2/debian/config --- redmine-2.3.3/debian/config 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/config 2014-01-28 10:25:32.000000000 +0000 @@ -116,7 +116,14 @@ if [ -f /usr/share/dbconfig-common/dpkg/config ]; then dbc_dbtypes="sqlite3, pgsql, mysql" dbc_authmethod_user="password" - dbc_dbuser=redmine + # per-instance dbuser to avoid #695774 - and behave like dbname + fCode=0 + db_get redmine/instances/$fInstance/db/app-user || fCode=$? + if [ $fCode -eq 0 -a -n "$RET" ]; then + dbc_dbuser="$RET" + else + dbc_dbuser=redmine_$fInstance + fi # use same dbname if one has been registered in debconf before # this is also needed for migration from version <= 0.9.0~svn2819 fCode=0 diff -Nru redmine-2.3.3/debian/control redmine-2.4.2/debian/control --- redmine-2.3.3/debian/control 2013-12-30 23:05:28.000000000 +0000 +++ redmine-2.4.2/debian/control 2014-01-28 10:25:32.000000000 +0000 @@ -3,7 +3,8 @@ Priority: extra Maintainer: Jérémy Lal Uploaders: Debian Ruby Extras Maintainers , - Ondřej Surý + Ondřej Surý , + Antonio Terceiro Build-Depends: debhelper (>= 7), cdbs, ttf2ufm, ttf-dejavu, ttf-freefont, php5-cli Build-Depends-Indep: po-debconf Standards-Version: 3.9.4 @@ -64,8 +65,8 @@ Package: redmine-mysql Architecture: all Depends: ruby-mysql (>= 2.8.1), - mysql-client | virtual-mysql-client, - ${misc:Depends} + mysql-client | virtual-mysql-client, + ${misc:Depends} Recommends: redmine (= ${source:Version}) Suggests: mysql-server Description: metapackage providing MySQL dependencies for Redmine @@ -78,8 +79,8 @@ Package: redmine-pgsql Architecture: all Depends: ruby-pg, - postgresql-client, - ${misc:Depends} + postgresql-client, + ${misc:Depends} Recommends: redmine (= ${source:Version}) Suggests: postgresql Description: metapackage providing PostgreSQL dependencies for Redmine @@ -92,8 +93,8 @@ Package: redmine-sqlite Architecture: all Depends: ruby-sqlite3, - sqlite3, - ${misc:Depends} + sqlite3, + ${misc:Depends} Recommends: redmine (= ${source:Version}) Description: metapackage providing sqlite dependencies for Redmine This package provides sqlite dependencies for Redmine, a diff -Nru redmine-2.3.3/debian/gbp.conf redmine-2.4.2/debian/gbp.conf --- redmine-2.3.3/debian/gbp.conf 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/gbp.conf 2014-01-28 10:25:32.000000000 +0000 @@ -4,9 +4,8 @@ pristine-tar = True sign-tags = True -# there are separate branches for stable and experimental -upstream-branch = upstream-experimental -debian-branch = master-experimental +upstream-branch = upstream +debian-branch = master [git-import-orig] diff -Nru redmine-2.3.3/debian/patches/1001_Parsedate.parsedate.patch redmine-2.4.2/debian/patches/1001_Parsedate.parsedate.patch --- redmine-2.3.3/debian/patches/1001_Parsedate.parsedate.patch 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/debian/patches/1001_Parsedate.parsedate.patch 2014-01-28 10:25:32.000000000 +0000 @@ -0,0 +1,16 @@ +Description: Replace missing ParseDate with DateTime (Closes: #700754) +Origin: upstream, http://www.redmine.org/projects/redmine/repository/revisions/10439 +Origin: upstream, http://www.redmine.org/projects/redmine/repository/revisions/11091 +Last-Update: 2013-02-26 +--- redmine.orig/lib/SVG/Graph/Schedule.rb ++++ redmine/lib/SVG/Graph/Schedule.rb +@@ -159,8 +159,7 @@ module SVG + if im3 == 0 + y << data[:data][i] + else +- arr = ParseDate.parsedate( data[:data][i] ) +- t = Time.local( *arr[0,6].compact ) ++ t = DateTime.parse( data[:data][i] ).to_time + (im3 == 1 ? x_start : x_end) << t.to_i + end + } diff -Nru redmine-2.3.3/debian/patches/2002_FHS_through_env_vars.patch redmine-2.4.2/debian/patches/2002_FHS_through_env_vars.patch --- redmine-2.3.3/debian/patches/2002_FHS_through_env_vars.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2002_FHS_through_env_vars.patch 2014-01-28 10:25:32.000000000 +0000 @@ -2,9 +2,9 @@ Forwarded: not-needed Author: Jérémy Lal Last-Update: 2013-09-28 ---- a/app/models/attachment.rb -+++ b/app/models/attachment.rb -@@ -46,10 +46,10 @@ +--- redmine.orig/app/models/attachment.rb ++++ redmine/app/models/attachment.rb +@@ -46,10 +46,10 @@ class Attachment < ActiveRecord::Base "LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"} cattr_accessor :storage_path @@ -17,9 +17,9 @@ before_save :files_to_final_location after_destroy :delete_from_disk ---- a/lib/redmine/configuration.rb -+++ b/lib/redmine/configuration.rb -@@ -32,7 +32,7 @@ +--- redmine.orig/lib/redmine/configuration.rb ++++ redmine/lib/redmine/configuration.rb +@@ -32,7 +32,7 @@ module Redmine # * :file: the configuration file to load (default: config/configuration.yml) # * :env: the environment to load the configuration for (default: Rails.env) def load(options={}) @@ -28,7 +28,7 @@ env = options[:env] || Rails.env @config = @defaults.dup -@@ -103,7 +103,7 @@ +@@ -103,7 +103,7 @@ module Redmine end def load_deprecated_email_configuration(env) @@ -37,9 +37,9 @@ if File.file?(deprecated_email_conf) warn "Storing outgoing emails configuration in config/email.yml is deprecated. You should now store it in config/configuration.yml using the email_delivery setting." @config.merge!({'email_delivery' => load_from_yaml(deprecated_email_conf, env)}) ---- a/lib/redmine/export/pdf.rb -+++ b/lib/redmine/export/pdf.rb -@@ -38,7 +38,7 @@ +--- redmine.orig/lib/redmine/export/pdf.rb ++++ redmine/lib/redmine/export/pdf.rb +@@ -38,7 +38,7 @@ module Redmine attr_accessor :footer_date def initialize(lang, orientation='P') @@ -48,9 +48,9 @@ FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache) set_language_if_valid lang pdf_encoding = l(:general_pdf_encoding).upcase ---- a/config/application.rb -+++ b/config/application.rb -@@ -2,6 +2,17 @@ +--- redmine.orig/config/application.rb ++++ redmine/config/application.rb +@@ -2,6 +2,17 @@ require File.expand_path('../boot', __FI require 'rails/all' @@ -68,7 +68,7 @@ if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups(:assets => %w(development test))) -@@ -53,8 +64,19 @@ +@@ -52,8 +63,19 @@ module RedmineApp # Do not include all helpers config.action_controller.include_all_helpers = false @@ -88,9 +88,9 @@ if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) end ---- a/lib/plugins/rfpdf/lib/tcpdf.rb -+++ b/lib/plugins/rfpdf/lib/tcpdf.rb -@@ -89,10 +89,10 @@ +--- redmine.orig/lib/plugins/rfpdf/lib/tcpdf.rb ++++ redmine/lib/plugins/rfpdf/lib/tcpdf.rb +@@ -89,10 +89,10 @@ class TCPDF @@k_small_ratio = 2/3.0 cattr_accessor :k_path_cache @@ -103,9 +103,9 @@ attr_accessor :barcode ---- a/lib/redmine/scm/adapters/abstract_adapter.rb -+++ b/lib/redmine/scm/adapters/abstract_adapter.rb -@@ -224,7 +224,7 @@ +--- redmine.orig/lib/redmine/scm/adapters/abstract_adapter.rb ++++ redmine/lib/redmine/scm/adapters/abstract_adapter.rb +@@ -221,7 +221,7 @@ module Redmine if @stderr_log_file.nil? writable = false path = Redmine::Configuration['scm_stderr_log_file'].presence diff -Nru redmine-2.3.3/debian/patches/2003_externalize_session_config.patch redmine-2.4.2/debian/patches/2003_externalize_session_config.patch --- redmine-2.3.3/debian/patches/2003_externalize_session_config.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2003_externalize_session_config.patch 2014-01-28 10:25:32.000000000 +0000 @@ -2,8 +2,8 @@ Forwarded: not-needed Author: Jérémy Lal Last-Update: 2010-01-10 ---- a/lib/tasks/initializers.rake -+++ b/lib/tasks/initializers.rake +--- redmine.orig/lib/tasks/initializers.rake ++++ redmine/lib/tasks/initializers.rake @@ -1,11 +1,14 @@ desc 'Generates a secret token for the application.' +task :generate_secret_token do @@ -48,9 +48,9 @@ - -desc 'Generates a secret token for the application.' -task :generate_secret_token => ['config/initializers/secret_token.rb'] ---- a/config/application.rb -+++ b/config/application.rb -@@ -67,7 +67,20 @@ module RedmineApp +--- redmine.orig/config/application.rb ++++ redmine/config/application.rb +@@ -66,7 +66,20 @@ module RedmineApp # move tmp directory to RAILS_TMP config.paths['tmp'] = ENV['RAILS_TMP'] diff -Nru redmine-2.3.3/debian/patches/2004_FHS_plugins_assets.patch redmine-2.4.2/debian/patches/2004_FHS_plugins_assets.patch --- redmine-2.3.3/debian/patches/2004_FHS_plugins_assets.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2004_FHS_plugins_assets.patch 2014-01-28 10:25:32.000000000 +0000 @@ -1,5 +1,5 @@ ---- a/lib/redmine/plugin.rb -+++ b/lib/redmine/plugin.rb +--- redmine.orig/lib/redmine/plugin.rb ++++ redmine/lib/redmine/plugin.rb @@ -47,7 +47,7 @@ module Redmine #:nodoc: self.directory = File.join(Rails.root, 'plugins') diff -Nru redmine-2.3.3/debian/patches/2008_force_table_encoding_mysql.patch redmine-2.4.2/debian/patches/2008_force_table_encoding_mysql.patch --- redmine-2.3.3/debian/patches/2008_force_table_encoding_mysql.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2008_force_table_encoding_mysql.patch 2014-01-28 10:25:32.000000000 +0000 @@ -7,8 +7,8 @@ Bug-Debian: http://bugs.debian.org/599374 Bug-Rails: http://rails.lighthouseapp.com/projects/8994/tickets/5830 Last-Update: 2010-10-17 ---- a/config/initializers/10-patches.rb -+++ b/config/initializers/10-patches.rb +--- redmine.orig/config/initializers/10-patches.rb ++++ redmine/config/initializers/10-patches.rb @@ -1,4 +1,19 @@ require 'active_record' +require 'active_record/connection_adapters/abstract_mysql_adapter' diff -Nru redmine-2.3.3/debian/patches/2009_FHS_thin_config.patch redmine-2.4.2/debian/patches/2009_FHS_thin_config.patch --- redmine-2.3.3/debian/patches/2009_FHS_thin_config.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2009_FHS_thin_config.patch 2014-01-28 10:25:32.000000000 +0000 @@ -3,8 +3,8 @@ Forwarded: not-needed Author: Jérémy Lal Last-Update: 2010-11-01 ---- a/config/application.rb -+++ b/config/application.rb +--- redmine.orig/config/application.rb ++++ redmine/config/application.rb @@ -7,6 +7,7 @@ Rails.env ||= ActiveSupport::StringInqui # for debian package : setup proper environment variables and paths diff -Nru redmine-2.3.3/debian/patches/2017_Gemfile_debian.patch redmine-2.4.2/debian/patches/2017_Gemfile_debian.patch --- redmine-2.3.3/debian/patches/2017_Gemfile_debian.patch 2013-12-02 21:48:38.000000000 +0000 +++ redmine-2.4.2/debian/patches/2017_Gemfile_debian.patch 2014-01-28 10:25:32.000000000 +0000 @@ -1,12 +1,11 @@ --- redmine.orig/Gemfile +++ redmine/Gemfile -@@ -1,88 +1,5 @@ +@@ -1,90 +1,5 @@ source 'https://rubygems.org' --gem "rails", "3.2.13" +-gem "rails", "3.2.16" -gem "jquery-rails", "~> 2.0.2" --gem "i18n", "~> 0.6.0" --gem "coderay", "~> 1.0.9" +-gem "coderay", "~> 1.1.0" -gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] -gem "builder", "3.0.0" - @@ -17,7 +16,7 @@ - -# Optional gem for OpenID authentication -group :openid do -- gem "ruby-openid", "~> 2.2.3", :require => "openid" +- gem "ruby-openid", "~> 2.3.0", :require => "openid" - gem "rack-openid" -end - @@ -34,7 +33,7 @@ -platforms :jruby do - # jruby-openssl is bundled with JRuby 1.7.0 - gem "jruby-openssl" if Object.const_defined?(:JRUBY_VERSION) && JRUBY_VERSION < '1.7.0' -- gem "activerecord-jdbc-adapter", "1.2.5" +- gem "activerecord-jdbc-adapter", "~> 1.3.2" -end - -# Include database gems for the adapters found in the database @@ -81,9 +80,12 @@ - -group :test do - gem "shoulda", "~> 3.3.2" -- gem "mocha", "~> 0.13.3" -- gem 'capybara', '~> 2.0.0' -- gem 'nokogiri', '< 1.6.0' +- gem "mocha", ">= 0.14", :require => 'mocha/api' +- if RUBY_VERSION >= '1.9.3' +- gem "capybara", "~> 2.1.0" +- gem "selenium-webdriver" +- gem "database_cleaner" +- end -end - local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") diff -Nru redmine-2.3.3/debian/patches/2018_get_rid_of_rdoctask.patch redmine-2.4.2/debian/patches/2018_get_rid_of_rdoctask.patch --- redmine-2.3.3/debian/patches/2018_get_rid_of_rdoctask.patch 2013-12-02 21:48:34.000000000 +0000 +++ redmine-2.4.2/debian/patches/2018_get_rid_of_rdoctask.patch 2014-01-28 10:25:32.000000000 +0000 @@ -1,5 +1,5 @@ ---- a/lib/plugins/acts_as_tree/Rakefile -+++ b/lib/plugins/acts_as_tree/Rakefile +--- redmine.orig/lib/plugins/acts_as_tree/Rakefile ++++ redmine/lib/plugins/acts_as_tree/Rakefile @@ -1,6 +1,6 @@ require 'rake' require 'rake/testtask' @@ -8,8 +8,8 @@ desc 'Default: run unit tests.' task :default => :test ---- a/lib/plugins/acts_as_versioned/Rakefile -+++ b/lib/plugins/acts_as_versioned/Rakefile +--- redmine.orig/lib/plugins/acts_as_versioned/Rakefile ++++ redmine/lib/plugins/acts_as_versioned/Rakefile @@ -2,7 +2,7 @@ require 'rubygems' Gem::manage_gems @@ -19,8 +19,8 @@ require 'rake/packagetask' require 'rake/gempackagetask' require 'rake/testtask' ---- a/lib/plugins/gravatar/Rakefile -+++ b/lib/plugins/gravatar/Rakefile +--- redmine.orig/lib/plugins/gravatar/Rakefile ++++ redmine/lib/plugins/gravatar/Rakefile @@ -1,5 +1,5 @@ require 'spec/rake/spectask' -require 'rake/rdoctask' @@ -28,8 +28,8 @@ desc 'Default: run all specs' task :default => :spec ---- a/lib/plugins/open_id_authentication/Rakefile -+++ b/lib/plugins/open_id_authentication/Rakefile +--- redmine.orig/lib/plugins/open_id_authentication/Rakefile ++++ redmine/lib/plugins/open_id_authentication/Rakefile @@ -1,6 +1,6 @@ require 'rake' require 'rake/testtask' diff -Nru redmine-2.3.3/debian/patches/series redmine-2.4.2/debian/patches/series --- redmine-2.3.3/debian/patches/series 2013-12-02 21:48:38.000000000 +0000 +++ redmine-2.4.2/debian/patches/series 2014-01-28 10:25:32.000000000 +0000 @@ -6,3 +6,4 @@ 2018_get_rid_of_rdoctask.patch 2019_unplug_bundler.patch 2017_Gemfile_debian.patch +1001_Parsedate.parsedate.patch diff -Nru redmine-2.3.3/debian/postinst redmine-2.4.2/debian/postinst --- redmine-2.3.3/debian/postinst 2013-12-02 22:35:10.000000000 +0000 +++ redmine-2.4.2/debian/postinst 2014-01-28 10:25:32.000000000 +0000 @@ -157,7 +157,14 @@ dbc_dbfile_owner="root:www-data" # this is for sqlite3 to be r/w for www-data dbc_dbfile_perms="0660" - dbc_dbuser=redmine + # per-instance dbuser to avoid #695774 - and behave like dbname + fCode=0 + db_get redmine/instances/$lInstance/db/app-user || fCode=$? + if [ $fCode -eq 0 -a -n "$RET" ]; then + dbc_dbuser="$RET" + else + dbc_dbuser=redmine_$lInstance + fi # make sure mysql or pgsql database charset is UTF8 dbc_mysql_createdb_encoding="UTF8" dbc_pgsql_createdb_encoding="UTF8" diff -Nru redmine-2.3.3/doc/CHANGELOG redmine-2.4.2/doc/CHANGELOG --- redmine-2.3.3/doc/CHANGELOG 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/doc/CHANGELOG 2013-12-23 08:48:39.000000000 +0000 @@ -4,6 +4,148 @@ Copyright (C) 2006-2013 Jean-Philippe Lang http://www.redmine.org/ +== 2013-12-23 v2.4.2 + +* Defect #15398: HTML 5 invalid
    tag +* Defect #15523: CSS class for done ratio is not properly generated +* Defect #15623: Timelog filtering by activity field does not handle project activity overrides +* Defect #15677: Links for relations in notifications do not include hostname +* Defect #15684: MailHandler : text/plain attachments are added to description +* Defect #15714: Notification on loosing assignment does not work +* Defect #15735: OpenID login fails due to CSRF verification +* Defect #15741: Multiple scrollbars in project selection tree +* Patch #9442: Russian wiki syntax help translations +* Patch #15524: Japanese translation update (r12278) +* Patch #15601: Turkish translation update +* Patch #15688: Spanish translation updated +* Patch #15696: Russian translation update + +== 2013-11-23 v2.4.1 + +* Defect #15401: Wiki syntax "bold italic" is incorrect +* Defect #15414: Empty sidebar should not be displayed in project overview +* Defect #15427: REST API POST and PUT broken +* Patch #15376: Traditional Chinese translation (to r12295) +* Patch #15395: German "ImageMagick convert available" translation +* Patch #15400: Czech Wiki syntax traslation +* Patch #15402: Czech translation for 2.4-stable + +== 2013-11-17 v2.4.0 + +* Defect #1983: statistics get rather cramped with more than 15 or so contributers +* Defect #7335: Sorting issues in gantt by date, not by id +* Defect #12681: Treat group assignments as assigned to me +* Defect #12824: Useless "edit" link in workflow menu +* Defect #13260: JQuery Datepicker popup is missing multiple month/year modifiers +* Defect #13537: Filters will show issues with unused custom fields. +* Defect #13829: Favicon bug in IE8 +* Defect #13949: Handling of attachment uploads when 'Maximum attachment size' is set to 0 +* Defect #13989: Trac and Mantis importers reset global notification settings +* Defect #13990: Trac importer breaks on exotic filenames and ruby 1.9+ +* Defect #14028: Plugins Gemfiles loading breaks __FILE__ +* Defect #14086: Better handling of issue start date validation +* Defect #14206: Synchronize the lang attribute of the HTML with the display language +* Defect #14403: No error message if notification mail could not delivered +* Defect #14516: Missing Sort Column Label and Center Align on Admin-Enumerations +* Defect #14517: Missing Html Tile on Admin (Groups, LDAP and Plugins) +* Defect #14598: Wrong test with logger.info in model mail_handler +* Defect #14615: Warn me when leaving a page with unsaved text doesn't work when editing an update note +* Defect #14621: AJAX call on the issue form resets data entered during the request +* Defect #14657: Wrong German translation for member inheritance +* Defect #14773: ActiveRecord::Acts::Versioned::ActMethods#next_version Generates ArgumentError +* Defect #14819: Newlines in attachment filename causes crash +* Defect #14986: 500 error when viewing a wiki page without WikiContent +* Defect #14995: Japanese "notice_not_authorized" translation is incorrect +* Defect #15044: Patch for giving controller_issues_edit_after_save api hook the correct context +* Defect #15050: redmine:migrate_from_mantis fails to migrate projects with all upper case name +* Defect #15058: Project authorization EnabledModule N+1 queries +* Defect #15113: The mail method should return a Mail::Message +* Defect #15135: Issue#update_nested_set_attributes comparing nil with empty string +* Defect #15191: HTML 5 validation failures +* Defect #15227: Custom fields in issue form - splitting is incorrect +* Defect #15307: HTML 5 deprecates width and align attributes +* Feature #1005: Add the addition/removal/change of related issues to the history +* Feature #1019: Role based custom queries +* Feature #1391: Ability to force user to change password +* Feature #2199: Ability to clear dates and text fields when bulk editing issues +* Feature #2427: Document horizontal rule syntax +* Feature #2795: Add a "Cancel" button to the "Delete" project page when deleting a project. +* Feature #2865: One click filter in search view +* Feature #3413: Exclude attachments from incoming emails based on file name +* Feature #3872: New user password - better functionality +* Feature #4911: Multiple issue update rules with different keywords in commit messages +* Feature #5037: Role-based issue custom field visibility +* Feature #7590: Different commit Keywords for each tracker +* Feature #7836: Ability to save Gantt query filters +* Feature #8253: Update CodeRay to 1.1 final +* Feature #11159: REST API for getting CustomField definitions +* Feature #12293: Add links to attachments in new issue email notification +* Feature #12912: Issue-notes Redmine links: append actual note reference to rendered links +* Feature #13157: Link on "My Page" to view all my spent time +* Feature #13746: Highlighting of source link target line +* Feature #13943: Better handling of validation errors when bulk editing issues +* Feature #13945: Disable autofetching of repository changesets if projects are closed +* Feature #14024: Default of issue start and due date +* Feature #14060: Enable configuration of OpenIdAuthentication.store +* Feature #14228: Registered users should have a way to get a new action email +* Feature #14614: View hooks for user preferences +* Feature #14630: wiki_syntax.html per language (wiki help localization mechanism) +* Feature #15136: Activate Custom Fields on a selection of projects directly from Custom fields page +* Feature #15182: Return to section anchor after wiki section edit +* Feature #15218: Update Rails 3.2.15 +* Feature #15311: Add an indication to admin/info whether or not ImageMagick convert is available +* Patch #6689: Document project-links in parse_redmine_links +* Patch #13460: All translations: RSS -> Atom +* Patch #13482: Do not add empty header/footer to notification emails +* Patch #13528: Traditional Chinese "label_total_time" translation +* Patch #13551: update Dutch translations - March 2013 +* Patch #13577: Japanese translation improvement ("done ratio") +* Patch #13646: Fix handling multiple text parts in email +* Patch #13674: Lithuanian translation +* Patch #13687: Favicon bug in opera browser +* Patch #13697: Back-button on diff page is not working when I'm directed from email +* Patch #13745: Correct translation for member save button +* Patch #13808: Changed Bulgarian "label_statistics" translation +* Patch #13825: German translation: jquery.ui.datepicker-de.js +* Patch #13900: Update URL when changing tab +* Patch #13931: Error and inconsistencies in Croatian translation +* Patch #13948: REST API should return user.status +* Patch #13988: Enhanced Arabic translation +* Patch #14138: Output changeset comment in html title +* Patch #14180: Improve pt-BR translation +* Patch #14222: German translation: grammar + spelling +* Patch #14223: Fix icon transparency issues +* Patch #14360: Slovene language translation +* Patch #14767: More CSS classes on various fields +* Patch #14901: Slovak translation +* Patch #14920: Russian numeric translation +* Patch #14981: Italian translation +* Patch #15072: Optimization of issues journal custom fields display +* Patch #15073: list custom fields : multiple select filter wider +* Patch #15075: Fix typo in the Dutch "label_user_mail_option_all" translation +* Patch #15277: Accept custom field format added at runtime +* Patch #15295: Log error messages when moving attachements in sub-directories +* Patch #15369: Bulgarian translation (r12278) + +== 2013-11-17 v2.3.4 + +* Defect #13348: Repository tree can't handle two loading at once +* Defect #13632: Empty page attached when exporting PDF +* Defect #14590: migrate_from_trac.rake does not import Trac users, uses too short password +* Defect #14656: JRuby: Encoding error when creating issues +* Defect #14883: Update activerecord-jdbc-adapter +* Defect #14902: Potential invalid SQL error with invalid group_ids +* Defect #14931: SCM annotate with non ASCII author +* Defect #14960: migrate_from_mantis.rake does not import Mantis users, uses too short password +* Defect #14977: Internal Server Error while uploading file +* Defect #15190: JS-error while using a global custom query w/ project filter in a project context +* Defect #15235: Wiki Pages REST API with version returns wrong comments +* Defect #15344: Default status always inserted to allowed statuses when changing status +* Feature #14919: Update ruby-openid version above 2.3.0 +* Patch #14592: migrate_from_trac.rake does not properly parse First Name and Last Name +* Patch #14886: Norweigan - label_copied_to and label_copied_from translated +* Patch #15185: Simplified Chinese translation for 2.3-stable + == 2013-09-14 v2.3.3 * Defect #13008: Usage of attribute_present? in UserPreference diff -Nru redmine-2.3.3/doc/RUNNING_TESTS redmine-2.4.2/doc/RUNNING_TESTS --- redmine-2.3.3/doc/RUNNING_TESTS 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/doc/RUNNING_TESTS 2013-12-23 08:48:39.000000000 +0000 @@ -11,7 +11,8 @@ Run `rake test` to run the entire test suite (except the tests for the Apache perl module Redmine.pm and Capybara tests, see below). -You can run `ruby test/unit/issue_test.rb` for running a single test case. +You can run `ruby test/unit/issue_test.rb` for running a single test case and +`ruby test/unit/issue_test.rb -n test_create` for running a single test. Before running tests, you need to configure both development and test databases. diff -Nru redmine-2.3.3/extra/mail_handler/rdm-mailhandler.rb redmine-2.4.2/extra/mail_handler/rdm-mailhandler.rb --- redmine-2.3.3/extra/mail_handler/rdm-mailhandler.rb 2013-09-14 06:48:30.000000000 +0000 +++ redmine-2.4.2/extra/mail_handler/rdm-mailhandler.rb 2013-12-23 08:48:38.000000000 +0000 @@ -1,4 +1,20 @@ #!/usr/bin/env ruby +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. require 'net/http' require 'net/https' @@ -34,7 +50,7 @@ optparse = OptionParser.new do |opts| opts.banner = "Usage: rdm-mailhandler.rb [options] --url= --key=" opts.separator("") - opts.separator("Reads an email from standard input and forward it to a Redmine server through a HTTP request.") + opts.separator("Reads an email from standard input and forwards it to a Redmine server through a HTTP request.") opts.separator("") opts.separator("Required arguments:") opts.on("-u", "--url URL", "URL of the Redmine server") {|v| self.url = v} @@ -43,10 +59,10 @@ opts.separator("General options:") opts.on("--no-permission-check", "disable permission checking when receiving", "the email") {self.no_permission_check = '1'} - opts.on("--key-file FILE", "path to a file that contains the Redmine", - "API key (use this option instead of --key", - "if you don't the key to appear in the", - "command line)") {|v| read_key_from_file(v)} + opts.on("--key-file FILE", "full path to a file that contains your Redmine", + "API key (use this option instead of --key if", + "you don't want the key to appear in the command", + "line)") {|v| read_key_from_file(v)} opts.on("--no-check-certificate", "do not check server certificate") {self.no_check_certificate = true} opts.on("-h", "--help", "show this help") {puts opts; exit 1} opts.on("-v", "--verbose", "show extra information") {self.verbose = true} @@ -76,7 +92,7 @@ "ATTRS is a comma separated list of attributes") {|v| self.allow_override = v} opts.separator("") opts.separator("Examples:") - opts.separator("No project specified. Emails MUST contain the 'Project' keyword:") + opts.separator("No project specified, emails MUST contain the 'Project' keyword:") opts.separator(" rdm-mailhandler.rb --url http://redmine.domain.foo --key secret") opts.separator("") opts.separator("Fixed project and default tracker specified, but emails can override") diff -Nru redmine-2.3.3/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb redmine-2.4.2/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb --- redmine-2.3.3/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb 2013-09-14 06:48:40.000000000 +0000 +++ redmine-2.4.2/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb 2013-12-23 08:48:40.000000000 +0000 @@ -57,26 +57,26 @@ scope = self if from && to - scope = scope.scoped(:conditions => ["#{provider_options[:timestamp]} BETWEEN ? AND ?", from, to]) + scope = scope.where("#{provider_options[:timestamp]} BETWEEN ? AND ?", from, to) end if options[:author] return [] if provider_options[:author_key].nil? - scope = scope.scoped(:conditions => ["#{provider_options[:author_key]} = ?", options[:author].id]) + scope = scope.where("#{provider_options[:author_key]} = ?", options[:author].id) end if options[:limit] # id and creation time should be in same order in most cases - scope = scope.scoped(:order => "#{table_name}.id DESC", :limit => options[:limit]) + scope = scope.reorder("#{table_name}.id DESC").limit(options[:limit]) end if provider_options.has_key?(:permission) - scope = scope.scoped(:conditions => Project.allowed_to_condition(user, provider_options[:permission] || :view_project, options)) + scope = scope.where(Project.allowed_to_condition(user, provider_options[:permission] || :view_project, options)) elsif respond_to?(:visible) scope = scope.visible(user, options) else ActiveSupport::Deprecation.warn "acts_as_activity_provider with implicit :permission option is deprecated. Add a visible scope to the #{self.name} model or use explicit :permission option." - scope = scope.scoped(:conditions => Project.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) + scope = scope.where(Project.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) end scope.all(provider_options[:find_options].dup) diff -Nru redmine-2.3.3/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb redmine-2.4.2/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb --- redmine-2.3.3/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb 2013-09-14 06:48:40.000000000 +0000 +++ redmine-2.4.2/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb 2013-12-23 08:48:40.000000000 +0000 @@ -81,12 +81,13 @@ token_clauses = columns.collect {|column| "(LOWER(#{column}) LIKE ?)"} if !options[:titles_only] && searchable_options[:search_custom_fields] - searchable_custom_field_ids = CustomField.where(:type => "#{self.name}CustomField", :searchable => true).pluck(:id) - if searchable_custom_field_ids.any? - custom_field_sql = "#{table_name}.id IN (SELECT customized_id FROM #{CustomValue.table_name}" + + searchable_custom_fields = CustomField.where(:type => "#{self.name}CustomField", :searchable => true) + searchable_custom_fields.each do |field| + sql = "#{table_name}.id IN (SELECT customized_id FROM #{CustomValue.table_name}" + " WHERE customized_type='#{self.name}' AND customized_id=#{table_name}.id AND LOWER(value) LIKE ?" + - " AND #{CustomValue.table_name}.custom_field_id IN (#{searchable_custom_field_ids.join(',')}))" - token_clauses << custom_field_sql + " AND #{CustomValue.table_name}.custom_field_id = #{field.id})" + + " AND #{field.visibility_by_project_condition(searchable_options[:project_key], user)}" + token_clauses << sql end end diff -Nru redmine-2.3.3/lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb redmine-2.4.2/lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb --- redmine-2.3.3/lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb 2013-09-14 06:48:41.000000000 +0000 +++ redmine-2.4.2/lib/plugins/acts_as_versioned/lib/acts_as_versioned.rb 2013-12-23 08:48:40.000000000 +0000 @@ -437,7 +437,7 @@ # Gets the next available version for the current record, or 1 for a new record def next_version return 1 if new_record? - (versions.calculate(:max, :version) || 0) + 1 + (versions.maximum('version') || 0) + 1 end # clears current changed attributes. Called after save. diff -Nru redmine-2.3.3/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb redmine-2.4.2/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb --- redmine-2.3.3/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb 2013-09-14 06:48:40.000000000 +0000 +++ redmine-2.4.2/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb 2013-12-23 08:48:40.000000000 +0000 @@ -14,8 +14,8 @@ has_many :watcher_users, :through => :watchers, :source => :user, :validate => false scope :watched_by, lambda { |user_id| - { :include => :watchers, - :conditions => ["#{Watcher.table_name}.user_id = ?", user_id] } + joins(:watchers). + where("#{Watcher.table_name}.user_id = ?", user_id) } attr_protected :watcher_ids, :watcher_user_ids end @@ -46,7 +46,7 @@ # Removes user from the watchers list def remove_watcher(user) return nil unless user && user.is_a?(User) - Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}" + watchers.where(:user_id => user.id).delete_all end # Adds/removes watcher diff -Nru redmine-2.3.3/lib/plugins/open_id_authentication/test/test_helper.rb redmine-2.4.2/lib/plugins/open_id_authentication/test/test_helper.rb --- redmine-2.3.3/lib/plugins/open_id_authentication/test/test_helper.rb 2013-09-14 06:48:41.000000000 +0000 +++ redmine-2.4.2/lib/plugins/open_id_authentication/test/test_helper.rb 2013-12-23 08:48:40.000000000 +0000 @@ -8,7 +8,7 @@ require 'action_controller' gem 'mocha' -require 'mocha' +require 'mocha/setup' gem 'ruby-openid' require 'openid' diff -Nru redmine-2.3.3/lib/plugins/rfpdf/lib/fpdf/fpdf_eps.rb redmine-2.4.2/lib/plugins/rfpdf/lib/fpdf/fpdf_eps.rb --- redmine-2.3.3/lib/plugins/rfpdf/lib/fpdf/fpdf_eps.rb 2013-09-14 06:48:38.000000000 +0000 +++ redmine-2.4.2/lib/plugins/rfpdf/lib/fpdf/fpdf_eps.rb 1970-01-01 00:00:00.000000000 +0000 @@ -1,139 +0,0 @@ -# Information -# -# PDF_EPS class from Valentin Schmidt ported to ruby by Thiago Jackiw (tjackiw@gmail.com) -# working for Mingle LLC (www.mingle.com) -# Release Date: July 13th, 2006 -# -# Description -# -# This script allows to embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files. -# Only vector drawing is supported, not text or bitmap. Although the script was successfully -# tested with various AI format versions, best results are probably achieved with files that -# were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2). -# -# ImageEps(string file, float x, float y [, float w [, float h [, string link [, boolean useBoundingBox]]]]) -# -# Same parameters as for regular FPDF::Image() method, with an additional one: -# -# useBoundingBox: specifies whether to position the bounding box (true) or the complete canvas (false) -# at location (x,y). Default value is true. -# -# First added to the Ruby FPDF distribution in 1.53c -# -# Usage is as follows: -# -# require 'fpdf' -# require 'fpdf_eps' -# pdf = FPDF.new -# pdf.extend(PDF_EPS) -# pdf.ImageEps(...) -# -# This allows it to be combined with other extensions, such as the bookmark -# module. - -module PDF_EPS - def ImageEps(file, x, y, w=0, h=0, link='', use_bounding_box=true) - data = nil - if File.exists?(file) - File.open(file, 'rb') do |f| - data = f.read() - end - else - Error('EPS file not found: '+file) - end - - # Find BoundingBox param - regs = data.scan(/%%BoundingBox: [^\r\n]*/m) - regs << regs[0].gsub(/%%BoundingBox: /, '') - if regs.size > 1 - tmp = regs[1].to_s.split(' ') - @x1 = tmp[0].to_i - @y1 = tmp[1].to_i - @x2 = tmp[2].to_i - @y2 = tmp[3].to_i - else - Error('No BoundingBox found in EPS file: '+file) - end - f_start = data.index('%%EndSetup') - f_start = data.index('%%EndProlog') if f_start === false - f_start = data.index('%%BoundingBox') if f_start === false - - data = data.slice(f_start, data.length) - - f_end = data.index('%%PageTrailer') - f_end = data.index('showpage') if f_end === false - data = data.slice(0, f_end) if f_end - - # save the current graphic state - out('q') - - k = @k - - # Translate - if use_bounding_box - dx = x*k-@x1 - dy = @hPt-@y2-y*k - else - dx = x*k - dy = -y*k - end - tm = [1,0,0,1,dx,dy] - out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm', - tm[0], tm[1], tm[2], tm[3], tm[4], tm[5])) - - if w > 0 - scale_x = w/((@x2-@x1)/k) - if h > 0 - scale_y = h/((@y2-@y1)/k) - else - scale_y = scale_x - h = (@y2-@y1)/k * scale_y - end - else - if h > 0 - scale_y = $h/((@y2-@y1)/$k) - scale_x = scale_y - w = (@x2-@x1)/k * scale_x - else - w = (@x2-@x1)/k - h = (@y2-@y1)/k - end - end - - if !scale_x.nil? - # Scale - tm = [scale_x,0,0,scale_y,0,@hPt*(1-scale_y)] - out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm', - tm[0], tm[1], tm[2], tm[3], tm[4], tm[5])) - end - - data.split(/\r\n|[\r\n]/).each do |line| - next if line == '' || line[0,1] == '%' - len = line.length - # next if (len > 2 && line[len-2,len] != ' ') - cmd = line[len-2,len].strip - case cmd - when 'm', 'l', 'v', 'y', 'c', 'k', 'K', 'g', 'G', 's', 'S', 'J', 'j', 'w', 'M', 'd': - out(line) - - when 'L': - line[len-1,len]='l' - out(line) - - when 'C': - line[len-1,len]='c' - out(line) - - when 'f', 'F': - out('f*') - - when 'b', 'B': - out(cmd + '*') - end - end - - # restore previous graphic state - out('Q') - Link(x,y,w,h,link) if link - end -end diff -Nru redmine-2.3.3/lib/plugins/rfpdf/lib/tcpdf.rb redmine-2.4.2/lib/plugins/rfpdf/lib/tcpdf.rb --- redmine-2.3.3/lib/plugins/rfpdf/lib/tcpdf.rb 2013-09-14 06:48:40.000000000 +0000 +++ redmine-2.4.2/lib/plugins/rfpdf/lib/tcpdf.rb 2013-12-23 08:48:40.000000000 +0000 @@ -2431,7 +2431,7 @@ out('1 0 obj'); out('<>'); + out('<>') out('stream'); out('/CIDInit /ProcSet findresource begin'); out('12 dict begin'); diff -Nru redmine-2.3.3/lib/redcloth3.rb redmine-2.4.2/lib/redcloth3.rb --- redmine-2.3.3/lib/redcloth3.rb 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/redcloth3.rb 2013-12-23 08:48:41.000000000 +0000 @@ -129,7 +129,7 @@ # # Will become: # -# ACLU +# ACLU # # == Adding Tables # @@ -457,7 +457,7 @@ # text.gsub! re, resub #end text.gsub!(/\b([A-Z][A-Z0-9]{1,})\b(?:[(]([^)]*)[)])/) do |m| - "#{$1}" + "#{$1}" end end @@ -525,7 +525,7 @@ tatts = pba( tatts, 'table' ) tatts = shelve( tatts ) if tatts rows = [] - + fullrow.gsub!(/([^|])\n/, "\\1
    ") fullrow.each_line do |row| ratts, row = pba( $1, 'tr' ), $2 if row =~ /^(#{A}#{C}\. )(.*)/m cells = [] diff -Nru redmine-2.3.3/lib/redmine/custom_field_format.rb redmine-2.4.2/lib/redmine/custom_field_format.rb --- redmine-2.3.3/lib/redmine/custom_field_format.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/custom_field_format.rb 2013-12-23 08:48:41.000000000 +0000 @@ -70,6 +70,13 @@ @@available[custom_field_format.name] = custom_field_format unless @@available.keys.include?(custom_field_format.name) end + def delete(format) + if format.is_a?(Redmine::CustomFieldFormat) + format = format.name + end + @@available.delete(format) + end + def available_formats @@available.keys end diff -Nru redmine-2.3.3/lib/redmine/export/pdf.rb redmine-2.4.2/lib/redmine/export/pdf.rb --- redmine-2.3.3/lib/redmine/export/pdf.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/export/pdf.rb 2013-12-23 08:48:41.000000000 +0000 @@ -256,7 +256,7 @@ def fetch_row_values(issue, query, level) query.inline_columns.collect do |column| s = if column.is_a?(QueryCustomFieldColumn) - cv = issue.custom_field_values.detect {|v| v.custom_field_id == column.custom_field.id} + cv = issue.visible_custom_field_values.detect {|v| v.custom_field_id == column.custom_field.id} show_value(cv) else value = issue.send(column.name) @@ -314,11 +314,11 @@ col_width_avg.map! {|x| x / k} # calculate columns width - ratio = table_width / col_width_avg.inject(0) {|s,w| s += w} + ratio = table_width / col_width_avg.inject(0, :+) col_width = col_width_avg.map {|w| w * ratio} # correct max word width if too many columns - ratio = table_width / word_width_max.inject(0) {|s,w| s += w} + ratio = table_width / word_width_max.inject(0, :+) word_width_max.map! {|v| v * ratio} if ratio < 1 # correct and lock width of some columns @@ -354,7 +354,7 @@ # calculate column normalizing ratio if free_col_width == 0 - ratio = table_width / col_width.inject(0) {|s,w| s += w} + ratio = table_width / col_width.inject(0, :+) else ratio = (table_width - fix_col_width) / free_col_width end @@ -426,13 +426,13 @@ col_width = [] unless query.inline_columns.empty? col_width = calc_col_width(issues, query, table_width, pdf) - table_width = col_width.inject(0) {|s,v| s += v} + table_width = col_width.inject(0, :+) end # use full width if the description is displayed if table_width > 0 && query.has_column?(:description) col_width = col_width.map {|w| w * (page_width - right_margin - left_margin) / table_width} - table_width = col_width.inject(0) {|s,v| s += v} + table_width = col_width.inject(0, :+) end # title @@ -493,8 +493,7 @@ end # Renders MultiCells and returns the maximum height used - def issues_to_pdf_write_cells(pdf, col_values, col_widths, - row_height, head=false) + def issues_to_pdf_write_cells(pdf, col_values, col_widths, row_height, head=false) base_y = pdf.GetY max_height = row_height col_values.each_with_index do |column, i| @@ -572,8 +571,8 @@ right << nil end - half = (issue.custom_field_values.size / 2.0).ceil - issue.custom_field_values.each_with_index do |custom_value, i| + half = (issue.visible_custom_field_values.size / 2.0).ceil + issue.visible_custom_field_values.each_with_index do |custom_value, i| (i < half ? left : right) << [custom_value.custom_field.name, show_value(custom_value)] end @@ -684,7 +683,7 @@ pdf.RDMCell(190,5, title) pdf.Ln pdf.SetFontStyle('I',8) - details_to_strings(journal.details, true).each do |string| + details_to_strings(journal.visible_details, true).each do |string| pdf.RDMMultiCell(190,5, "- " + string) end if journal.notes? diff -Nru redmine-2.3.3/lib/redmine/helpers/diff.rb redmine-2.4.2/lib/redmine/helpers/diff.rb --- redmine-2.3.3/lib/redmine/helpers/diff.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/helpers/diff.rb 2013-12-23 08:48:41.000000000 +0000 @@ -15,6 +15,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +require 'diff' + module Redmine module Helpers class Diff diff -Nru redmine-2.3.3/lib/redmine/helpers/gantt.rb redmine-2.4.2/lib/redmine/helpers/gantt.rb --- redmine-2.3.3/lib/redmine/helpers/gantt.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/helpers/gantt.rb 2013-12-23 08:48:41.000000000 +0000 @@ -162,11 +162,12 @@ ids = issues.collect(&:project).uniq.collect(&:id) if ids.any? # All issues projects and their visible ancestors - @projects = Project.visible.all( - :joins => "LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt", - :conditions => ["child.id IN (?)", ids], - :order => "#{Project.table_name}.lft ASC" - ).uniq + @projects = Project.visible. + joins("LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt"). + where("child.id IN (?)", ids). + order("#{Project.table_name}.lft ASC"). + uniq. + all else @projects = [] end @@ -214,12 +215,13 @@ @number_of_rows += 1 return if abort? issues = project_issues(project).select {|i| i.fixed_version.nil?} - sort_issues!(issues) + self.class.sort_issues!(issues) if issues render_issues(issues, options) return if abort? end versions = project_versions(project) + self.class.sort_versions!(versions) versions.each do |version| render_version(project, version, options) end @@ -248,7 +250,7 @@ return if abort? issues = version_issues(project, version) if issues - sort_issues!(issues) + self.class.sort_issues!(issues) # Indent issues options[:indent] += options[:indent_increment] render_issues(issues, options) @@ -675,18 +677,23 @@ start_date + (end_date - start_date + 1) * (progress / 100.0) end - # TODO: Sorts a collection of issues by start_date, due_date, id for gantt rendering - def sort_issues!(issues) - issues.sort! { |a, b| gantt_issue_compare(a, b) } + def self.sort_issues!(issues) + issues.sort! {|a, b| sort_issue_logic(a) <=> sort_issue_logic(b)} end - # TODO: top level issues should be sorted by start date - def gantt_issue_compare(x, y) - if x.root_id == y.root_id - x.lft <=> y.lft - else - x.root_id <=> y.root_id - end + def self.sort_issue_logic(issue) + julian_date = Date.new() + ancesters_start_date = [] + current_issue = issue + begin + ancesters_start_date.unshift([current_issue.start_date || julian_date, current_issue.id]) + current_issue = current_issue.parent + end while (current_issue) + ancesters_start_date + end + + def self.sort_versions!(versions) + versions.sort! end def current_limit diff -Nru redmine-2.3.3/lib/redmine/info.rb redmine-2.4.2/lib/redmine/info.rb --- redmine-2.3.3/lib/redmine/info.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/info.rb 2013-12-23 08:48:41.000000000 +0000 @@ -14,9 +14,17 @@ ["Rails version", Rails::VERSION::STRING], ["Environment", Rails.env], ["Database adapter", ActiveRecord::Base.connection.adapter_name] - ].map {|info| " %-30s %s" % info}.join("\n") - s << "\nRedmine plugins:\n" + ].map {|info| " %-30s %s" % info}.join("\n") + "\n" + s << "SCM:\n" + Redmine::Scm::Base.all.each do |scm| + scm_class = "Repository::#{scm}".constantize + if scm_class.scm_available + s << " %-30s %s\n" % [scm, scm_class.scm_version_string] + end + end + + s << "Redmine plugins:\n" plugins = Redmine::Plugin.all if plugins.any? s << plugins.map {|plugin| " %-30s %s" % [plugin.id.to_s, plugin.version.to_s]}.join("\n") diff -Nru redmine-2.3.3/lib/redmine/menu_manager.rb redmine-2.4.2/lib/redmine/menu_manager.rb --- redmine-2.3.3/lib/redmine/menu_manager.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/menu_manager.rb 2013-12-23 08:48:41.000000000 +0000 @@ -221,6 +221,8 @@ end class Mapper + attr_reader :menu, :menu_items + def initialize(menu, items) items[menu] ||= MenuNode.new(:root, {}) @menu = menu diff -Nru redmine-2.3.3/lib/redmine/plugin.rb redmine-2.4.2/lib/redmine/plugin.rb --- redmine-2.3.3/lib/redmine/plugin.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/plugin.rb 2013-12-23 08:48:41.000000000 +0000 @@ -64,15 +64,18 @@ end end end - def_field :name, :description, :url, :author, :author_url, :version, :settings + def_field :name, :description, :url, :author, :author_url, :version, :settings, :directory attr_reader :id # Plugin constructor def self.register(id, &block) p = new(id) p.instance_eval(&block) + # Set a default name if it was not provided during registration p.name(id.to_s.humanize) if p.name.nil? + # Set a default directory if it was not provided during registration + p.directory(File.join(self.directory, id.to_s)) if p.directory.nil? # Adds plugin locales if any # YAML translation files should be found under /config/locales/ @@ -137,10 +140,6 @@ @id = id.to_sym end - def directory - File.join(self.class.directory, id.to_s) - end - def public_directory File.join(self.class.public_directory, id.to_s) end @@ -444,7 +443,7 @@ class Migrator < ActiveRecord::Migrator # We need to be able to set the 'current' plugin being migrated. cattr_accessor :current_plugin - + class << self # Runs the migrations from a plugin, up (or down) to the version given def migrate_plugin(plugin, version) @@ -452,7 +451,7 @@ return if current_version(plugin) == version migrate(plugin.migration_directory, version) end - + def current_version(plugin=current_plugin) # Delete migrations that don't match .. to_i will work because the number comes first ::ActiveRecord::Base.connection.select_values( @@ -460,14 +459,14 @@ ).delete_if{ |v| v.match(/-#{plugin.id}/) == nil }.map(&:to_i).max || 0 end end - + def migrated sm_table = self.class.schema_migrations_table_name ::ActiveRecord::Base.connection.select_values( "SELECT version FROM #{sm_table}" ).delete_if{ |v| v.match(/-#{current_plugin.id}/) == nil }.map(&:to_i).sort end - + def record_version_state_after_migrating(version) super(version.to_s + "-" + current_plugin.id.to_s) end diff -Nru redmine-2.3.3/lib/redmine/scm/adapters/abstract_adapter.rb redmine-2.4.2/lib/redmine/scm/adapters/abstract_adapter.rb --- redmine-2.3.3/lib/redmine/scm/adapters/abstract_adapter.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/scm/adapters/abstract_adapter.rb 2013-12-23 08:48:41.000000000 +0000 @@ -24,9 +24,6 @@ module Redmine module Scm module Adapters - class CommandFailed < StandardError #:nodoc: - end - class AbstractAdapter #:nodoc: # raised if scm command exited with error, e.g. unknown revision. diff -Nru redmine-2.3.3/lib/redmine/scm/adapters/bazaar_adapter.rb redmine-2.4.2/lib/redmine/scm/adapters/bazaar_adapter.rb --- redmine-2.3.3/lib/redmine/scm/adapters/bazaar_adapter.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/scm/adapters/bazaar_adapter.rb 2013-12-23 08:48:41.000000000 +0000 @@ -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. -require 'redmine/scm/adapters/abstract_adapter' +require 'redmine/scm/adapters' module Redmine module Scm diff -Nru redmine-2.3.3/lib/redmine/scm/adapters/git_adapter.rb redmine-2.4.2/lib/redmine/scm/adapters/git_adapter.rb --- redmine-2.3.3/lib/redmine/scm/adapters/git_adapter.rb 2013-09-14 06:48:42.000000000 +0000 +++ redmine-2.4.2/lib/redmine/scm/adapters/git_adapter.rb 2013-12-23 08:48:41.000000000 +0000 @@ -333,7 +333,7 @@ def annotate(path, identifier=nil) identifier = 'HEAD' if identifier.blank? - cmd_args = %w|blame| + cmd_args = %w|blame --encoding=UTF-8| cmd_args << "-p" << identifier << "--" << scm_iconv(@path_encoding, 'UTF-8', path) blame = Annotate.new content = nil diff -Nru redmine-2.3.3/lib/redmine/scm/adapters.rb redmine-2.4.2/lib/redmine/scm/adapters.rb --- redmine-2.3.3/lib/redmine/scm/adapters.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/lib/redmine/scm/adapters.rb 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,25 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module Redmine + module Scm + module Adapters + class CommandFailed < StandardError #:nodoc: + end + end + end +end diff -Nru redmine-2.3.3/lib/redmine/version.rb redmine-2.4.2/lib/redmine/version.rb --- redmine-2.3.3/lib/redmine/version.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/version.rb 2013-12-23 08:48:41.000000000 +0000 @@ -3,8 +3,8 @@ module Redmine module VERSION #:nodoc: MAJOR = 2 - MINOR = 3 - TINY = 3 + MINOR = 4 + TINY = 2 # Branch values: # * official release: nil diff -Nru redmine-2.3.3/lib/redmine/wiki_formatting/textile/helper.rb redmine-2.4.2/lib/redmine/wiki_formatting/textile/helper.rb --- redmine-2.3.3/lib/redmine/wiki_formatting/textile/helper.rb 2013-09-14 06:48:43.000000000 +0000 +++ redmine-2.4.2/lib/redmine/wiki_formatting/textile/helper.rb 2013-12-23 08:48:41.000000000 +0000 @@ -22,7 +22,7 @@ def wikitoolbar_for(field_id) heads_for_wiki_formatter # Is there a simple way to link to a public resource? - url = "#{Redmine::Utils.relative_url_root}/help/wiki_syntax.html" + url = "#{Redmine::Utils.relative_url_root}/help/#{current_language.to_s.downcase}/wiki_syntax.html" javascript_tag("var wikiToolbar = new jsToolBar(document.getElementById('#{field_id}')); wikiToolbar.setHelpLink('#{escape_javascript url}'); wikiToolbar.draw();") end diff -Nru redmine-2.3.3/lib/tasks/ci.rake redmine-2.4.2/lib/tasks/ci.rake --- redmine-2.3.3/lib/tasks/ci.rake 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/tasks/ci.rake 2013-12-23 08:48:41.000000000 +0000 @@ -23,7 +23,7 @@ desc "Build Redmine" task :build do Rake::Task["test"].invoke - #Rake::Task["test:ui"].invoke unless RUBY_VERSION < '1.9' + # Rake::Task["test:ui"].invoke if RUBY_VERSION >= '1.9.3' end desc "Finish the build" @@ -42,16 +42,25 @@ case database when 'mysql' - dev_conf = {'adapter' => (RUBY_VERSION >= '1.9' ? 'mysql2' : 'mysql'), 'database' => dev_db_name, 'host' => 'localhost', 'username' => 'jenkins', 'password' => 'jenkins', 'encoding' => 'utf8'} + dev_conf = {'adapter' => (RUBY_VERSION >= '1.9' ? 'mysql2' : 'mysql'), + 'database' => dev_db_name, 'host' => 'localhost', + 'username' => 'jenkins', 'password' => 'jenkins', + 'encoding' => 'utf8'} test_conf = dev_conf.merge('database' => test_db_name) when 'postgresql' - dev_conf = {'adapter' => 'postgresql', 'database' => dev_db_name, 'host' => 'localhost', 'username' => 'jenkins', 'password' => 'jenkins'} + dev_conf = {'adapter' => 'postgresql', 'database' => dev_db_name, + 'host' => 'localhost', + 'username' => 'jenkins', 'password' => 'jenkins'} test_conf = dev_conf.merge('database' => test_db_name) - when 'sqlite3' - dev_conf = {'adapter' => 'sqlite3', 'database' => "db/#{dev_db_name}.sqlite3"} + when /sqlite3/ + dev_conf = {'adapter' => (Object.const_defined?(:JRUBY_VERSION) ? + 'jdbcsqlite3' : 'sqlite3'), + 'database' => "db/#{dev_db_name}.sqlite3"} test_conf = dev_conf.merge('database' => "db/#{test_db_name}.sqlite3") when 'sqlserver' - dev_conf = {'adapter' => 'sqlserver', 'database' => dev_db_name, 'host' => 'mssqlserver', 'port' => 1433, 'username' => 'jenkins', 'password' => 'jenkins'} + dev_conf = {'adapter' => 'sqlserver', 'database' => dev_db_name, + 'host' => 'mssqlserver', 'port' => 1433, + 'username' => 'jenkins', 'password' => 'jenkins'} test_conf = dev_conf.merge('database' => test_db_name) else abort "Unknown database" diff -Nru redmine-2.3.3/lib/tasks/email.rake redmine-2.4.2/lib/tasks/email.rake --- redmine-2.3.3/lib/tasks/email.rake 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/tasks/email.rake 2013-12-23 08:48:41.000000000 +0000 @@ -55,15 +55,7 @@ END_DESC task :read => :environment do - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice'] - options[:default_group] = ENV['default_group'] if ENV['default_group'] - - MailHandler.receive(STDIN.read, options) + MailHandler.receive(STDIN.read, MailHandler.extract_options_from_env(ENV)) end desc <<-END_DESC @@ -130,15 +122,7 @@ :move_on_success => ENV['move_on_success'], :move_on_failure => ENV['move_on_failure']} - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice'] - options[:default_group] = ENV['default_group'] if ENV['default_group'] - - Redmine::IMAP.check(imap_options, options) + Redmine::IMAP.check(imap_options, MailHandler.extract_options_from_env(ENV)) end desc <<-END_DESC @@ -165,15 +149,7 @@ :password => ENV['password'], :delete_unprocessed => ENV['delete_unprocessed']} - options = { :issue => {} } - %w(project status tracker category priority).each { |a| options[:issue][a.to_sym] = ENV[a] if ENV[a] } - options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] - options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] - options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] - options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice'] - options[:default_group] = ENV['default_group'] if ENV['default_group'] - - Redmine::POP3.check(pop_options, options) + Redmine::POP3.check(pop_options, MailHandler.extract_options_from_env(ENV)) end desc "Send a test email to the user with the provided login name" diff -Nru redmine-2.3.3/lib/tasks/jdbc.rake redmine-2.4.2/lib/tasks/jdbc.rake --- redmine-2.3.3/lib/tasks/jdbc.rake 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/tasks/jdbc.rake 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -# This file was generated by the "jdbc" generator, which is provided -# by the activerecord-jdbc-adapter gem. -# -# This file allows you to use Rails' various db:* tasks with JDBC. -if defined?(JRUBY_VERSION) - require 'jdbc_adapter' - require 'jdbc_adapter/rake_tasks' -end diff -Nru redmine-2.3.3/lib/tasks/migrate_from_mantis.rake redmine-2.4.2/lib/tasks/migrate_from_mantis.rake --- redmine-2.3.3/lib/tasks/migrate_from_mantis.rake 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/tasks/migrate_from_mantis.rake 2013-12-23 08:48:41.000000000 +0000 @@ -119,7 +119,7 @@ has_many :members, :class_name => "MantisProjectUser", :foreign_key => :project_id def identifier - read_attribute(:name).gsub(/[^a-z0-9\-]+/, '-').slice(0, Project::IDENTIFIER_MAX_LENGTH) + read_attribute(:name).downcase.gsub(/[^a-z0-9\-]+/, '-').slice(0, Project::IDENTIFIER_MAX_LENGTH) end end @@ -503,10 +503,20 @@ # Make sure bugs can refer bugs in other projects Setting.cross_project_issue_relations = 1 if Setting.respond_to? 'cross_project_issue_relations' - # Turn off email notifications - Setting.notified_events = [] + old_notified_events = Setting.notified_events + old_password_min_length = Setting.password_min_length + begin + # Turn off email notifications temporarily + Setting.notified_events = [] + Setting.password_min_length = 4 + # Run the migration + MantisMigrate.establish_connection db_params + MantisMigrate.migrate + ensure + # Restore previous settings + Setting.notified_events = old_notified_events + Setting.password_min_length = old_password_min_length + end - MantisMigrate.establish_connection db_params - MantisMigrate.migrate end end diff -Nru redmine-2.3.3/lib/tasks/migrate_from_trac.rake redmine-2.4.2/lib/tasks/migrate_from_trac.rake --- redmine-2.3.3/lib/tasks/migrate_from_trac.rake 2013-09-14 06:48:45.000000000 +0000 +++ redmine-2.4.2/lib/tasks/migrate_from_trac.rake 2013-12-23 08:48:41.000000000 +0000 @@ -153,7 +153,11 @@ private def trac_fullpath attachment_type = read_attribute(:type) - trac_file = filename.gsub( /[^a-zA-Z0-9\-_\.!~*']/n ) {|x| sprintf('%%%02x', x[0]) } + #replace exotic characters with their hex representation to avoid invalid filenames + trac_file = filename.gsub( /[^a-zA-Z0-9\-_\.!~*']/n ) do |x| + codepoint = RUBY_VERSION < '1.9' ? x[0] : x.codepoints.to_a[0] + sprintf('%%%02x', codepoint) + end "#{TracMigrate.trac_attachments_directory}/#{attachment_type}/#{id}/#{trac_file}" end end @@ -245,8 +249,8 @@ if name_attr = TracSessionAttribute.find_by_sid_and_name(username, 'name') name = name_attr.value end - name =~ (/(.*)(\s+\w+)?/) - fn = $1.strip + name =~ (/(\w+)(\s+\w+)?/) + fn = ($1 || "-").strip ln = ($2 || '-').strip u = User.new :mail => mail.gsub(/[^-@a-z0-9\.]/i, '-'), @@ -259,7 +263,7 @@ # finally, a default user is used if the new user is not valid u = User.first unless u.save end - # Make sure he is a member of the project + # Make sure user is a member of the project if project_member && !u.member_of?(@target_project) role = DEFAULT_ROLE if u.admin @@ -762,10 +766,19 @@ prompt('Target project identifier') {|identifier| TracMigrate.target_project_identifier identifier} puts - # Turn off email notifications - Setting.notified_events = [] - - TracMigrate.migrate + old_notified_events = Setting.notified_events + old_password_min_length = Setting.password_min_length + begin + # Turn off email notifications temporarily + Setting.notified_events = [] + Setting.password_min_length = 4 + # Run the migration + TracMigrate.migrate + ensure + # Restore previous settings + Setting.notified_events = old_notified_events + Setting.password_min_length = old_password_min_length + end end end Binary files /tmp/BU4BmpfHBH/redmine-2.3.3/public/favicon.ico and /tmp/IRwx5QoZSL/redmine-2.4.2/public/favicon.ico differ diff -Nru redmine-2.3.3/public/help/ar/wiki_syntax.html redmine-2.4.2/public/help/ar/wiki_syntax.html --- redmine-2.3.3/public/help/ar/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ar/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + +
    + <%=l(:label_issue_status)%><%=l(:label_issue_status)%>
    + <%=h status.name %>
    + <%=h name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> - <%= field_permission_tag(@permissions, status, field) %> + + <%= field_permission_tag(@permissions, status, field, @role) %> + <% unless status == @statuses.last %>»<% end %>
    + <%=h field.name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> - <%= field_permission_tag(@permissions, status, field) %> + + <%= field_permission_tag(@permissions, status, field, @role) %> + <% unless status == @statuses.last %>»<% end %>
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/ar/wiki_syntax_detailed.html redmine-2.4.2/public/help/ar/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ar/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ar/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/az/wiki_syntax.html redmine-2.4.2/public/help/az/wiki_syntax.html --- redmine-2.3.3/public/help/az/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/az/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/az/wiki_syntax_detailed.html redmine-2.4.2/public/help/az/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/az/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/az/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/bg/wiki_syntax.html redmine-2.4.2/public/help/bg/wiki_syntax.html --- redmine-2.3.3/public/help/bg/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/bg/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/bg/wiki_syntax_detailed.html redmine-2.4.2/public/help/bg/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/bg/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/bg/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/bs/wiki_syntax.html redmine-2.4.2/public/help/bs/wiki_syntax.html --- redmine-2.3.3/public/help/bs/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/bs/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/bs/wiki_syntax_detailed.html redmine-2.4.2/public/help/bs/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/bs/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/bs/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/ca/wiki_syntax.html redmine-2.4.2/public/help/ca/wiki_syntax.html --- redmine-2.3.3/public/help/ca/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ca/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/ca/wiki_syntax_detailed.html redmine-2.4.2/public/help/ca/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ca/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ca/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/cs/wiki_syntax.html redmine-2.4.2/public/help/cs/wiki_syntax.html --- redmine-2.3.3/public/help/cs/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/cs/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Syntaxe Wiki - rychlý náhled

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Styly písma
    Tučný*Tučný*Tučný
    Kurzívou_Kurzívou_Kurzívou
    Podtržený+Podtržený+Podtržený
    Smazaný-Smazaný-Smazaný
    ??Citace??Citace
    Vnořený kód@Vnořený kód@Vnořený kód
    Předformátovaný text<pre>
     řádky
     kódu
    </pre>
    +
    + řádky
    + kódu
    +
    +
    Seznamy
    Nesetříděný seznam* Položka 1
    * Položka 2
    • Položka 1
    • Položka 2
    Setříděný seznam# Položka 1
    # Položka 2
    1. Položka 1
    2. Položka 2
    Nadpisy
    Nadpis 1h1. Nadpis 1

    Nadpis 1

    Nadpis 2h2. Nadpis 2

    Nadpis 2

    Nadpis 3h3. Nadpis 3

    Nadpis 3

    Odkazy
    http://foo.barhttp://foo.bar
    "Odkaz":http://foo.barOdkaz
    Redmine odkazy
    Odkaz na Wiki stránku[[Wiki stránka]]Wiki stránka
    Úkol #12Úkol #12
    Revize r43Revize r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Vnořené obrázky
    Obrázek!url_obrázku!
    !vnořený_obrázek!
    + +

    Více informací

    + + + diff -Nru redmine-2.3.3/public/help/cs/wiki_syntax_detailed.html redmine-2.4.2/public/help/cs/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/cs/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/cs/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +Formátování Wiki v Redminu + + + + + +

    Formátování Wiki

    + +

    Odkazy

    + +

    Odkazy Redmine

    + +

    Redmine umožňuje hypertextové odkazy mezi jednotlivými zdroji (úkoly, revize, wiki stránky...) kdekoli, kde je použito Wiki formátování.

    +
      +
    • Odkaz na úkol: #124 (zobrazí #124, odkaz je přeškrtnutý, jestliže je úkol uzavřen)
    • +
    • Odkaz na poznámku k úkolu: #124-6, nebo #124#note-6
    • +
    + +

    Odkazy Wiki:

    + +
      +
    • [[Příručka]] zobrazí odkaz na stránku nazvanou "Příručka": Příručka.
    • +
    • [[Příručka#čtěte-více]] Vás přenese ke kotvě "čtěte-více". Nadpisy mají automaticky přiřazené kotvy, na které se můžete odkazovat: Příručka.
    • +
    • [[Příručka|Uživatelský manuál]] zobrazí odkaz na tu samou stránku, ale s jiným textem: Uživatelský manuál.
    • +
    + +

    Můžete se také odkazovat na Wiki stránky jiného projektu:

    + +
      +
    • [[projekt_test:Nějaká stránka]] zobrazí odkaz na stránku s názvem "Nějaká stránka" na Wiki projektu projekt_test.
    • +
    • [[projekt_test:]] zobrazí odkaz na hlavní Wiki stránku projektu projekt_test.
    • +
    + +

    Odkazy na Wiki stránky jsou zobrazeny červeně v případě, že odkazovaná stránka dosud neexistuje, např.: Neexistující stránka.

    + +

    Odkazy na další zdroje:

    + +
      +
    • Dokumenty: +
        +
      • document#17 (odkaz na dokument s ID 17)
      • +
      • document:Úvod (odkaz na dokument s názvem "Úvod")
      • +
      • document:"Nějaký dokument" (Uvozovky se mohou použít v případě, že název obsahuje mezery.)
      • +
      • projekt_test:document:"Nějaký dokument" (odkaz na dokument s názvem "Nějaký dokument" v jiném projektu "projekt_test")
      • +
    • +
    + +
      +
    • Verze: +
        +
      • version#3 (odkaz na verzi s ID 3)
      • +
      • version:1.0.0 odkaz na verzi s názvem "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • projekt_test:version:1.0.0 (odkaz na verzi "1.0.0" jiného projektu "projekt_test")
      • +
    • +
    + +
      +
    • Přílohy: +
        +
      • attachment:soubor.zip (odkaz na přílohu aktuálního objektu s názvem soubor.zip)
      • +
      • Aktuálně mohou být odkazovány pouze přílohy aktuálního objektu (u úkolu mohou být odkazy pouze na přílohy danného úkolu).
      • +
    • +
    + +
      +
    • Revize: +
        +
      • r758 (odkaz na revizi)
      • +
      • commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize)
      • +
      • svn1|r758 (odkaz na revizi určitého repozitáře, pro projekty s více repozitáři)
      • +
      • commit:hg|c6f4d0fd (odkaz na revizi s nečíselným označním revize určitého repozitáře, pro projekty s více repozitáři)
      • +
      • projekt_test:r758 (odkaz na revizi jiného projektu)
      • +
      • projekt_test:commit:c6f4d0fd (odkaz na revizi s nečíselným označním revize jiného projektu)
      • +
    • +
    + +
      +
    • Soubory repositáře: +
        +
      • source:some/file (odkaz na soubor umístěný v /some/file respozitáře projektu)
      • +
      • source:some/file@52 (odkaz na revizi souboru č. 52)
      • +
      • source:some/file#L120 (odkaz na 120. řádek souboru)
      • +
      • source:some/file@52#L120 (odkaz na 120. řádek revize souboru č. 52)
      • +
      • source:"some file@52#L120" (použijte uvozovky, když URL obsahuje mezery)
      • +
      • export:some/file (vynutit stažení souboru)
      • +
      • source:svn1|some/file (odkaz na soubor určitého repozitáře, pro projekty s více repositáři)
      • +
      • projekt_test:source:some/file (odkaz na soubor umístěný v /some/file repositáře projektu "projekt_test")
      • +
      • projekt_test:export:some/file (vynutit stažení souboru umístěného v /some/file repositáře projektu "projekt_test")
      • +
    • +
    + +
      +
    • Příspěvky diskuzního fóra: +
        +
      • message#1218 (odkaz na příspěvek s ID 1218)
      • +
    • +
    + +
      +
    • Projekty: +
        +
      • project#3 (odkaz na projekt s ID 3)
      • +
      • project:projekt_test (odkaz na projekt pojmenovaný "projekt_test")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • Zabránit parsování Redmine odkazů, lze vložením vykřičníku před odkaz: !
    • +
    + + +

    Externí odkazy

    + +

    URL odkazy a emaily jsou automaticky zobrazeny jako klikací odkaz:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    zobrazí: http://www.redmine.org,

    + +

    Jestliže chcete zobrazit určitý text místo URL, můžete použít standardní syntaxi textile:

    + +
    +"Webová stránka Redmine":http://www.redmine.org
    +
    + +

    zobrazí: Webová stránka Redmine

    + + +

    Formátování textu

    + + +

    Pro nadpisy, tučný text, tabulky a seznamy, Redmine podporuje syntaxi Textile. Podívejte se na http://en.wikipedia.org/wiki/Textile_(markup_language) pro informace o využití těchto vlastností. Několik příkladů je uvedeno níže, ale Textile toho dokáže mnohem víc.

    + +

    Styly písma

    + +
    +* *tučný*
    +* _kurzíva_
    +* _*tučná kurzíva*_
    +* +podtržený+
    +* -přeškrtnutý-
    +
    + +

    Zobrazí:

    + +
      +
    • tučný
    • +
    • kurzíva
    • +
    • tučná kurzíva
    • +
    • podtržený
    • +
    • přeškrtnutý
    • +
    + +

    Vložené obrázky

    + +
      +
    • !image_url! zobrazí obrázek z odkazu (syntaxe textile)
    • +
    • !>image_url! obrázek zarovnaný napravo
    • +
    • Jestliže máte obrázek přiložený k Wiki stránce, může být zobrazen jako vložený obrázek pomocí jeho jména: !prilozeny_obrazek.png!
    • +
    + +

    Nadpisy

    + +
    +h1. Nadpis 1. úrovně
    +h2. Nadpis 2. úrovně
    +h3. Nadpis 3. úrovně
    +
    + +

    Redmine přiřadí kotvu ke každému nadpisu, takže se na ně lze odkazovat pomocí "#Nadpis", "#Podnadpis" atd.

    + + +

    Odstavce

    + +
    +p>. zarovnaný doprava
    +p=. zarovnaný na střed
    +
    + +

    Toto je odstavec zarovnaný na střed.

    + + +

    Citace

    + +

    Začněte odstavec s bq.

    + +
    +bq. Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    +Vše, co je potřeba, je databázový a webový server.
    +
    + +

    Zobrazí:

    + +
    +

    Rails je framework pro vývoj webových aplikací podle modelu Model-View-Control.
    Vše, co je potřeba, je databázový a webový server.

    +
    + + +

    Obsah

    + +
    +{{toc}} => obsah zarovnaný doleva
    +{{>toc}} => obsah zarovnaný doprava
    +
    + +

    Vodorovná čára

    + +
    +---
    +
    + +

    Makra

    + +

    Redmine obsahuje následující vestavěná makra:

    + +

    hello_world

    Jednoduché makro.

    include

    Vloží Wiki stránku. Např.:

    + +
    {{include(Foo)}}
    macro_list

    Zobrazí seznam všech dostupných maker, včetně jejich popisu, existuje-li.

    + + +

    Zvýrazňování kódu

    + +

    Výchozí zvýrazňování kódu zavisí na CodeRay, což je rychlá zvýrazňovací knihovna napsaná v Ruby. Aktuálně podporuje jazyky C/C++, CSS, Delphi, Groovy, HTML, Java, Javascript, JSON, PHP, Python, RHTML, Ruby, Scheme, SQL, XML a YAML.

    + +

    Kód můžete na stránce zvýraznit pomocí následující syntaxe:

    + +
    +<pre><code class="ruby">
    +  Váš kód vložte zde.
    +</code></pre>
    +
    + +

    Např.:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/da/wiki_syntax.html redmine-2.4.2/public/help/da/wiki_syntax.html --- redmine-2.3.3/public/help/da/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/da/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/da/wiki_syntax_detailed.html redmine-2.4.2/public/help/da/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/da/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/da/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/de/wiki_syntax.html redmine-2.4.2/public/help/de/wiki_syntax.html --- redmine-2.3.3/public/help/de/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/de/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wikiformatierung + + + + +

    Wiki Syntax Schnellreferenz

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Schriftarten
    Fett*Fett*Fett
    Kursiv_Kursiv_Kursiv
    Unterstrichen+Unterstrichen+Unterstrichen
    Durchgestrichen-Durchgestrichen-Durchgestrichen
    ??Zitat??Zitat
    Inline-Code@Inline-Code@Inline-Code
    Vorformatierter Text<pre>
     vorformatierte
     Codezeilen
    </pre>
    +
    + vorformartierte
    + Codezeilen
    +
    +
    Listen
    Unsortierte Liste* Element 1
    * Element 2
    • Element 1
    • Element 2
    Sortierte Liste# Element 1
    # Element 2
    1. Element 1
    2. Element 2
    Überschriften
    Überschrift 1h1. Überschrift 1

    Überschrift 1

    Überschrift 2h2. Überschrift 2

    Überschrift 2

    Überschrift 3h3. Überschrift 3

    Überschrift 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine Links
    Link zu einer Wiki Seite[[Wiki Seite]]Wiki Seite
    Ticket #12Ticket #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    eingebettete Bilder
    Bild!URL_zu_dem_Bild!
    !angehängtes_Bild!
    + +

    weitere Informationen

    + + + diff -Nru redmine-2.3.3/public/help/de/wiki_syntax_detailed.html redmine-2.4.2/public/help/de/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/de/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/de/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/el/wiki_syntax.html redmine-2.4.2/public/help/el/wiki_syntax.html --- redmine-2.3.3/public/help/el/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/el/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/el/wiki_syntax_detailed.html redmine-2.4.2/public/help/el/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/el/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/el/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/en/wiki_syntax.html redmine-2.4.2/public/help/en/wiki_syntax.html --- redmine-2.3.3/public/help/en/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/en/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/en/wiki_syntax_detailed.html redmine-2.4.2/public/help/en/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/en/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/en/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/en-gb/wiki_syntax.html redmine-2.4.2/public/help/en-gb/wiki_syntax.html --- redmine-2.3.3/public/help/en-gb/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/en-gb/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/en-gb/wiki_syntax_detailed.html redmine-2.4.2/public/help/en-gb/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/en-gb/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/en-gb/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/es/wiki_syntax.html redmine-2.4.2/public/help/es/wiki_syntax.html --- redmine-2.3.3/public/help/es/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/es/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/es/wiki_syntax_detailed.html redmine-2.4.2/public/help/es/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/es/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/es/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/et/wiki_syntax.html redmine-2.4.2/public/help/et/wiki_syntax.html --- redmine-2.3.3/public/help/et/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/et/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/et/wiki_syntax_detailed.html redmine-2.4.2/public/help/et/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/et/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/et/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/eu/wiki_syntax.html redmine-2.4.2/public/help/eu/wiki_syntax.html --- redmine-2.3.3/public/help/eu/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/eu/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/eu/wiki_syntax_detailed.html redmine-2.4.2/public/help/eu/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/eu/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/eu/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/fa/wiki_syntax.html redmine-2.4.2/public/help/fa/wiki_syntax.html --- redmine-2.3.3/public/help/fa/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fa/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/fa/wiki_syntax_detailed.html redmine-2.4.2/public/help/fa/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/fa/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fa/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/fi/wiki_syntax.html redmine-2.4.2/public/help/fi/wiki_syntax.html --- redmine-2.3.3/public/help/fi/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fi/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/fi/wiki_syntax_detailed.html redmine-2.4.2/public/help/fi/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/fi/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fi/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/fr/wiki_syntax.html redmine-2.4.2/public/help/fr/wiki_syntax.html --- redmine-2.3.3/public/help/fr/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fr/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Syntaxe rapide des Wikis

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Gras*Gras
    Italic_Italique_Italique
    Underline+Sous-ligné+Sous-ligné
    Deleted-Barré-Barré
    ??Citation??Citation
    Inline Code@Code en ligne@Code en ligne
    Preformatted text<pre>
     lignes
     de code
    </pre>
    +
    + lignes
    + de code
    +
    +
    Listes
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Titres
    Heading 1h1. Titre 1

    Titre 1

    Heading 2h2. Titre 2

    Titre 2

    Heading 3h3. Titre 3

    Titre 3

    Liens
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Liens Redmine
    Link to a Wiki page[[Wiki page]]Wiki page
    Demande #12Demande #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Images en ligne
    Image!url_de_l_image!
    !image_en_pièce_jointe!
    + +

    Plus d'informations

    + + + diff -Nru redmine-2.3.3/public/help/fr/wiki_syntax_detailed.html redmine-2.4.2/public/help/fr/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/fr/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/fr/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Mise en page Wiki

    + +

    Liens

    + +

    Liens Redmine

    + +

    Redmine autorise les hyperliens entre différentes ressources (Demandes, révisions, pages wiki...) n'importe où la mise en page Wiki est utilisée.

    +
      +
    • Lien vers une demande: #124 (affiche #124, le lien est barré si la demande est fermée)
    • +
    • Lien vers une note d'une demande: #124-6, ou #124#note-6
    • +
    + +

    Liens entre Wiki:

    + +
      +
    • [[Guide]] affiche un lien vers la page nommé 'Guide': Guide
    • +
    • [[Guide#balise-avancée]] vous emmène à la balise "balise-avancée". Les titres ont automatiquement une balise assignée afin de pouvoir s'y référer: Guide
    • +
    • [[Guide|Manuel Utilisateur]] affiche un lien vers la même page mais avec un texte différent: Manuel Utilisateur
    • +
    + +

    Vous pouvez aussi faire des liens vers des pages du Wiki d'un autre projet:

    + +
      +
    • [[sandbox:une page]] affiche un lien vers une page nommée 'Une page' du Wiki du projet Sandbox
    • +
    • [[sandbox:]] affiche un lien vers la page principal du Wiki du projet Sandbox
    • +
    + +

    Les liens Wiki sont affichés en rouge si la page n'existe pas encore, ie: Page inexistante.

    + +

    Liens vers d'autres ressources:

    + +
      +
    • Documents: +
        +
      • document#17 (lien vers le document dont l'id est 17)
      • +
      • document:Salutations (lien vers le document dont le titre est "Salutations")
      • +
      • document:"Un document" (Les guillements peuvent être utilisé quand le titre du document comporte des espaces)
      • +
      • sandbox:document:"Un document" (Lien vers le document dont le titre est "Un document" dans le projet différent "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (lien vers la version dont l'id est 3)
      • +
      • version:1.0.0 (lien vers la version nommée "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (lien vers la version nommée "1.0.0" dans le projet "sandbox")
      • +
    • +
    + +
      +
    • Pièces jointes: +
        +
      • attachment:file.zip (lien vers la pièce jointe de l'objet nommée file.zip)
      • +
      • Pour le moment, seules les pièces jointes de l'objet peuvent être référencées (si vous êtes sur une demande, il est possibe de faire référence aux pièces jointes de cette demande uniquement)
      • +
    • +
    + +
      +
    • Révisions: +
        +
      • r758 (lien vers une révision)
      • +
      • commit:c6f4d0fd (lien vers une révision sans référence numérique)
      • +
      • svn1|r758 (lien vers un dépôt spécifique, pour les projets ayant plusieurs dépôts)
      • +
      • commit:hg|c6f4d0fd (lien vers une révision sans référence numérique d'un dépôt spécifique)
      • +
      • sandbox:r758 (Lien vers une révision d'un projet différent)
      • +
      • sandbox:commit:c6f4d0fd (lien vers une révision sans référence numérique d'un autre projet)
      • +
    • +
    + +
      +
    • Fichier de dépôt: +
        +
      • source:un/fichier (Lien vers le fichier situé dans /un/fichier dans le dépôt du projet)
      • +
      • source:un/fichier@52 (Lien vers le fichier de la révison 52)
      • +
      • source:un/fichier#L120 (Lien vers la ligne 120 du fichier fichier)
      • +
      • source:un/fichier@52#L120 (Lien vers la ligne 120 du fichier de la révison 52)
      • +
      • source:"un fichier@52#L120" (Utilisez des guillemets quand l'url contient des espaces)
      • +
      • export:un/fichier (Force le téléchargement du fichier)
      • +
      • source:svn1|un/fichier (Lien vers le fichier dans un dépôt spécifique, pour les projets contenant plusieurs dépôts)
      • +
      • sandbox:source:un/fichier (Lien vers le fichier situé dans /un/fichier dans le dépôt du projet "sandbox")
      • +
      • sandbox:export:un/fichier (Force le téléchargement du fichier dans le dépôt du projet "sandbox")
      • +
    • +
    + +
      +
    • Messages du forum: +
        +
      • message#1218 (Lien vers le message dont l'id est 1218)
      • +
    • +
    + +
      +
    • Projet: +
        +
      • project#3 (Lien vers le projet dont l'id est 3)
      • +
      • project:unprojet (Lien vers le projet nommé "unprojet")
      • +
    • +
    + + +

    Eviter ces lien:

    + +
      +
    • Vous pouvez empêcher les liens Redmine de se faire en les précédant d'un point d'exclamaion : !
    • +
    + + +

    Liens externes

    + +

    Les URLs HTTP et les adresses email sont automatiquement transformé en liens:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    affiche: http://www.redmine.org,

    + +

    Si vous voulez afficher un texte spécifique à la place de l'URL, vous pouvez utilisez la syntaxe standard textile:

    + +
    +"Site Web Redmine":http://www.redmine.org
    +
    + +

    affiche: Site Web Redmine

    + + +

    Formatage du texte

    + + +

    Pour les éléments tel que, gras, tableau, listes, Redmine utilise la syntaxe Textile. Voir http://fr.wikipedia.org/wiki/Textile_(langage) pour les informations sur l'utilisation de ces fonctionnalités. Quelques exemples sont inclus ci-dessous, mais le moteur est capable de beaucoup plus.

    + +

    Police d'écriture

    + +
    +* *gras*
    +* _italique_
    +* _*gras _italique_*_
    +* +sous-ligné+
    +* -barré-
    +
    + +

    Affiche:

    + +
      +
    • gras
    • +
    • _italique_
    • +
    • gras italique
    • +
    • sous-ligné
    • +
    • barré
    • +
    + +

    Afficher une image

    + +
      +
    • !url_de_l_image! affiche une image situé à l'adresse displays an image located at url_de_l_image (syntaxe Textile)
    • +
    • !>url_de_l_image! Image affichée à droite
    • +
    • Si vous avez une image en pièce jointe de votre page Wiki, elle peut être affiché en utilisant simplement sont nom: !image_en_piece_jointe.png!
    • +
    + +

    Titre

    + +
    +h1. Titre
    +h2. Sous-titre
    +h3. Sous-sous-titre
    +
    + +

    Redmine assigne une balise à chacun de ses titres, vous pouvez donc les lier avec "#Titre", "#Sous-titre" et ainsi de suite.

    + + +

    Paragraphes

    + +
    +p>. aligné à droite
    +p=. centré
    +
    + +

    Ceci est un paragraphe centré.

    + + +

    Blockquotes

    + +

    Commencer le paragraphe par bq.

    + +
    +bq. Ruby on Rails, également appelé RoR ou Rails est un framework web libre écrit en Ruby. Il suit le motif de conception Modèle-Vue-Contrôleur aussi nommé MVC.
    +Pour commencer à l'utiliser, il ne vous faut qu'un serveur web et une base de données.
    +
    + +

    Affiche

    + +
    +

    Ruby on Rails, également appelé RoR ou Rails est un framework web libre écrit en Ruby. Il suit le motif de conception Modèle-Vue-Contrôleur aussi nommé MVC.
    Pour commencer à l'utiliser, il ne vous faut qu'un serveur web et une base de données.

    +
    + + +

    Table des matières

    + +
    +{{toc}} =>  table des matières centrées à gauche
    +{{>toc}} => table des matières centrées à droite
    +
    + +

    Règle horizontale

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine possède les macros suivantes:

    + +

    hello_world

    Macro d'exemple.

    include

    Inclue une page Wiki. Exemple:

    + +
    {{include(Foo)}}
    macro_list

    Affiche une liste de toute les macros disponilbes, les descriptions sont inclues si celles-ci sont disponibles.

    + + +

    Coloration syntaxique

    + +

    La coloration syntaxique par défaut repose sur CodeRay, une librairie rapide de coloration syntaxique complètement codée en Ruby. Elle supporte actuellement les langages C, C++, CSS, delphi, groovy, HTML, java, javascript, json, PHP, python, RHTML, ruby, scheme, SQL, XML et YAML.

    + +

    Vous pouvez colorer votre code dans vos pages Wiki en utilisant la syntaxe suivante:

    + +
    +<pre><code class="ruby">
    +  Placez votre code ici.
    +</code></pre>
    +
    + +

    Exemple:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/gl/wiki_syntax.html redmine-2.4.2/public/help/gl/wiki_syntax.html --- redmine-2.3.3/public/help/gl/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/gl/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/gl/wiki_syntax_detailed.html redmine-2.4.2/public/help/gl/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/gl/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/gl/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/he/wiki_syntax.html redmine-2.4.2/public/help/he/wiki_syntax.html --- redmine-2.3.3/public/help/he/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/he/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/he/wiki_syntax_detailed.html redmine-2.4.2/public/help/he/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/he/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/he/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/hr/wiki_syntax.html redmine-2.4.2/public/help/hr/wiki_syntax.html --- redmine-2.3.3/public/help/hr/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/hr/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/hr/wiki_syntax_detailed.html redmine-2.4.2/public/help/hr/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/hr/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/hr/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/hu/wiki_syntax.html redmine-2.4.2/public/help/hu/wiki_syntax.html --- redmine-2.3.3/public/help/hu/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/hu/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/hu/wiki_syntax_detailed.html redmine-2.4.2/public/help/hu/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/hu/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/hu/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/id/wiki_syntax.html redmine-2.4.2/public/help/id/wiki_syntax.html --- redmine-2.3.3/public/help/id/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/id/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/id/wiki_syntax_detailed.html redmine-2.4.2/public/help/id/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/id/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/id/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/it/wiki_syntax.html redmine-2.4.2/public/help/it/wiki_syntax.html --- redmine-2.3.3/public/help/it/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/it/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/it/wiki_syntax_detailed.html redmine-2.4.2/public/help/it/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/it/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/it/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/ja/wiki_syntax.html redmine-2.4.2/public/help/ja/wiki_syntax.html --- redmine-2.3.3/public/help/ja/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ja/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki記法 クイックリファレンス

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    フォントスタイル
    太字*太字*太字
    斜体_斜体_斜体
    下線+下線+下線
    取り消し線-取り消し線-取り消し線
    ??引用??引用
    コード@コード@コード
    整形済みテキスト<pre>
     複数行の
     コード
    </pre>
    +
    +複数行の
    +コード
    +
    +
    リスト
    リスト* 項目1
    * 項目2
    • 項目1
    • 項目2
    順序付きリスト# 項目1
    # 項目2
    1. 項目1
    2. 項目2
    見出し
    見出し1h1. タイトル1

    タイトル1

    見出し2h2. タイトル2

    タイトル2

    見出し3h3. タイトル3

    タイトル3

    リンク
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine内のリンク
    Wikiページへのリンク[[Wiki page]]Wiki page
    チケット #12チケット #12
    リビジョン r43リビジョン r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    画像
    Image!画像URL!
    !添付ファイル名!
    + +

    より詳細なリファレンス

    + + + diff -Nru redmine-2.3.3/public/help/ja/wiki_syntax_detailed.html redmine-2.4.2/public/help/ja/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ja/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ja/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki記法

    + +

    リンク

    + +

    Redmine内のリンク

    + +

    RedmineはWiki記法が使える箇所のどこからでも、チケット・チェンジセット・Wikiページなどリソース間へリンクを行うことができます。

    +
      +
    • チケットへのリンク: #124 (終了したチケットは #124 のように取り消し線付きで表示されます)
    • +
    • チケットの注記へのリンク: #124-6 または #124#note-6
    • +
    + +

    Wikiへのリンク:

    + +
      +
    • [[Guide]] "Guide"という名前のページへのリンクです: Guide
    • +
    • [[Guide#further-reading]] "Guide"というページ内の"further-reading"というアンカーに飛びます。見出しには自動的にアンカーが設定されるのでリンク先とすることができます: Guide
    • +
    • [[Guide|User manual]] "Guide"というページへのリンクを異なるテキストで表示: User manual
    • +
    + +

    別のプロジェクトのwikiへのリンクも可能です:

    + +
      +
    • [[sandbox:some page]] sandboxという名前のプロジェクトのwikiの"some page"という名前のページへのリンク
    • +
    • [[sandbox:]] sanbdoxという名前のプロジェクトのwikiのメインページへのリンク
    • +
    + +

    存在しないwikiページへのリンクは赤で表示されます。 例: Nonexistent page.

    + +

    そのほかのリソースへのリンク:

    + +
      +
    • Documents: +
        +
      • document#17 (id 17の文書へのリンク)
      • +
      • document:Greetings ("Greetings" というタイトルの文書へのリンク)
      • +
      • document:"Some document" (文書のタイトルに空白が含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • sandbox:document:"Some document" ("sandbox" というプロジェクトの "Some document" というタイトルの文書へのリンク)
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (id 3のバージョンへのリンク)
      • +
      • version:1.0.0 ("1.0.0"という名称のバージョンへのリンク)
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 ("sandbox"というプロジェクトの "1.0.0" という名称のバージョンへのリンク)
      • +
    • +
    + +
      +
    • 添付ファイル: +
        +
      • attachment:file.zip (現在のオブジェクトに添付された file.zip というファイルへのリンク)
      • +
      • 現在のオブジェクト上の添付ファイルのみリンク先として指定可能です (例えばあるチケットからは、そのチケットに添付されたファイルのみリンク先にできます)
      • +
    • +
    + +
      +
    • チェンジセット: +
        +
      • r758 (チェンジセットへのリンク)
      • +
      • commit:c6f4d0fd (ハッシュ値によるチェンジセットへのリンク)
      • +
      • svn1|r758 (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのチェンジセットへのリンク)
      • +
      • commit:hg|c6f4d0fd (ハッシュ値による、特定のリポジトリのチェンジセットへのリンク)
      • +
      • sandbox:r758 (他のプロジェクトのチェンジセットへのリンク)
      • +
      • sandbox:commit:c6f4d0fd (ハッシュ値による、他のプロジェクトのチェンジセットへのリンク)
      • +
    • +
    + +
      +
    • リポジトリ内のファイル: +
        +
      • source:some/file (プロジェクトのリポジトリ内の /some/file というファイルへのリンク)
      • +
      • source:some/file@52 (ファイルのリビジョン52へのリンク)
      • +
      • source:some/file#L120 (ファイルの120行目へのリンク)
      • +
      • source:some/file@52#L120 (リビジョン52のファイルの120行目へのリンク)
      • +
      • source:"some file@52#L120" (URLにスペースが含まれる場合はダブルクォーテーションで囲んでください)
      • +
      • export:some/file (ファイルのダウンロードを強制)
      • +
      • source:svn1|some/file (複数のリポジトリが設定されたプロジェクトで、特定のリポジトリのファイルへのリンク)
      • +
      • sandbox:source:some/file ("sandbox" というプロジェクトのリポジトリ上の /some/file というファイルへのリンク)
      • +
      • sandbox:export:some/file (ファイルのダウンロードを強制)
      • +
    • +
    + +
      +
    • フォーラムのメッセージ: +
        +
      • message#1218 (id 1218のメッセージへのリンク)
      • +
    • +
    + +
      +
    • プロジェクト: +
        +
      • project#3 (id 3のプロジェクトへのリンク)
      • +
      • project:someproject ("someproject"という名前のプロジェクトへのリンク)
      • +
    • +
    + + +

    エスケープ:

    + +
      +
    • テキストをRedmineのリンクとして解釈させたくない場合は感嘆符 ! を前につけてください。
    • +
    + + +

    外部リンク

    + +

    HTTP URLとメールアドレスは自動的にリンクになります:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    上記の記述は次のように表示されます: http://www.redmine.org,

    + +

    URLのかわりに別のテキストを表示させたい場合は、標準的なtextile記法が利用できます:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    上記の記述は次のように表示されます: Redmine web site

    + + +

    テキストの書式

    + + +

    見出し、太字、テーブル、リスト等は、RedmineはTextile記法での記述に対応しています。Textile記法の詳細は http://en.wikipedia.org/wiki/Textile_(markup_language) を参照してください。Textileの一例を以下に示しますが、実際にはここで取り上げた以外の記法にも対応しています。

    + +

    文字の書式

    + +
    +* *太字*
    +* _斜体_
    +* _*太字で斜体*_
    +* +下線+
    +* -取り消し線-
    +
    + +

    表示例:

    + +
      +
    • 太字
    • +
    • 斜体
    • +
    • 太字で斜体
    • +
    • 下線
    • +
    • 取り消し線
    • +
    + +

    画像

    + +
      +
    • !image_url! image_urlで指定されたURLの画像を表示 (Textile記法)
    • +
    • !>image_url! 画像を右寄せ・テキスト回り込みありで表示
    • +
    • Wikiページに添付された画像があれば、ファイル名を指定して画像を表示させることができます: !attached_image.png!
    • +
    + +

    見出し

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmineは見出しにアンカーを設定するので、"#Heading", "#Subheading"などを指定してリンクが行えます。

    + + +

    段落

    + +
    +p>. 右寄せ
    +p=. センタリング
    +
    + +

    センタリングされた段落

    + + +

    引用

    + +

    段落を bq. で開始してください。

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    表示例:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目次

    + +
    +{{toc}} => 目次(左寄せ)
    +{{>toc}} => 目次(右寄せ)
    +
    + +

    区切り線

    + +
    +---
    +
    + +

    マクロ

    + +

    Redmineには以下の組み込みマクロが用意されています:

    + +

    hello_world

    サンプルのマクロです。

    include

    別のWikiページの内容を挿入します。 以下は使用例です:

    + +
    {{include(Foo)}}
    macro_list

    上記のマクロを含め、利用可能なマクロの一覧を表示します。

    + + +

    コードハイライト

    + +

    Redmineのコードハイライトは CodeRay という、Rubyで記述された高速なライブラリを使用しています。Coderayはc, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml, yamlに対応しています。

    + +

    Wikiページでコードハイライトを利用するには次のように記述します:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    表示例:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/ko/wiki_syntax.html redmine-2.4.2/public/help/ko/wiki_syntax.html --- redmine-2.3.3/public/help/ko/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ko/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/ko/wiki_syntax_detailed.html redmine-2.4.2/public/help/ko/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ko/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ko/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/lt/wiki_syntax.html redmine-2.4.2/public/help/lt/wiki_syntax.html --- redmine-2.3.3/public/help/lt/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/lt/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/lt/wiki_syntax_detailed.html redmine-2.4.2/public/help/lt/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/lt/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/lt/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/lv/wiki_syntax.html redmine-2.4.2/public/help/lv/wiki_syntax.html --- redmine-2.3.3/public/help/lv/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/lv/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/lv/wiki_syntax_detailed.html redmine-2.4.2/public/help/lv/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/lv/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/lv/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/mk/wiki_syntax.html redmine-2.4.2/public/help/mk/wiki_syntax.html --- redmine-2.3.3/public/help/mk/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/mk/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/mk/wiki_syntax_detailed.html redmine-2.4.2/public/help/mk/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/mk/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/mk/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/mn/wiki_syntax.html redmine-2.4.2/public/help/mn/wiki_syntax.html --- redmine-2.3.3/public/help/mn/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/mn/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/mn/wiki_syntax_detailed.html redmine-2.4.2/public/help/mn/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/mn/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/mn/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/nl/wiki_syntax.html redmine-2.4.2/public/help/nl/wiki_syntax.html --- redmine-2.3.3/public/help/nl/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/nl/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/nl/wiki_syntax_detailed.html redmine-2.4.2/public/help/nl/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/nl/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/nl/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/no/wiki_syntax.html redmine-2.4.2/public/help/no/wiki_syntax.html --- redmine-2.3.3/public/help/no/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/no/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/no/wiki_syntax_detailed.html redmine-2.4.2/public/help/no/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/no/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/no/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/pl/wiki_syntax.html redmine-2.4.2/public/help/pl/wiki_syntax.html --- redmine-2.3.3/public/help/pl/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pl/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/pl/wiki_syntax_detailed.html redmine-2.4.2/public/help/pl/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/pl/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pl/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/pt/wiki_syntax.html redmine-2.4.2/public/help/pt/wiki_syntax.html --- redmine-2.3.3/public/help/pt/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pt/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/pt/wiki_syntax_detailed.html redmine-2.4.2/public/help/pt/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/pt/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pt/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/pt-br/wiki_syntax.html redmine-2.4.2/public/help/pt-br/wiki_syntax.html --- redmine-2.3.3/public/help/pt-br/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pt-br/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/pt-br/wiki_syntax_detailed.html redmine-2.4.2/public/help/pt-br/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/pt-br/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/pt-br/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/ro/wiki_syntax.html redmine-2.4.2/public/help/ro/wiki_syntax.html --- redmine-2.3.3/public/help/ro/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ro/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/ro/wiki_syntax_detailed.html redmine-2.4.2/public/help/ro/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ro/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ro/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/ru/wiki_syntax.html redmine-2.4.2/public/help/ru/wiki_syntax.html --- redmine-2.3.3/public/help/ru/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ru/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,171 @@ + + + + + +Форматирование Wiki + + + + +

    Синтаксис Wiki Краткая Справка

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Стили Шрифтов
    Выделенный*Выделенный*Выделенный
    Наклонный_Наклонный_Наклонный
    Подчёркнутый+Подчёркнутый+ + Подчёркнутый +
    Зачёркнутый-Зачёркнутый- + Зачёркнутый +
    ??Цитата??Цитата
    Вставка Кода@Вставка Кода@Вставка Кода
    Отформатированный текст<pre>
     строки
     кода
    </pre>
    +
    + строки
    + кода
    +            
    +
    Списки
    Несортированный список* Элемент 1
    * Элемент 2
    +
      +
    • Элемент 1
    • +
    • Элемент 2
    • +
    +
    Сортированный список# Элемент 1
    # Элемент 2
    +
      +
    1. Элемент 1
    2. +
    3. Элемент 2
    4. +
    +
    Заголовки
    Заголовок 1h1. Название 1

    Название 1

    Заголовок 2h2. Название 2

    Название 2

    Заголовок 3h3. Название 3

    Название 3

    Ссылки
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Ссылки Redmine
    Ссылка на Wiki страницу[[Wiki страница]]Wiki страница
    Задача #12Задача #12
    Фиксация r43Фиксация r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Вставка изображений
    Изображение!url_картинки!
    !вложенный_файл!
    + +

    Больше информации

    + + + diff -Nru redmine-2.3.3/public/help/ru/wiki_syntax_detailed.html redmine-2.4.2/public/help/ru/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/ru/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/ru/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,329 @@ + + + +Форматирование Wiki Redmine + + + + + +

    Форматирование Wiki

    + +

    Ссылки

    + +

    Ссылки Redmine

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Ссылка на задачу: #124 + ( + #124 + - ссылка зачёркнута, если задача закрыта) +
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki ссылки:

    + +
      +
    • [[Руководство]] выводит ссылку на страницу с названием 'Руководство': Руководство +
    • +
    • [[Руководство#дальнейшее-чтение]] направляет на метку "дальнейшее-чтение". Заголовкам + автоматически + метки, таким образом, вы можете на них ссылаться: Руководство
    • +
    • [[Руководство|Руководство пользователя]] выводит ссылку на саму страницу, но с другим текстом: + Руководство пользователя +
    • +
    + +

    Также вы можете ссылаться на wiki:

    + +
      +
    • [[sandbox:Некоторая страница]] выводит ссылку на страницу с названием 'Некоторая страница' wiki + проекта Sandbox +
    • +
    • [[sandbox:]] выводит ссылку на главную страницу wiki проекта Sandbox
    • +
    + +

    Ссылки на wiki окрашены в красный, если страница ещё не создана, пример: Несуществующая + страница.

    + +

    ССылки на другие ресурсы:

    + +
      +
    • Документы: +
        +
      • document#17 (ссылка на документ с id 17)
      • +
      • document:Приветствие (ссылка на документ с названием "Приветствие")
      • +
      • document:"Некоторый документ" (двойные кавычки использоются в случае, когда название + документа содержит пробелы) +
      • +
      • sandbox:document:"Приветствие" (ссылка на документ с названием "Приветствие" в проекте + "sandbox") +
      • +
    • +
    + +
      +
    • Этапы: +
        +
      • version#3 (ссылка на этап с id 3)
      • +
      • version:1.0.0 (ссылка на этап с названием "1.0.0")
      • +
      • version:"1.0 beta 2" (двойные кавычки использоются в случае, когда название + этапа содержит пробелы) +
      • +
      • sandbox:version:1.0.0 (ссылка на этап "1.0.0" проекта "sandbox")
      • +
    • +
    + +
      +
    • Вложения: +
        +
      • attachment:file.zip (ссылка на вложение текущего объекта с именем file.zip)
      • +
      • Сейчас можно ссылаться только на вложения текущего объекта (если вы просматриваете задачу, то возможно + ссылаться только на вложения этой задачи) +
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Файлы хранилища: +
        +
      • source:some/file (ссылка на файл /some/file, расположенный в хранилище проекта) +
      • +
      • source:some/file@52 (ссылка на 52 ревизию файла)
      • +
      • source:some/file#L120 (ссылка на 120 строку файла)
      • +
      • source:some/file@52#L120 (ссылка на 120 строку в 52 ревизии файла)
      • +
      • source:"some file@52#L120" (используйте use double quotes when the URL contains spaces
      • +
      • export:some/file (ссылка на загрузку файла)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (ссылка на файл /some/file, расположенный в хранилище проекта + "sandbox") +
      • +
      • sandbox:export:some/file (ссылка на загрузку файла)
      • +
    • +
    + +
      +
    • Сообщения форума: +
        +
      • message#1218 (ссылка на сообщение с id 1218)
      • +
    • +
    + +
      +
    • Проекты: +
        +
      • project#3 (ссылка на проект с id 3)
      • +
      • project:someproject (ссылка на проект "someproject")
      • +
    • +
    + + +

    Исключения:

    + +
      +
    • Вы можете отменить обработку ссылок с помощью восклицательного знака перед ссылкой: !http://foo.bar
    • +
    + +

    Внешние ссылки

    + +

    HTTP и почтовые адреса автоматически транслируются в ссылки:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    выводится: http://www.redmine.org,

    + +

    Если же вы хотите, чтобы отобразился текст вместо адреса URL, вы можете испольовать стандартный синтаксис + форматирования текста:

    + +
    +"Сайт Redmine":http://www.redmine.org
    +
    + +

    выводится: Сайт Redmine

    + + +

    Форматирование текста

    + +

    Для таких вещей, как заголовки, выделение, таблицы и списки, Redmine поддерживает синтакс Textile. Обратитесь за + руководством к странице http://en.wikipedia.org/wiki/Textile_(markup_language) + . Несколько примеров приведены ниже, Но сам текстовый процессор способен на гораздо большее.

    + +

    Стиль шрифта

    + +
    +* *выделенный*
    +* _наклонный_
    +* _*выделенный наклонный*_
    +* +подчёркнутый+
    +* -зачёркнутый-
    +
    + +

    Выводится:

    + +
      +
    • выделенный
    • +
    • наклонный
    • +
    • выделенный наклонный
    • +
    • подчёркнутый
    • +
    • зачёркнутый
    • +
    + +

    Вставка изображений

    + +
      +
    • !url_изображения! выводит изображение, расположенное по адресу url_изображения (синтакс textile)
    • +
    • !>url_изображения! выводит изображение, выровненное по правому краю
    • +
    • Прикреплённое к wiki-странице изображение можно отобразить в тексте, используя имя файла: + !вложенное_изображение.png! +
    • +
    + +

    Заголовки

    + +
    +h1. Заголовок
    +h2. Подзаголовок
    +h3. Подзаголовок подзаголовка
    +
    + +

    Redmine присваивает якорь каждому заголовку, поэтому вы можете легко сослаться на любой, указав в тексте "#Заголовок", + "#Подзаголовок" и т.д.

    + + +

    Параграфы

    + +
    +p>. выровненный по правому краю
    +p=. выровненный по центру
    +
    + +

    Это - выровненный по центру параграф.

    + + +

    Цитаты

    + +

    Начните параграф с bq.

    + +
    +bq. Rails - это полноценный, многоуровневый фреймворк для построения веб-приложений, использующих базы данных,
    +    который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).
    +
    + +

    Выводится:

    + +
    +

    Rails - это полноценный, многоуровневый фреймворк для построения веб-приложений, использующих базы данных, + который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).

    +
    + + +

    Содержание

    + +
    +{{Содержание}} => содержание, выровненное по левому краю
    +{{>Содержание}} => содержание, выровненное по правому краю
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Макросы

    + +

    В Redmine существуют следующие встроенные макросы:

    + +

    +

    +
    hello_world
    +

    Некоторый макрос.

    +
    include
    +

    Вставить wiki страницу. Пример:

    + +
    {{include(Foo)}}
    +
    +
    macro_list
    +

    Выводит список доступных макросов с описаниями, если они имеются.

    +
    +

    + + +

    Подсветка кода

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    Вы можете включить подсветку кода используя данный синтаксис:

    + +
    +<pre><code class="ruby">
    +  Поместите свой код сюда.
    +</code></pre>
    +
    + +

    Пример:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sk/wiki_syntax.html redmine-2.4.2/public/help/sk/wiki_syntax.html --- redmine-2.3.3/public/help/sk/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sk/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sk/wiki_syntax_detailed.html redmine-2.4.2/public/help/sk/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sk/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sk/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sl/wiki_syntax.html redmine-2.4.2/public/help/sl/wiki_syntax.html --- redmine-2.3.3/public/help/sl/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sl/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sl/wiki_syntax_detailed.html redmine-2.4.2/public/help/sl/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sl/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sl/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sq/wiki_syntax.html redmine-2.4.2/public/help/sq/wiki_syntax.html --- redmine-2.3.3/public/help/sq/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sq/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sq/wiki_syntax_detailed.html redmine-2.4.2/public/help/sq/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sq/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sq/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sr/wiki_syntax.html redmine-2.4.2/public/help/sr/wiki_syntax.html --- redmine-2.3.3/public/help/sr/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sr/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sr/wiki_syntax_detailed.html redmine-2.4.2/public/help/sr/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sr/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sr/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sr-yu/wiki_syntax.html redmine-2.4.2/public/help/sr-yu/wiki_syntax.html --- redmine-2.3.3/public/help/sr-yu/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sr-yu/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sr-yu/wiki_syntax_detailed.html redmine-2.4.2/public/help/sr-yu/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sr-yu/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sr-yu/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/sv/wiki_syntax.html redmine-2.4.2/public/help/sv/wiki_syntax.html --- redmine-2.3.3/public/help/sv/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sv/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/sv/wiki_syntax_detailed.html redmine-2.4.2/public/help/sv/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/sv/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/sv/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/th/wiki_syntax.html redmine-2.4.2/public/help/th/wiki_syntax.html --- redmine-2.3.3/public/help/th/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/th/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/th/wiki_syntax_detailed.html redmine-2.4.2/public/help/th/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/th/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/th/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/tr/wiki_syntax.html redmine-2.4.2/public/help/tr/wiki_syntax.html --- redmine-2.3.3/public/help/tr/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/tr/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/tr/wiki_syntax_detailed.html redmine-2.4.2/public/help/tr/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/tr/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/tr/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/uk/wiki_syntax.html redmine-2.4.2/public/help/uk/wiki_syntax.html --- redmine-2.3.3/public/help/uk/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/uk/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/uk/wiki_syntax_detailed.html redmine-2.4.2/public/help/uk/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/uk/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/uk/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/vi/wiki_syntax.html redmine-2.4.2/public/help/vi/wiki_syntax.html --- redmine-2.3.3/public/help/vi/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/vi/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/vi/wiki_syntax_detailed.html redmine-2.4.2/public/help/vi/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/vi/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/vi/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/wiki_syntax.html redmine-2.4.2/public/help/wiki_syntax.html --- redmine-2.3.3/public/help/wiki_syntax.html 2013-09-14 06:48:46.000000000 +0000 +++ redmine-2.4.2/public/help/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ - - - - - -Wiki formatting - - - - -

    Wiki Syntax Quick Reference

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    -
    - lines
    - of code
    -
    -
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    - -

    More Information

    - - - diff -Nru redmine-2.3.3/public/help/wiki_syntax_detailed.html redmine-2.4.2/public/help/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/wiki_syntax_detailed.html 2013-09-14 06:48:46.000000000 +0000 +++ redmine-2.4.2/public/help/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,281 +0,0 @@ - - - -RedmineWikiFormatting - - - - - -

    Wiki formatting

    - -

    Links

    - -

    Redmine links

    - -

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    -
      -
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • -
    • Link to an issue note: #124-6, or #124#note-6
    • -
    - -

    Wiki links:

    - -
      -
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • -
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • -
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • -
    - -

    You can also link to pages of an other project wiki:

    - -
      -
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • -
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • -
    - -

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    - -

    Links to other resources:

    - -
      -
    • Documents: -
        -
      • document#17 (link to document with id 17)
      • -
      • document:Greetings (link to the document with title "Greetings")
      • -
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • -
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • -
    • -
    - -
      -
    • Versions: -
        -
      • version#3 (link to version with id 3)
      • -
      • version:1.0.0 (link to version named "1.0.0")
      • -
      • version:"1.0 beta 2"
      • -
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • -
    • -
    - -
      -
    • Attachments: -
        -
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • -
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • -
    • -
    - -
      -
    • Changesets: -
        -
      • r758 (link to a changeset)
      • -
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • -
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • -
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • -
      • sandbox:r758 (link to a changeset of another project)
      • -
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • -
    • -
    - -
      -
    • Repository files: -
        -
      • source:some/file (link to the file located at /some/file in the project's repository)
      • -
      • source:some/file@52 (link to the file's revision 52)
      • -
      • source:some/file#L120 (link to line 120 of the file)
      • -
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • -
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • -
      • export:some/file (force the download of the file)
      • -
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • -
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • -
      • sandbox:export:some/file (force the download of the file)
      • -
    • -
    - -
      -
    • Forum messages: -
        -
      • message#1218 (link to message with id 1218)
      • -
    • -
    - -
      -
    • Projects: -
        -
      • project#3 (link to project with id 3)
      • -
      • project:someproject (link to project named "someproject")
      • -
    • -
    - - -

    Escaping:

    - -
      -
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • -
    - - -

    External links

    - -

    HTTP URLs and email addresses are automatically turned into clickable links:

    - -
    -http://www.redmine.org, someone@foo.bar
    -
    - -

    displays: http://www.redmine.org,

    - -

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    - -
    -"Redmine web site":http://www.redmine.org
    -
    - -

    displays: Redmine web site

    - - -

    Text formatting

    - - -

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    - -

    Font style

    - -
    -* *bold*
    -* _italic_
    -* _*bold italic*_
    -* +underline+
    -* -strike-through-
    -
    - -

    Display:

    - -
      -
    • bold
    • -
    • italic
    • -
    • *bold italic*
    • -
    • underline
    • -
    • strike-through
    • -
    - -

    Inline images

    - -
      -
    • !image_url! displays an image located at image_url (textile syntax)
    • -
    • !>image_url! right floating image
    • -
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • -
    - -

    Headings

    - -
    -h1. Heading
    -h2. Subheading
    -h3. Subsubheading
    -
    - -

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    - - -

    Paragraphs

    - -
    -p>. right aligned
    -p=. centered
    -
    - -

    This is a centered paragraph.

    - - -

    Blockquotes

    - -

    Start the paragraph with bq.

    - -
    -bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    -To go live, all you need to add is a database and a web server.
    -
    - -

    Display:

    - -
    -

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    -
    - - -

    Table of content

    - -
    -{{toc}} => left aligned toc
    -{{>toc}} => right aligned toc
    -
    - -

    Macros

    - -

    Redmine has the following builtin macros:

    - -

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    - -
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    - - -

    Code highlighting

    - -

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    - -

    You can highlight code in your wiki page using this syntax:

    - -
    -<pre><code class="ruby">
    -  Place you code here.
    -</code></pre>
    -
    - -

    Example:

    - -
     1 # The Greeter class
    - 2 class Greeter
    - 3   def initialize(name)
    - 4     @name = name.capitalize
    - 5   end
    - 6 
    - 7   def salute
    - 8     puts "Hello #{@name}!" 
    - 9   end
    -10 end
    -
    - - diff -Nru redmine-2.3.3/public/help/zh/wiki_syntax.html redmine-2.4.2/public/help/zh/wiki_syntax.html --- redmine-2.3.3/public/help/zh/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/zh/wiki_syntax.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki formatting + + + + +

    Wiki Syntax Quick Reference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Font Styles
    Strong*Strong*Strong
    Italic_Italic_Italic
    Underline+Underline+Underline
    Deleted-Deleted-Deleted
    ??Quote??Quote
    Inline Code@Inline Code@Inline Code
    Preformatted text<pre>
     lines
     of code
    </pre>
    +
    + lines
    + of code
    +
    +
    Lists
    Unordered list* Item 1
    * Item 2
    • Item 1
    • Item 2
    Ordered list# Item 1
    # Item 2
    1. Item 1
    2. Item 2
    Headings
    Heading 1h1. Title 1

    Title 1

    Heading 2h2. Title 2

    Title 2

    Heading 3h3. Title 3

    Title 3

    Links
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine links
    Link to a Wiki page[[Wiki page]]Wiki page
    Issue #12Issue #12
    Revision r43Revision r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    Inline images
    Image!image_url!
    !attached_image!
    + +

    More Information

    + + + diff -Nru redmine-2.3.3/public/help/zh/wiki_syntax_detailed.html redmine-2.4.2/public/help/zh/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/zh/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/zh/wiki_syntax_detailed.html 2013-12-23 08:48:41.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki formatting

    + +

    Links

    + +

    Redmine links

    + +

    Redmine allows hyperlinking between resources (issues, changesets, wiki pages...) from anywhere wiki formatting is used.

    +
      +
    • Link to an issue: #124 (displays #124, link is striked-through if the issue is closed)
    • +
    • Link to an issue note: #124-6, or #124#note-6
    • +
    + +

    Wiki links:

    + +
      +
    • [[Guide]] displays a link to the page named 'Guide': Guide
    • +
    • [[Guide#further-reading]] takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: Guide
    • +
    • [[Guide|User manual]] displays a link to the same page but with a different text: User manual
    • +
    + +

    You can also link to pages of an other project wiki:

    + +
      +
    • [[sandbox:some page]] displays a link to the page named 'Some page' of the Sandbox wiki
    • +
    • [[sandbox:]] displays a link to the Sandbox wiki main page
    • +
    + +

    Wiki links are displayed in red if the page doesn't exist yet, eg: Nonexistent page.

    + +

    Links to other resources:

    + +
      +
    • Documents: +
        +
      • document#17 (link to document with id 17)
      • +
      • document:Greetings (link to the document with title "Greetings")
      • +
      • document:"Some document" (double quotes can be used when document title contains spaces)
      • +
      • sandbox:document:"Some document" (link to a document with title "Some document" in other project "sandbox")
      • +
    • +
    + +
      +
    • Versions: +
        +
      • version#3 (link to version with id 3)
      • +
      • version:1.0.0 (link to version named "1.0.0")
      • +
      • version:"1.0 beta 2"
      • +
      • sandbox:version:1.0.0 (link to version "1.0.0" in the project "sandbox")
      • +
    • +
    + +
      +
    • Attachments: +
        +
      • attachment:file.zip (link to the attachment of the current object named file.zip)
      • +
      • For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)
      • +
    • +
    + +
      +
    • Changesets: +
        +
      • r758 (link to a changeset)
      • +
      • commit:c6f4d0fd (link to a changeset with a non-numeric hash)
      • +
      • svn1|r758 (link to a changeset of a specific repository, for projects with multiple repositories)
      • +
      • commit:hg|c6f4d0fd (link to a changeset with a non-numeric hash of a specific repository)
      • +
      • sandbox:r758 (link to a changeset of another project)
      • +
      • sandbox:commit:c6f4d0fd (link to a changeset with a non-numeric hash of another project)
      • +
    • +
    + +
      +
    • Repository files: +
        +
      • source:some/file (link to the file located at /some/file in the project's repository)
      • +
      • source:some/file@52 (link to the file's revision 52)
      • +
      • source:some/file#L120 (link to line 120 of the file)
      • +
      • source:some/file@52#L120 (link to line 120 of the file's revision 52)
      • +
      • source:"some file@52#L120" (use double quotes when the URL contains spaces
      • +
      • export:some/file (force the download of the file)
      • +
      • source:svn1|some/file (link to a file of a specific repository, for projects with multiple repositories)
      • +
      • sandbox:source:some/file (link to the file located at /some/file in the repository of the project "sandbox")
      • +
      • sandbox:export:some/file (force the download of the file)
      • +
    • +
    + +
      +
    • Forum messages: +
        +
      • message#1218 (link to message with id 1218)
      • +
    • +
    + +
      +
    • Projects: +
        +
      • project#3 (link to project with id 3)
      • +
      • project:someproject (link to project named "someproject")
      • +
    • +
    + + +

    Escaping:

    + +
      +
    • You can prevent Redmine links from being parsed by preceding them with an exclamation mark: !
    • +
    + + +

    External links

    + +

    HTTP URLs and email addresses are automatically turned into clickable links:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    displays: http://www.redmine.org,

    + +

    If you want to display a specific text instead of the URL, you can use the standard textile syntax:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    displays: Redmine web site

    + + +

    Text formatting

    + + +

    For things such as headlines, bold, tables, lists, Redmine supports Textile syntax. See http://en.wikipedia.org/wiki/Textile_(markup_language) for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.

    + +

    Font style

    + +
    +* *bold*
    +* _italic_
    +* _*bold italic*_
    +* +underline+
    +* -strike-through-
    +
    + +

    Display:

    + +
      +
    • bold
    • +
    • italic
    • +
    • bold italic
    • +
    • underline
    • +
    • strike-through
    • +
    + +

    Inline images

    + +
      +
    • !image_url! displays an image located at image_url (textile syntax)
    • +
    • !>image_url! right floating image
    • +
    • If you have an image attached to your wiki page, it can be displayed inline using its filename: !attached_image.png!
    • +
    + +

    Headings

    + +
    +h1. Heading
    +h2. Subheading
    +h3. Subsubheading
    +
    + +

    Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.

    + + +

    Paragraphs

    + +
    +p>. right aligned
    +p=. centered
    +
    + +

    This is a centered paragraph.

    + + +

    Blockquotes

    + +

    Start the paragraph with bq.

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    Display:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    Table of content

    + +
    +{{toc}} => left aligned toc
    +{{>toc}} => right aligned toc
    +
    + +

    Horizontal Rule

    + +
    +---
    +
    + +

    Macros

    + +

    Redmine has the following builtin macros:

    + +

    hello_world

    Sample macro.

    include

    Include a wiki page. Example:

    + +
    {{include(Foo)}}
    macro_list

    Displays a list of all available macros, including description if available.

    + + +

    Code highlighting

    + +

    Default code highlightment relies on CodeRay, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.

    + +

    You can highlight code in your wiki page using this syntax:

    + +
    +<pre><code class="ruby">
    +  Place you code here.
    +</code></pre>
    +
    + +

    Example:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + diff -Nru redmine-2.3.3/public/help/zh-tw/wiki_syntax.html redmine-2.4.2/public/help/zh-tw/wiki_syntax.html --- redmine-2.3.3/public/help/zh-tw/wiki_syntax.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/zh-tw/wiki_syntax.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + +Wiki 格式設定 + + + + +

    Wiki 語法快速對照表

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    字型樣式
    粗體(加強語氣)*粗體(加強語氣)*粗體(加強語氣)
    斜體_斜體_斜體
    底線+底線+底線
    刪除線-刪除線-刪除線
    ??引文??引文
    內嵌程式碼@內嵌程式碼@內嵌程式碼 (inline code)
    預先格式化的段落文字<pre>
     格式化
     的段落
    </pre>
    +
    + 格式化
    + 的段落
    +
    +
    清單
    不排序清單* 清單項目 1
    * 清單項目 2
    • 清單項目 1
    • 清單項目 2
    排序清單# 清單項目 1
    # 清單項目 2
    1. 清單項目 1
    2. 清單項目 2
    標題
    標題 1h1. 標題 1

    標題 1

    標題 2h2. 標題 2

    標題 2

    標題 3h3. 標題 3

    標題 3

    連結
    http://foo.barhttp://foo.bar
    "Foo":http://foo.barFoo
    Redmine 連結
    連結至一個 Wiki 頁面[[Wiki 頁面]]Wiki 頁面
    問題 #12問題 #12
    版次 r43版次 r43
    commit:f30e13e43f30e13e4
    source:some/filesource:some/file
    內置圖像
    圖像!圖像_url!
    !附加_圖像!
    + +

    更多資訊

    + + + diff -Nru redmine-2.3.3/public/help/zh-tw/wiki_syntax_detailed.html redmine-2.4.2/public/help/zh-tw/wiki_syntax_detailed.html --- redmine-2.3.3/public/help/zh-tw/wiki_syntax_detailed.html 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/help/zh-tw/wiki_syntax_detailed.html 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,287 @@ + + + +RedmineWikiFormatting + + + + + +

    Wiki 格式設定

    + +

    連結

    + +

    Redmine 連結

    + +

    在任何可以使用 Wiki 格式設定的地方, Redmine 都允許在資源(問題、變更集、 Wiki 頁面...)間建立超連結。

    +
      +
    • 連結至一個問題: #124 (若該問題已經結束,則使用刪除線顯示連結: #124)
    • +
    • 連結至一個問題的筆記: #124-6, or #124#note-6
    • +
    + +

    Wiki 連結:

    + +
      +
    • [[Guide]] 顯示一個頁面名稱為 'Guide' 的連結: Guide
    • +
    • [[Guide#further-reading]] 會連結至一個 "further-reading" 的 HTML 錨定 (anchor) 。每個標題文字都會被自動指定一個 HTML 錨定,以便您可以用來連結它們: Guide
    • +
    • [[Guide|User manual]] 使用不同的文字來顯示一個頁面名稱為 'Guide' 的連結: User manual
    • +
    + +

    您也可以連結至其他專案的 Wiki 頁面:

    + +
      +
    • [[sandbox:some page]] 顯示一個 Sanbox wiki 中頁面名稱為 'Some page' 的連結
    • +
    • [[sandbox:]] 顯示 Sandbox wiki 首頁頁面的連結
    • +
    + +

    當頁面不存在的時候, Wiki 連結會以紅色的方式顯示,例如: Nonexistent page.

    + +

    連結至其他資源:

    + +
      +
    • 文件: +
        +
      • document#17 (連結到編號為 17 的文件)
      • +
      • document:Greetings (連結至文件標題為 "Greetings" 的文件)
      • +
      • document:"Some document" (文件標題包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:document:"Some document" (連結至另外一個 "sandbox" 專案中,文件標題為 "Some document" 的文件)
      • +
    • +
    + +
      +
    • 版本: +
        +
      • version#3 (連結至編號為 3 的版本)
      • +
      • version:1.0.0 (連結至名稱為 "1.0.0" 的版本)
      • +
      • version:"1.0 beta 2" (版本名稱包含空白字元時可以使用雙引號來標示)
      • +
      • sandbox:version:1.0.0 (連結至 "sandbox" 專案中,名稱為 "1.0.0" 的版本)
      • +
    • +
    + +
      +
    • 附加檔案: +
        +
      • attachment:file.zip (連結至目前物件中,名稱為 file.zip 的附加檔案)
      • +
      • 目前僅提供參考到目前物件中的附加檔案 (若您正位於一個問題中,僅可參考位於此問題中之附加檔案)
      • +
    • +
    + +
      +
    • 變更集: +
        +
      • r758 (連結至一個變更集)
      • +
      • commit:c6f4d0fd (連結至一個使用非數字雜湊的變更集)
      • +
      • svn1|r758 (連結至指定儲存機制中之變更集,用於專案使用多個儲存機制時之情況)
      • +
      • commit:hg|c6f4d0fd (連結至指定儲存機制中,使用非數字雜湊的變更集)
      • +
      • sandbox:r758 (連結至其他專案的變更集)
      • +
      • sandbox:commit:c6f4d0fd (連結至其他專案中,使用非數字雜湊的變更集)
      • +
    • +
    + +
      +
    • 儲存機制中之檔案: +
        +
      • source:some/file (連結至專案儲存機制中,位於 /some/file 的檔案)
      • +
      • source:some/file@52 (連結至此檔案的 52 版次)
      • +
      • source:some/file#L120 (連結至此檔案的第 120 行)
      • +
      • source:some/file@52#L120 (連結至此檔案的 52 版刺中之第 120 行)
      • +
      • source:"some file@52#L120" (當 URL 中包含空白字元時,使用雙引號來標示)
      • +
      • export:some/file (強制下載此檔案)
      • +
      • source:svn1|some/file (連結至指定儲存機制中的此檔案,用於專案使用多個儲存機制時之情況)
      • +
      • sandbox:source:some/file (連結至 "sandbox" 專案的儲存機制中,位於 /some/file 的檔案)
      • +
      • sandbox:export:some/file (強迫下載該檔案)
      • +
    • +
    + +
      +
    • 論壇訊息: +
        +
      • message#1218 (連結至編號 1218 的訊息)
      • +
    • +
    + +
      +
    • 專案: +
        +
      • project#3 (連結至編號為 3 的專案)
      • +
      • project:someproject (連結至名稱為 "someproject" 的專案)
      • +
    • +
    + + +

    逸出字元:

    + +
      +
    • 您可以在文字的前面加上驚嘆號 (!) 來避免該文字被剖析成 Remine 連結
    • +
    + + +

    外部連結

    + +

    HTTP URLs 與電子郵件地址會自動被轉換成可被點擊的連結:

    + +
    +http://www.redmine.org, someone@foo.bar
    +
    + +

    顯示為: http://www.redmine.org,

    + +

    若您想要顯示指定的文字而非該 URL ,您可以使用下列標準的 textile 語法:

    + +
    +"Redmine web site":http://www.redmine.org
    +
    + +

    顯示為: Redmine web site

    + + +

    文字格式設定

    + + +

    對於諸如標題、粗體、表格、清單等項目, Redmine 支援使用 Textile 語法。可參考 http://en.wikipedia.org/wiki/Textile_(markup_language) 中關於使用這些格式化功能的說明資訊。 下面包含了一些使用範例,但格式化引擎的處理能力遠多於這些簡單的使用範例。

    + +

    字型樣式

    + +
    +* *粗體*
    +* _斜體_
    +* _*粗斜體*_
    +* +底線+
    +* -刪除線-
    +
    + +

    顯示為:

    + +
      +
    • 粗體
    • +
    • 斜體
    • +
    • 粗斜體
    • +
    • 底線
    • +
    • 刪除線
    • +
    + +

    內置圖像

    + +
      +
    • !圖像_url! 顯示一個位於 圖像_url 位址的圖像(textile 語法)
    • +
    • !>image_url! 右側浮動圖像
    • +
    • 若您附加了一個圖像到 Wiki 頁面中,可以使用他的檔案名稱來顯示成內置圖像: !attached_image.png!
    • +
    + +

    標題

    + +
    +h1. 標題
    +h2. 次標題
    +h3. 次次標題
    +
    + +

    Redmine 為每一種標題指定一個 HTML 錨定 (anchor) ,因此您可使用 "#Heading" 、 "#Subheading" 等方式連結至這些標題。

    + + +

    段落

    + +
    +p>. 靠右對齊
    +p=. 置中對齊
    +
    + +

    這是一個置中對齊的段落。

    + + +

    引用文字

    + +

    使用 bq. 開始一個引文的段落

    + +
    +bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    +To go live, all you need to add is a database and a web server.
    +
    + +

    顯示為:

    + +
    +

    Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.
    To go live, all you need to add is a database and a web server.

    +
    + + +

    目錄

    + +
    +{{toc}} => 靠左對齊目錄
    +{{>toc}} => 靠右對齊目錄
    +
    + +

    水平線

    + +
    +---
    +
    + +

    巨集

    + +

    Redmine 內建下列巨集:

    + +

    hello_world

    範例巨集。

    include

    引入一個 wiki 頁面。例子:

    + +
    {{include(Foo)}}
    macro_list

    顯示所有可用巨集的清單,若巨集有提供說明也會一併顯示。

    + + +

    程式碼醒目提示

    + +

    預設使用 CodeRay 作為程式碼醒目提示的機制,它是一個使用 Ruby 撰寫的語法醒目提示函式庫。它目前支援 c 、 cpp 、 css 、 delphi 、 groovy 、 html 、 java 、 javascript 、 json 、 php 、 python 、 rhtml 、 ruby 、 scheme 、 sql 、 xml 與 yaml 等程式語言。

    + +

    您可以使用下列語法,在 Wiki 頁面中將程式碼標示為醒目提示:

    + +
    +<pre><code class="ruby">
    +  將程式碼放在這裡。
    +</code></pre>
    +
    + +

    例子:

    + +
     1 # The Greeter class
    + 2 class Greeter
    + 3   def initialize(name)
    + 4     @name = name.capitalize
    + 5   end
    + 6
    + 7   def salute
    + 8     puts "Hello #{@name}!"
    + 9   end
    +10 end
    +
    + + Binary files /tmp/BU4BmpfHBH/redmine-2.3.3/public/images/document.png and /tmp/IRwx5QoZSL/redmine-2.4.2/public/images/document.png differ Binary files /tmp/BU4BmpfHBH/redmine-2.3.3/public/images/message.png and /tmp/IRwx5QoZSL/redmine-2.4.2/public/images/message.png differ Binary files /tmp/BU4BmpfHBH/redmine-2.3.3/public/images/wiki_edit.png and /tmp/IRwx5QoZSL/redmine-2.4.2/public/images/wiki_edit.png differ diff -Nru redmine-2.3.3/public/javascripts/application.js redmine-2.4.2/public/javascripts/application.js --- redmine-2.3.3/public/javascripts/application.js 2013-09-14 06:48:48.000000000 +0000 +++ redmine-2.4.2/public/javascripts/application.js 2013-12-23 08:48:42.000000000 +0000 @@ -2,11 +2,7 @@ Copyright (C) 2006-2013 Jean-Philippe Lang */ function checkAll(id, checked) { - if (checked) { - $('#'+id).find('input[type=checkbox]').attr('checked', true); - } else { - $('#'+id).find('input[type=checkbox]').removeAttr('checked'); - } + $('#'+id).find('input[type=checkbox]:enabled').attr('checked', checked); } function toggleCheckboxesBySelector(selector) { @@ -78,20 +74,20 @@ fieldset.children('div').hide(); } -function initFilters(){ - $('#add_filter_select').change(function(){ +function initFilters() { + $('#add_filter_select').change(function() { addFilter($(this).val(), '', []); }); - $('#filters-table td.field input[type=checkbox]').each(function(){ + $('#filters-table td.field input[type=checkbox]').each(function() { toggleFilter($(this).val()); }); - $('#filters-table td.field input[type=checkbox]').live('click',function(){ + $('#filters-table td.field input[type=checkbox]').live('click', function() { toggleFilter($(this).val()); }); - $('#filters-table .toggle-multiselect').live('click',function(){ + $('#filters-table .toggle-multiselect').live('click', function() { toggleMultiSelect($(this).siblings('select')); }); - $('#filters-table input[type=text]').live('keypress', function(e){ + $('#filters-table input[type=text]').live('keypress', function(e) { if (e.keyCode == 13) submit_query_form("query_form"); }); } @@ -106,7 +102,7 @@ } $('#cb_'+fieldId).attr('checked', true); toggleFilter(field); - $('#add_filter_select').val('').children('option').each(function(){ + $('#add_filter_select').val('').children('option').each(function() { if ($(this).attr('value') == field) { $(this).attr('disabled', true); } @@ -117,6 +113,7 @@ var fieldId = field.replace('.', '_'); var filterTable = $("#filters-table"); var filterOptions = availableFilters[field]; + if (!filterOptions) return; var operators = operatorByType[filterOptions['type']]; var filterValues = filterOptions['values']; var i, select; @@ -129,14 +126,14 @@ filterTable.append(tr); select = tr.find('td.operator select'); - for (i=0;i').val(operators[i]).text(operatorLabels[operators[i]]); if (operators[i] == operator) { option.attr('selected', true); } select.append(option); } select.change(function(){ toggleOperator(field); }); - switch (filterOptions['type']){ + switch (filterOptions['type']) { case "list": case "list_optional": case "list_status": @@ -147,7 +144,7 @@ ); select = tr.find('td.values select'); if (values.length > 1) { select.attr('multiple', true); } - for (i=0;i'); if ($.isArray(filterValue)) { @@ -185,7 +182,7 @@ ); $('#values_'+fieldId).val(values[0]); select = tr.find('td.values select'); - for (i=0;i'); option.val(filterValue[1]).text(filterValue[0]); @@ -280,8 +277,13 @@ function toggleMultiSelect(el) { if (el.attr('multiple')) { el.removeAttr('multiple'); + el.attr('size', 1); } else { el.attr('multiple', true); + if (el.children().length > 10) + el.attr('size', 10); + else + el.attr('size', 4); } } @@ -290,11 +292,16 @@ $('#'+id).submit(); } -function showTab(name) { +function showTab(name, url) { $('div#content .tab-content').hide(); $('div.tabs a').removeClass('selected'); $('#tab-content-' + name).show(); $('#tab-' + name).addClass('selected'); + //replaces current URL with the "href" attribute of the current link + //(only triggered if supported by browser) + if ("replaceState" in window.history) { + window.history.replaceState(null, document.title, url); + } return false; } @@ -302,7 +309,7 @@ var lis = $(el).parents('div.tabs').first().find('ul').children(); var tabsWidth = 0; var i = 0; - lis.each(function(){ + lis.each(function() { if ($(this).is(':visible')) { tabsWidth += $(this).width() + 6; } @@ -315,8 +322,8 @@ function moveTabLeft(el) { var lis = $(el).parents('div.tabs').first().find('ul').children(); var i = 0; - while (i0) { + while (i < lis.length && !lis.eq(i).is(':visible')) { i++; } + if (i > 0) { lis.eq(i-1).show(); } } @@ -406,7 +413,7 @@ } function scmEntryClick(id, url) { - el = $('#'+id); + var el = $('#'+id); if (el.hasClass('open')) { collapseScmEntry(id); el.addClass('collapsed'); @@ -422,7 +429,7 @@ el.addClass('loading'); $.ajax({ url: url, - success: function(data){ + success: function(data) { el.after(data); el.addClass('open').addClass('loaded').removeClass('loading'); } @@ -431,16 +438,18 @@ } function randomKey(size) { - var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; var key = ''; - for (i = 0; i < size; i++) { - key += chars[Math.floor(Math.random() * chars.length)]; + for (var i = 0; i < size; i++) { + key += chars.charAt(Math.floor(Math.random() * chars.length)); } return key; } -// Can't use Rails' remote select because we need the form data function updateIssueFrom(url) { + $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){ + $(this).data('valuebeforeupdate', $(this).val()); + }); $.ajax({ url: url, type: 'post', @@ -448,6 +457,18 @@ }); } +function replaceIssueFormWith(html){ + var replacement = $(html); + $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){ + var object_id = $(this).attr('id'); + if (object_id && $(this).data('valuebeforeupdate')!=$(this).val()) { + replacement.find('#'+object_id).val($(this).val()); + } + }); + $('#all_attributes').empty(); + $('#all_attributes').prepend(replacement); +} + function updateBulkEditFrom(url) { $.ajax({ url: url, @@ -498,20 +519,6 @@ }); } -function observeProjectModules() { - var f = function() { - /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */ - if ($('#project_enabled_module_names_issue_tracking').attr('checked')) { - $('#project_trackers').show(); - }else{ - $('#project_trackers').hide(); - } - }; - - $(window).load(f); - $('#project_enabled_module_names_issue_tracking').change(f); -} - function initMyPageSortable(list, url) { $('#list-'+list).sortable({ connectWith: '.block-receiver', @@ -530,11 +537,10 @@ var warnLeavingUnsavedMessage; function warnLeavingUnsaved(message) { warnLeavingUnsavedMessage = message; - - $('form').submit(function(){ + $('form').live('submit', function(){ $('textarea').removeData('changed'); }); - $('textarea').change(function(){ + $('textarea').live('change', function(){ $(this).data('changed', 'changed'); }); window.onbeforeunload = function(){ @@ -549,14 +555,11 @@ } function setupAjaxIndicator() { - $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) { - if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') { $('#ajax-indicator').show(); } }); - $('#ajax-indicator').bind('ajaxStop', function() { $('#ajax-indicator').hide(); }); diff -Nru redmine-2.3.3/public/javascripts/attachments.js redmine-2.4.2/public/javascripts/attachments.js --- redmine-2.3.3/public/javascripts/attachments.js 2013-09-14 06:48:48.000000000 +0000 +++ redmine-2.4.2/public/javascripts/attachments.js 2013-12-23 08:48:42.000000000 +0000 @@ -141,7 +141,7 @@ var sizeExceeded = false; $.each(files, function() { - if (this.size && maxFileSize && this.size > parseInt(maxFileSize)) {sizeExceeded=true;} + if (this.size && maxFileSize != null && this.size > parseInt(maxFileSize)) {sizeExceeded=true;} }); if (sizeExceeded) { window.alert(maxFileSizeExceeded); diff -Nru redmine-2.3.3/public/javascripts/datepicker.js redmine-2.4.2/public/javascripts/datepicker.js --- redmine-2.3.3/public/javascripts/datepicker.js 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/public/javascripts/datepicker.js 2013-12-23 08:48:42.000000000 +0000 @@ -0,0 +1,16 @@ +function beforeShowDatePicker(input, inst) { + var default_date = null; + switch ($(input).attr("id")) { + case "issue_start_date" : + if ($("#issue_due_date").size() > 0) { + default_date = $("#issue_due_date").val(); + } + break; + case "issue_due_date" : + if ($("#issue_start_date").size() > 0) { + default_date = $("#issue_start_date").val(); + } + break; + } + $(input).datepicker("option", "defaultDate", default_date); +} diff -Nru redmine-2.3.3/public/javascripts/gantt.js redmine-2.4.2/public/javascripts/gantt.js --- redmine-2.3.3/public/javascripts/gantt.js 2013-09-14 06:48:48.000000000 +0000 +++ redmine-2.4.2/public/javascripts/gantt.js 2013-12-23 08:48:42.000000000 +0000 @@ -167,6 +167,6 @@ setDrawArea(); if ($("#draw_progress_line").attr('checked')) drawGanttProgressLines(); - if ($("#draw_rels").attr('checked')) + if ($("#draw_relations").attr('checked')) drawRelations(); } diff -Nru redmine-2.3.3/public/javascripts/i18n/jquery.ui.datepicker-de.js redmine-2.4.2/public/javascripts/i18n/jquery.ui.datepicker-de.js --- redmine-2.3.3/public/javascripts/i18n/jquery.ui.datepicker-de.js 2013-09-14 06:48:47.000000000 +0000 +++ redmine-2.4.2/public/javascripts/i18n/jquery.ui.datepicker-de.js 2013-12-23 08:48:42.000000000 +0000 @@ -2,10 +2,10 @@ /* Written by Milian Wolff (mail@milianw.de). */ jQuery(function($){ $.datepicker.regional['de'] = { - closeText: 'schließen', - prevText: '<zurück', - nextText: 'Vor>', - currentText: 'heute', + closeText: 'Schließen', + prevText: '<Zurück', + nextText: 'Vor>', + currentText: 'Heute', monthNames: ['Januar','Februar','März','April','Mai','Juni', 'Juli','August','September','Oktober','November','Dezember'], monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', diff -Nru redmine-2.3.3/public/javascripts/i18n/jquery.ui.datepicker-lt.js redmine-2.4.2/public/javascripts/i18n/jquery.ui.datepicker-lt.js --- redmine-2.3.3/public/javascripts/i18n/jquery.ui.datepicker-lt.js 2013-09-14 06:48:47.000000000 +0000 +++ redmine-2.4.2/public/javascripts/i18n/jquery.ui.datepicker-lt.js 2013-12-23 08:48:42.000000000 +0000 @@ -3,8 +3,8 @@ jQuery(function($){ $.datepicker.regional['lt'] = { closeText: 'Uždaryti', - prevText: '<Atgal', - nextText: 'Pirmyn>', + prevText: '<Atgal', + nextText: 'Pirmyn>', currentText: 'Šiandien', monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'], @@ -13,11 +13,11 @@ dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'], dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'], dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'], - weekHeader: 'Wk', + weekHeader: 'SAV', dateFormat: 'yy-mm-dd', firstDay: 1, isRTL: false, - showMonthAfterYear: false, + showMonthAfterYear: true, yearSuffix: ''}; $.datepicker.setDefaults($.datepicker.regional['lt']); -}); \ No newline at end of file +}); diff -Nru redmine-2.3.3/public/javascripts/jstoolbar/lang/jstoolbar-sk.js redmine-2.4.2/public/javascripts/jstoolbar/lang/jstoolbar-sk.js --- redmine-2.3.3/public/javascripts/jstoolbar/lang/jstoolbar-sk.js 2013-09-14 06:48:48.000000000 +0000 +++ redmine-2.4.2/public/javascripts/jstoolbar/lang/jstoolbar-sk.js 2013-12-23 08:48:42.000000000 +0000 @@ -4,13 +4,13 @@ jsToolBar.strings['Underline'] = 'Podčiarknuté'; jsToolBar.strings['Deleted'] = 'Preškrtnuté'; jsToolBar.strings['Code'] = 'Zobrazenie kódu'; -jsToolBar.strings['Heading 1'] = 'Záhlavie 1'; -jsToolBar.strings['Heading 2'] = 'Záhlavie 2'; -jsToolBar.strings['Heading 3'] = 'Záhlavie 3'; -jsToolBar.strings['Unordered list'] = 'Zoznam'; -jsToolBar.strings['Ordered list'] = 'Zoradený zoznam'; -jsToolBar.strings['Quote'] = 'Citácia'; -jsToolBar.strings['Unquote'] = 'Odstránenie citácie'; +jsToolBar.strings['Heading 1'] = 'Nadpis 1'; +jsToolBar.strings['Heading 2'] = 'Nadpis 2'; +jsToolBar.strings['Heading 3'] = 'Nadpis 3'; +jsToolBar.strings['Unordered list'] = 'Odrážkový zoznam'; +jsToolBar.strings['Ordered list'] = 'Číslovaný zoznam'; +jsToolBar.strings['Quote'] = 'Odsadenie'; +jsToolBar.strings['Unquote'] = 'Zrušiť odsadenie'; jsToolBar.strings['Preformatted text'] = 'Predformátovaný text'; -jsToolBar.strings['Wiki link'] = 'Link na Wiki stránku'; +jsToolBar.strings['Wiki link'] = 'Odkaz na wikistránku'; jsToolBar.strings['Image'] = 'Obrázok'; diff -Nru redmine-2.3.3/public/javascripts/select_list_move.js redmine-2.4.2/public/javascripts/select_list_move.js --- redmine-2.3.3/public/javascripts/select_list_move.js 2013-09-14 06:48:48.000000000 +0000 +++ redmine-2.4.2/public/javascripts/select_list_move.js 2013-12-23 08:48:42.000000000 +0000 @@ -1,14 +1,12 @@ var NS4 = (navigator.appName == "Netscape" && parseInt(navigator.appVersion) < 5); -function addOption(theSel, theText, theValue) -{ +function addOption(theSel, theText, theValue) { var newOpt = new Option(theText, theValue); var selLength = theSel.length; theSel.options[selLength] = newOpt; } -function swapOptions(theSel, index1, index2) -{ +function swapOptions(theSel, index1, index2) { var text, value; text = theSel.options[index1].text; value = theSel.options[index1].value; @@ -18,42 +16,31 @@ theSel.options[index2].value = value; } -function deleteOption(theSel, theIndex) -{ +function deleteOption(theSel, theIndex) { var selLength = theSel.length; - if(selLength>0) - { + if (selLength > 0) { theSel.options[theIndex] = null; } } -function moveOptions(theSelFrom, theSelTo) -{ - +function moveOptions(theSelFrom, theSelTo) { var selLength = theSelFrom.length; var selectedText = new Array(); var selectedValues = new Array(); var selectedCount = 0; - var i; - - for(i=selLength-1; i>=0; i--) - { - if(theSelFrom.options[i].selected) - { + for (i = selLength - 1; i >= 0; i--) { + if (theSelFrom.options[i].selected) { selectedText[selectedCount] = theSelFrom.options[i].text; selectedValues[selectedCount] = theSelFrom.options[i].value; deleteOption(theSelFrom, i); selectedCount++; } } - - for(i=selectedCount-1; i>=0; i--) - { + for (i = selectedCount - 1; i >= 0; i--) { addOption(theSelTo, selectedText[i], selectedValues[i]); } - - if(NS4) history.go(0); + if (NS4) history.go(0); } function moveOptionUp(theSel) { @@ -73,11 +60,7 @@ } // OK -function selectAllOptions(id) -{ - var select = $('#'+id);/* - for (var i=0; iul, #tracker_project_ids>ul, #custom_field_project_ids>ul {max-height:250px; overflow-y:auto;} #related-issues li img {vertical-align:middle;} @@ -567,6 +571,8 @@ #tab-content-members fieldset label, #tab-content-memberships fieldset label, #tab-content-users fieldset label {display: block;} #tab-content-members #principals, #tab-content-users #principals {max-height: 400px; overflow: auto;} +#tab-content-memberships .splitcontentright select {width:90%} + #users_for_watcher {height: 200px; overflow:auto;} #users_for_watcher label {display: block;} @@ -582,6 +588,8 @@ background-image: url(../images/loading.gif); } +.role-visibility {padding-left:2em;} + /***** Flash & error messages ****/ #errorExplanation, div.flash, .nodata, .warning, .conflict { padding: 4px 4px 4px 30px; @@ -1035,6 +1043,10 @@ .hascontextmenu { cursor: context-menu; } +/* Custom JQuery styles */ +.ui-datepicker-title select {width:70px !important; margin-top:-2px !important; margin-right:4px !important;} + + /************* CodeRay styles *************/ .syntaxhl div {display: inline;} .syntaxhl .line-numbers {padding: 2px 4px 2px 4px; background-color: #eee; margin:0px 5px 0px 0px;} diff -Nru redmine-2.3.3/public/stylesheets/scm.css redmine-2.4.2/public/stylesheets/scm.css --- redmine-2.3.3/public/stylesheets/scm.css 2013-09-14 06:48:49.000000000 +0000 +++ redmine-2.4.2/public/stylesheets/scm.css 2013-12-23 08:48:42.000000000 +0000 @@ -64,6 +64,9 @@ font-family:"Liberation Mono", Courier, monospace; font-size:12px; } +table.filecontent tr:target th.line-num { background-color:#E0E0E0; color: #777; } +table.filecontent tr:target td.line-code { background-color:#DDEEFF; } + /* 12 different colors for the annonate view */ table.annotate tr.bloc-0 {background: #FFFFBF;} table.annotate tr.bloc-1 {background: #EABFFF;} diff -Nru redmine-2.3.3/test/fixtures/custom_fields_trackers.yml redmine-2.4.2/test/fixtures/custom_fields_trackers.yml --- redmine-2.3.3/test/fixtures/custom_fields_trackers.yml 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/fixtures/custom_fields_trackers.yml 2013-12-23 08:48:37.000000000 +0000 @@ -17,3 +17,12 @@ custom_fields_trackers_006: custom_field_id: 6 tracker_id: 3 +custom_fields_trackers_007: + custom_field_id: 8 + tracker_id: 1 +custom_fields_trackers_008: + custom_field_id: 8 + tracker_id: 2 +custom_fields_trackers_009: + custom_field_id: 8 + tracker_id: 3 diff -Nru redmine-2.3.3/test/fixtures/mail_handler/multiple_text_parts.eml redmine-2.4.2/test/fixtures/mail_handler/multiple_text_parts.eml --- redmine-2.3.3/test/fixtures/mail_handler/multiple_text_parts.eml 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/fixtures/mail_handler/multiple_text_parts.eml 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,62 @@ +From JSmith@somenet.foo Fri Mar 22 08:30:28 2013 +From: John Smith +Content-Type: multipart/mixed; boundary="Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9" +Message-Id: +Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) +Subject: Test with multiple text parts +Date: Fri, 22 Mar 2013 17:30:20 +0200 +To: redmine@somenet.foo +X-Mailer: Apple Mail (2.1503) + + + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=us-ascii + +The first text part. + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Disposition: inline; + filename=1st.pdf +Content-Type: application/pdf; + x-unix-mode=0644; + name="1st.pdf" +Content-Transfer-Encoding: base64 + +JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=us-ascii + +The second text part. + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Disposition: inline; + filename=2nd.pdf +Content-Type: application/pdf; + x-unix-mode=0644; + name="2nd.pdf" +Content-Transfer-Encoding: base64 + +JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G + + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=us-ascii + +The third one. + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset=us-ascii +Content-Disposition: attachment; filename="textfile.txt" + +Plain text attachment + +--Apple-Mail=_33C8180A-B097-4B87-A925-441300BDB9C9-- diff -Nru redmine-2.3.3/test/fixtures/queries.yml redmine-2.4.2/test/fixtures/queries.yml --- redmine-2.3.3/test/fixtures/queries.yml 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/fixtures/queries.yml 2013-12-23 08:48:37.000000000 +0000 @@ -3,7 +3,7 @@ id: 1 type: IssueQuery project_id: 1 - is_public: true + visibility: 2 name: Multiple custom fields query filters: | --- @@ -26,7 +26,7 @@ id: 2 type: IssueQuery project_id: 1 - is_public: false + visibility: 0 name: Private query for cookbook filters: | --- @@ -45,7 +45,7 @@ id: 3 type: IssueQuery project_id: - is_public: false + visibility: 0 name: Private query for all projects filters: | --- @@ -60,7 +60,7 @@ id: 4 type: IssueQuery project_id: - is_public: true + visibility: 2 name: Public query for all projects filters: | --- @@ -75,7 +75,7 @@ id: 5 type: IssueQuery project_id: - is_public: true + visibility: 2 name: Open issues by priority and tracker filters: | --- @@ -96,7 +96,7 @@ id: 6 type: IssueQuery project_id: - is_public: true + visibility: 2 name: Open issues grouped by tracker filters: | --- @@ -116,7 +116,7 @@ id: 7 type: IssueQuery project_id: 2 - is_public: true + visibility: 2 name: Public query for project 2 filters: | --- @@ -131,7 +131,7 @@ id: 8 type: IssueQuery project_id: 2 - is_public: false + visibility: 0 name: Private query for project 2 filters: | --- @@ -146,7 +146,7 @@ id: 9 type: IssueQuery project_id: - is_public: true + visibility: 2 name: Open issues grouped by list custom field filters: | --- Binary files /tmp/BU4BmpfHBH/redmine-2.3.3/test/fixtures/repositories/bazaar_repository.tar.gz and /tmp/IRwx5QoZSL/redmine-2.4.2/test/fixtures/repositories/bazaar_repository.tar.gz differ diff -Nru redmine-2.3.3/test/fixtures/repositories.yml redmine-2.4.2/test/fixtures/repositories.yml --- redmine-2.3.3/test/fixtures/repositories.yml 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/fixtures/repositories.yml 2013-12-23 08:48:37.000000000 +0000 @@ -8,6 +8,7 @@ login: "" type: Repository::Subversion is_default: true + created_on: 2006-07-19 19:04:21 +02:00 repositories_002: project_id: 2 url: svn://localhost/test @@ -17,3 +18,4 @@ login: "" type: Repository::Subversion is_default: true + created_on: 2006-07-19 19:04:21 +02:00 diff -Nru redmine-2.3.3/test/functional/account_controller_openid_test.rb redmine-2.4.2/test/functional/account_controller_openid_test.rb --- redmine-2.3.3/test/functional/account_controller_openid_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/account_controller_openid_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -40,17 +40,17 @@ :identity_url => 'http://openid.example.com/good_user') existing_user.login = 'cool_user' assert existing_user.save! - + post :login, :openid_url => existing_user.identity_url assert_redirected_to '/my/page' end - + def test_login_with_invalid_openid_provider Setting.self_registration = '0' post :login, :openid_url => 'http;//openid.example.com/good_user' assert_redirected_to home_url end - + def test_login_with_openid_for_existing_non_active_user Setting.self_registration = '2' existing_user = User.new(:firstname => 'Cool', @@ -60,11 +60,11 @@ :status => User::STATUS_REGISTERED) existing_user.login = 'cool_user' assert existing_user.save! - + post :login, :openid_url => existing_user.identity_url assert_redirected_to '/login' end - + def test_login_with_openid_with_new_user_created Setting.self_registration = '3' post :login, :openid_url => 'http://openid.example.com/good_user' @@ -74,7 +74,7 @@ assert_equal 'Cool', user.firstname assert_equal 'User', user.lastname end - + def test_login_with_openid_with_new_user_and_self_registration_off Setting.self_registration = '0' post :login, :openid_url => 'http://openid.example.com/good_user' @@ -82,18 +82,18 @@ user = User.find_by_login('cool_user') assert_nil user end - + def test_login_with_openid_with_new_user_created_with_email_activation_should_have_a_token Setting.self_registration = '1' post :login, :openid_url => 'http://openid.example.com/good_user' assert_redirected_to '/login' user = User.find_by_login('cool_user') assert user - + token = Token.find_by_user_id_and_action(user.id, 'register') assert token end - + def test_login_with_openid_with_new_user_created_with_manual_activation Setting.self_registration = '2' post :login, :openid_url => 'http://openid.example.com/good_user' @@ -102,23 +102,23 @@ assert user assert_equal User::STATUS_REGISTERED, user.status end - + def test_login_with_openid_with_new_user_with_conflict_should_register Setting.self_registration = '3' existing_user = User.new(:firstname => 'Cool', :lastname => 'User', :mail => 'user@somedomain.com') existing_user.login = 'cool_user' assert existing_user.save! - + post :login, :openid_url => 'http://openid.example.com/good_user' assert_response :success assert_template 'register' assert assigns(:user) assert_equal 'http://openid.example.com/good_user', assigns(:user)[:identity_url] end - + def test_login_with_openid_with_new_user_with_missing_information_should_register Setting.self_registration = '3' - + post :login, :openid_url => 'http://openid.example.com/good_blank_user' assert_response :success assert_template 'register' @@ -131,6 +131,16 @@ assert_select 'input[name=?][value=?]', 'user[identity_url]', 'http://openid.example.com/good_blank_user' end + def test_post_login_should_not_verify_token_when_using_open_id + ActionController::Base.allow_forgery_protection = true + AccountController.any_instance.stubs(:using_open_id?).returns(true) + AccountController.any_instance.stubs(:authenticate_with_open_id).returns(true) + post :login + assert_response 200 + ensure + ActionController::Base.allow_forgery_protection = false + end + def test_register_after_login_failure_should_not_require_user_to_enter_a_password Setting.self_registration = '3' diff -Nru redmine-2.3.3/test/functional/account_controller_test.rb redmine-2.4.2/test/functional/account_controller_test.rb --- redmine-2.3.3/test/functional/account_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/account_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -63,6 +63,36 @@ assert_select 'input[name=password][value]', 0 end + def test_login_with_locked_account_should_fail + User.find(2).update_attribute :status, User::STATUS_LOCKED + + post :login, :username => 'jsmith', :password => 'jsmith' + assert_redirected_to '/login' + assert_include 'locked', flash[:error] + assert_nil @request.session[:user_id] + end + + def test_login_as_registered_user_with_manual_activation_should_inform_user + User.find(2).update_attribute :status, User::STATUS_REGISTERED + + with_settings :self_registration => '2', :default_language => 'en' do + post :login, :username => 'jsmith', :password => 'jsmith' + assert_redirected_to '/login' + assert_include 'pending administrator approval', flash[:error] + end + end + + def test_login_as_registered_user_with_email_activation_should_propose_new_activation_email + User.find(2).update_attribute :status, User::STATUS_REGISTERED + + with_settings :self_registration => '1', :default_language => 'en' do + post :login, :username => 'jsmith', :password => 'jsmith' + assert_redirected_to '/login' + assert_equal 2, @request.session[:registered_user_id] + assert_include 'new activation email', flash[:error] + end + end + def test_login_should_rescue_auth_source_exception source = AuthSource.create!(:name => 'Test') User.find(2).update_attribute :auth_source_id, source.id @@ -89,6 +119,11 @@ assert_equal 2, @request.session[:user_id] end + def test_get_logout_with_anonymous_should_redirect + get :logout + assert_redirected_to '/' + end + def test_logout @request.session[:user_id] = 2 post :logout @@ -217,6 +252,15 @@ assert_no_difference 'Token.count' do post :lost_password, :mail => 'JSmith@somenet.foo' + assert_redirected_to '/account/lost_password' + end + end + + def test_lost_password_for_user_who_cannot_change_password_should_fail + User.any_instance.stubs(:change_password_allowed?).returns(false) + + assert_no_difference 'Token.count' do + post :lost_password, :mail => 'JSmith@somenet.foo' assert_response :success end end @@ -274,4 +318,27 @@ post :lost_password, :token => "abcdef", :new_password => 'newpass', :new_password_confirmation => 'newpass' assert_redirected_to '/' end + + def test_activation_email_should_send_an_activation_email + User.find(2).update_attribute :status, User::STATUS_REGISTERED + @request.session[:registered_user_id] = 2 + + with_settings :self_registration => '1' do + assert_difference 'ActionMailer::Base.deliveries.size' do + get :activation_email + assert_redirected_to '/login' + end + end + end + + def test_activation_email_without_session_data_should_fail + User.find(2).update_attribute :status, User::STATUS_REGISTERED + + with_settings :self_registration => '1' do + assert_no_difference 'ActionMailer::Base.deliveries.size' do + get :activation_email + assert_redirected_to '/' + end + end + end end diff -Nru redmine-2.3.3/test/functional/boards_controller_test.rb redmine-2.4.2/test/functional/boards_controller_test.rb --- redmine-2.3.3/test/functional/boards_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/boards_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -117,7 +117,7 @@ assert_select 'select[name=?]', 'board[parent_id]' do assert_select 'option', (Project.find(1).boards.size + 1) - assert_select 'option[value=]', :text => '' + assert_select 'option[value=]', :text => ' ' assert_select 'option[value=1]', :text => 'Help' end end diff -Nru redmine-2.3.3/test/functional/calendars_controller_test.rb redmine-2.4.2/test/functional/calendars_controller_test.rb --- redmine-2.3.3/test/functional/calendars_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/calendars_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -34,7 +34,7 @@ end def test_show_should_run_custom_queries - @query = IssueQuery.create!(:name => 'Calendar', :is_public => true) + @query = IssueQuery.create!(:name => 'Calendar', :visibility => IssueQuery::VISIBILITY_PUBLIC) get :show, :query_id => @query.id assert_response :success diff -Nru redmine-2.3.3/test/functional/context_menus_controller_test.rb redmine-2.4.2/test/functional/context_menus_controller_test.rb --- redmine-2.3.3/test/functional/context_menus_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/context_menus_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -219,11 +219,9 @@ assert_select 'a', :text => 'eCookbook - Shared' end - def test_context_menu_issue_visibility - get :issues, :ids => [1, 4] - assert_response :success - assert_template 'context_menu' - assert_equal [1], assigns(:issues).collect(&:id) + def test_context_menu_with_issue_that_is_not_visible_should_fail + get :issues, :ids => [1, 4] # issue 4 is not visible + assert_response 302 end def test_should_respond_with_404_without_ids diff -Nru redmine-2.3.3/test/functional/custom_fields_controller_test.rb redmine-2.4.2/test/functional/custom_fields_controller_test.rb --- redmine-2.3.3/test/functional/custom_fields_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/custom_fields_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,7 @@ require File.expand_path('../../test_helper', __FILE__) class CustomFieldsControllerTest < ActionController::TestCase - fixtures :custom_fields, :custom_values, :trackers, :users + fixtures :custom_fields, :custom_values, :trackers, :users, :projects def setup @request.session[:user_id] = 1 @@ -52,10 +52,22 @@ assert_select 'option[value=user]', :text => 'User' assert_select 'option[value=version]', :text => 'Version' end + assert_select 'input[type=checkbox][name=?]', 'custom_field[project_ids][]', Project.count + assert_select 'input[type=hidden][name=?]', 'custom_field[project_ids][]', 1 assert_select 'input[type=hidden][name=type][value=IssueCustomField]' end end + def test_new_time_entry_custom_field_should_not_show_trackers_and_projects + get :new, :type => 'TimeEntryCustomField' + assert_response :success + assert_template 'new' + assert_select 'form#custom_field_form' do + assert_select 'input[name=?]', 'custom_field[tracker_ids][]', 0 + assert_select 'input[name=?]', 'custom_field[project_ids][]', 0 + end + end + def test_default_value_should_be_an_input_for_string_custom_field get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'string'} assert_response :success @@ -118,6 +130,17 @@ assert_equal 1, field.trackers.size end + def test_create_with_project_ids + assert_difference 'CustomField.count' do + post :create, :type => "IssueCustomField", :custom_field => { + :name => "foo", :field_format => "string", :is_for_all => "0", :project_ids => ["1", "3", ""] + } + assert_response 302 + end + field = IssueCustomField.order("id desc").first + assert_equal [1, 3], field.projects.map(&:id).sort + end + def test_create_with_failure assert_no_difference 'CustomField.count' do post :create, :type => "IssueCustomField", :custom_field => {:name => ''} @@ -153,7 +176,7 @@ end def test_destroy - custom_values_count = CustomValue.count(:conditions => {:custom_field_id => 1}) + custom_values_count = CustomValue.where(:custom_field_id => 1).count assert custom_values_count > 0 assert_difference 'CustomField.count', -1 do diff -Nru redmine-2.3.3/test/functional/gantts_controller_test.rb redmine-2.4.2/test/functional/gantts_controller_test.rb --- redmine-2.3.3/test/functional/gantts_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/gantts_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -82,8 +82,8 @@ def test_gantt_should_display_relations IssueRelation.delete_all - issue1 = Issue.generate!(:start_date => 1.day.from_now, :due_date => 3.day.from_now) - issue2 = Issue.generate!(:start_date => 1.day.from_now, :due_date => 3.day.from_now) + issue1 = Issue.generate!(:start_date => 1.day.from_now.to_date, :due_date => 3.day.from_now.to_date) + issue2 = Issue.generate!(:start_date => 1.day.from_now.to_date, :due_date => 3.day.from_now.to_date) IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => 'precedes') get :show diff -Nru redmine-2.3.3/test/functional/issue_relations_controller_test.rb redmine-2.4.2/test/functional/issue_relations_controller_test.rb --- redmine-2.3.3/test/functional/issue_relations_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/issue_relations_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -109,8 +109,6 @@ end end - should "prevent relation creation when there's a circular dependency" - def test_create_xhr_with_failure assert_no_difference 'IssueRelation.count' do xhr :post, :create, :issue_id => 3, :relation => {:issue_to_id => '999', :relation_type => 'relates', :delay => ''} diff -Nru redmine-2.3.3/test/functional/issues_controller_test.rb redmine-2.4.2/test/functional/issues_controller_test.rb --- redmine-2.3.3/test/functional/issues_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/issues_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -293,7 +293,7 @@ end end - def test_index_with_query_grouped_by_tracker + def test_index_with_query_grouped_by_tracker_in_normal_order 3.times {|i| Issue.generate!(:tracker_id => (i + 1))} get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc' @@ -327,7 +327,7 @@ end def test_index_with_cross_project_query_in_session_should_show_project_issues - q = IssueQuery.create!(:name => "test", :user_id => 2, :is_public => false, :project => nil) + q = IssueQuery.create!(:name => "test", :user_id => 2, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil) @request.session[:query] = {:id => q.id, :project_id => 1} with_settings :display_subprojects_issues => '0' do @@ -341,7 +341,7 @@ end def test_private_query_should_not_be_available_to_other_users - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil) + q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil) @request.session[:user_id] = 3 get :index, :query_id => q.id @@ -349,7 +349,7 @@ end def test_private_query_should_be_available_to_its_user - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil) + q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil) @request.session[:user_id] = 2 get :index, :query_id => q.id @@ -357,7 +357,7 @@ end def test_public_query_should_be_available_to_other_users - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil) + q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil) @request.session[:user_id] = 3 get :index, :query_id => q.id @@ -773,18 +773,14 @@ def test_index_with_date_column with_settings :date_format => '%d/%m/%Y' do Issue.find(1).update_attribute :start_date, '1987-08-24' - get :index, :set_filter => 1, :c => %w(start_date) - assert_select "table.issues td.start_date", :text => '24/08/1987' end end def test_index_with_done_ratio_column Issue.find(1).update_attribute :done_ratio, 40 - get :index, :set_filter => 1, :c => %w(done_ratio) - assert_select 'table.issues td.done_ratio' do assert_select 'table.progress' do assert_select 'td.closed[style=?]', 'width: 40%;' @@ -794,20 +790,17 @@ def test_index_with_spent_hours_column get :index, :set_filter => 1, :c => %w(subject spent_hours) - assert_select 'table.issues tr#issue-3 td.spent_hours', :text => '1.00' end def test_index_should_not_show_spent_hours_column_without_permission Role.anonymous.remove_permission! :view_time_entries get :index, :set_filter => 1, :c => %w(subject spent_hours) - assert_select 'td.spent_hours', 0 end def test_index_with_fixed_version_column get :index, :set_filter => 1, :c => %w(fixed_version) - assert_select 'table.issues td.fixed_version' do assert_select 'a[href=?]', '/versions/2', :text => '1.0' end @@ -877,9 +870,7 @@ assert_response :success assert_template 'show' assert_equal Issue.find(1), assigns(:issue) - assert_select 'div.issue div.description', :text => /Unable to print recipes/ - # anonymous role is allowed to add a note assert_select 'form#issue-form' do assert_select 'fieldset' do @@ -887,7 +878,6 @@ assert_select 'textarea[name=?]', 'issue[notes]' end end - assert_select 'title', :text => "Bug #1: Can't print recipes - eCookbook - Redmine" end @@ -895,9 +885,7 @@ @request.session[:user_id] = 2 get :show, :id => 1 assert_response :success - assert_select 'a', :text => /Quote/ - assert_select 'form#issue-form' do assert_select 'fieldset' do assert_select 'legend', :text => 'Change properties' @@ -1163,7 +1151,7 @@ end def test_show_should_display_prev_next_links_with_saved_query_in_session - query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1, + query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1, :filters => {'status_id' => {:values => ['5'], :operator => '='}}, :sort_criteria => [['id', 'asc']]) @request.session[:query] = {:id => query.id, :project_id => nil} @@ -1255,7 +1243,7 @@ CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3') CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '') - query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1, :filters => {}, + query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1, :filters => {}, :sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']]) @request.session[:query] = {:id => query.id, :project_id => nil} @@ -1574,26 +1562,25 @@ end def test_get_new_without_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 0 - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?][value]', 'issue[start_date]', 0 + with_settings :default_issue_start_date_to_creation_date => 0 do + @request.session[:user_id] = 2 + get :new, :project_id => 1, :tracker_id => 1 + assert_response :success + assert_template 'new' + assert_select 'input[name=?]', 'issue[start_date]' + assert_select 'input[name=?][value]', 'issue[start_date]', 0 + end end def test_get_new_with_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 1 - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'input[name=?][value=?]', 'issue[start_date]', Date.today.to_s + with_settings :default_issue_start_date_to_creation_date => 1 do + @request.session[:user_id] = 2 + get :new, :project_id => 1, :tracker_id => 1 + assert_response :success + assert_template 'new' + assert_select 'input[name=?][value=?]', 'issue[start_date]', + Date.today.to_s + end end def test_get_new_form_should_allow_attachment_upload @@ -1780,11 +1767,10 @@ end def test_post_create_without_start_date_and_default_start_date_is_not_creation_date - Setting.default_issue_start_date_to_creation_date = 0 - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, + with_settings :default_issue_start_date_to_creation_date => 0 do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + post :create, :project_id => 1, :issue => {:tracker_id => 3, :status_id => 2, :subject => 'This is the test_new issue', @@ -1792,20 +1778,20 @@ :priority_id => 5, :estimated_hours => '', :custom_field_values => {'2' => 'Value for field 2'}} + end + assert_redirected_to :controller => 'issues', :action => 'show', + :id => Issue.last.id + issue = Issue.find_by_subject('This is the test_new issue') + assert_not_nil issue + assert_nil issue.start_date end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new issue') - assert_not_nil issue - assert_nil issue.start_date end def test_post_create_without_start_date_and_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 1 - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, + with_settings :default_issue_start_date_to_creation_date => 1 do + @request.session[:user_id] = 2 + assert_difference 'Issue.count' do + post :create, :project_id => 1, :issue => {:tracker_id => 3, :status_id => 2, :subject => 'This is the test_new issue', @@ -1813,12 +1799,13 @@ :priority_id => 5, :estimated_hours => '', :custom_field_values => {'2' => 'Value for field 2'}} + end + assert_redirected_to :controller => 'issues', :action => 'show', + :id => Issue.last.id + issue = Issue.find_by_subject('This is the test_new issue') + assert_not_nil issue + assert_equal Date.today, issue.start_date end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new issue') - assert_not_nil issue - assert_equal Date.today, issue.start_date end def test_post_create_and_continue @@ -2172,6 +2159,25 @@ assert_equal 59, File.size(attachment.diskfile) end + def test_post_create_with_attachment_should_notify_with_attachments + ActionMailer::Base.deliveries.clear + set_tmp_attachments_directory + @request.session[:user_id] = 2 + + with_settings :host_name => 'mydomain.foo', :protocol => 'http' do + assert_difference 'Issue.count' do + post :create, :project_id => 1, + :issue => { :tracker_id => '1', :subject => 'With attachment' }, + :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} + end + end + + assert_not_nil ActionMailer::Base.deliveries.last + assert_select_email do + assert_select 'a[href^=?]', 'http://mydomain.foo/attachments/download', 'testfile.txt' + end + end + def test_post_create_with_failure_should_save_attachments set_tmp_attachments_directory @request.session[:user_id] = 2 @@ -2443,12 +2449,12 @@ issue = Issue.find(3) count = issue.attachments.count assert count > 0 - assert_difference 'Issue.count' do assert_difference 'Attachment.count', count do - assert_no_difference 'Journal.count' do + assert_difference 'Journal.count', 2 do post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'}, + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy with attachments'}, :copy_attachments => '1' end end @@ -2463,12 +2469,12 @@ issue = Issue.find(3) count = issue.attachments.count assert count > 0 - assert_difference 'Issue.count' do assert_no_difference 'Attachment.count' do - assert_no_difference 'Journal.count' do + assert_difference 'Journal.count', 2 do post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'} + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy with attachments'} end end end @@ -2481,14 +2487,16 @@ issue = Issue.find(3) count = issue.attachments.count assert count > 0 - assert_difference 'Issue.count' do assert_difference 'Attachment.count', count + 1 do - assert_no_difference 'Journal.count' do + assert_difference 'Journal.count', 2 do post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'}, + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy with attachments'}, :copy_attachments => '1', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} + :attachments => {'1' => + {'file' => uploaded_test_file('testfile.txt', 'text/plain'), + 'description' => 'test file'}} end end end @@ -2498,11 +2506,11 @@ def test_create_as_copy_should_add_relation_with_copied_issue @request.session[:user_id] = 2 - assert_difference 'Issue.count' do assert_difference 'IssueRelation.count' do post :create, :project_id => 1, :copy_from => 1, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy'} + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy'} end end copy = Issue.first(:order => 'id DESC') @@ -2513,11 +2521,11 @@ @request.session[:user_id] = 2 issue = Issue.generate_with_descendants! count = issue.descendants.count - - assert_difference 'Issue.count', count+1 do - assert_no_difference 'Journal.count' do + assert_difference 'Issue.count', count + 1 do + assert_difference 'Journal.count', (count + 1) * 2 do post :create, :project_id => 1, :copy_from => issue.id, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'}, + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy with subtasks'}, :copy_subtasks => '1' end end @@ -2529,11 +2537,11 @@ def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks @request.session[:user_id] = 2 issue = Issue.generate_with_descendants! - assert_difference 'Issue.count', 1 do - assert_no_difference 'Journal.count' do + assert_difference 'Journal.count', 2 do post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'} + :issue => {:project_id => '1', :tracker_id => '3', + :status_id => '1', :subject => 'Copy with subtasks'} end end copy = Issue.where(:parent_id => nil).first(:order => 'id DESC') @@ -2720,6 +2728,16 @@ assert_equal 'This is the test_new issue', issue.subject end + def test_update_form_should_propose_default_status_for_existing_issue + @request.session[:user_id] = 2 + WorkflowTransition.delete_all + WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3) + + xhr :put, :update_form, :project_id => 1, :id => 2 + assert_response :success + assert_equal [2,3], assigns(:allowed_statuses).map(&:id).sort + end + def test_put_update_without_custom_fields_param @request.session[:user_id] = 2 ActionMailer::Base.deliveries.clear @@ -3279,14 +3297,26 @@ end end + def test_bulk_edit_should_propose_to_clear_text_custom_fields + @request.session[:user_id] = 2 + get :bulk_edit, :ids => [1, 3] + assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', '__none__' + end + def test_bulk_edit_should_only_propose_statuses_allowed_for_all_issues WorkflowTransition.delete_all - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 1) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, + :old_status_id => 1, :new_status_id => 1) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, + :old_status_id => 1, :new_status_id => 3) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, + :old_status_id => 1, :new_status_id => 4) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, + :old_status_id => 2, :new_status_id => 1) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, + :old_status_id => 2, :new_status_id => 3) + WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, + :old_status_id => 2, :new_status_id => 5) @request.session[:user_id] = 2 get :bulk_edit, :ids => [1, 2] @@ -3475,12 +3505,11 @@ def test_bulk_update_parent_id IssueRelation.delete_all - @request.session[:user_id] = 2 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing parent', - :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'} - + :issue => {:priority_id => '', :assigned_to_id => '', + :status_id => '', :parent_issue_id => '2'} assert_response 302 parent = Issue.find(2) assert_equal parent.id, Issue.find(1).parent_id @@ -3588,13 +3617,44 @@ assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier end - def test_bulk_update_with_failure_should_set_flash + def test_bulk_update_with_all_failures_should_show_errors @request.session[:user_id] = 2 - Issue.update_all("subject = ''", "id = 2") # Make it invalid - post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6} + post :bulk_update, :ids => [1, 2], :issue => {:start_date => 'foo'} - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - assert_equal 'Failed to save 1 issue(s) on 2 selected: #2.', flash[:error] + assert_response :success + assert_template 'bulk_edit' + assert_select '#errorExplanation span', :text => 'Failed to save 2 issue(s) on 2 selected: #1, #2.' + assert_select '#errorExplanation ul li', :text => 'Start date is not a valid date: #1, #2' + + assert_equal [1, 2], assigns[:issues].map(&:id) + end + + def test_bulk_update_with_some_failures_should_show_errors + issue1 = Issue.generate!(:start_date => '2013-05-12') + issue2 = Issue.generate!(:start_date => '2013-05-15') + issue3 = Issue.generate! + @request.session[:user_id] = 2 + post :bulk_update, :ids => [issue1.id, issue2.id, issue3.id], + :issue => {:due_date => '2013-05-01'} + assert_response :success + assert_template 'bulk_edit' + assert_select '#errorExplanation span', + :text => "Failed to save 2 issue(s) on 3 selected: ##{issue1.id}, ##{issue2.id}." + assert_select '#errorExplanation ul li', + :text => "Due date must be greater than start date: ##{issue1.id}, ##{issue2.id}" + assert_equal [issue1.id, issue2.id], assigns[:issues].map(&:id) + end + + def test_bulk_update_with_failure_should_preserved_form_values + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2', :start_date => 'foo'} + + assert_response :success + assert_template 'bulk_edit' + assert_select 'select[name=?]', 'issue[tracker_id]' do + assert_select 'option[value=2][selected=selected]' + end + assert_select 'input[name=?][value=?]', 'issue[start_date]', 'foo' end def test_get_bulk_copy @@ -3628,10 +3688,13 @@ def test_bulk_copy_should_allow_not_changing_the_issue_attributes @request.session[:user_id] = 2 issues = [ - Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, :priority_id => 2, :subject => 'issue 1', :author_id => 1, :assigned_to_id => nil), - Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, :priority_id => 1, :subject => 'issue 2', :author_id => 2, :assigned_to_id => 3) + Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, + :priority_id => 2, :subject => 'issue 1', :author_id => 1, + :assigned_to_id => nil), + Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, + :priority_id => 1, :subject => 'issue 2', :author_id => 2, + :assigned_to_id => 3) ] - assert_difference 'Issue.count', issues.size do post :bulk_update, :ids => issues.map(&:id), :copy => '1', :issue => { @@ -3654,7 +3717,7 @@ def test_bulk_copy_should_allow_changing_the_issue_attributes # Fixes random test failure with Mysql - # where Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) + # where Issue.where(:project_id => 2).limit(2).order('id desc') # doesn't return the expected results Issue.delete_all("project_id=2") @@ -3669,7 +3732,7 @@ end end - copied_issues = Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) + copied_issues = Issue.where(:project_id => 2).limit(2).order('id desc').to_a assert_equal 2, copied_issues.size copied_issues.each do |issue| assert_equal 2, issue.project_id, "Project is incorrect" @@ -3690,11 +3753,10 @@ :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31' } end - issue = Issue.first(:order => 'id DESC') assert_equal 1, issue.journals.size journal = issue.journals.first - assert_equal 0, journal.details.size + assert_equal 1, journal.details.size assert_equal 'Copying one issue', journal.notes end @@ -3790,6 +3852,13 @@ assert_redirected_to :controller => 'issues', :action => 'show', :id => issue end + def test_bulk_copy_with_all_failures_should_display_errors + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :copy => '1', :issue => {:start_date => 'foo'} + + assert_response :success + end + def test_destroy_issue_with_no_time_entries assert_nil TimeEntry.find_by_issue_id(2) @request.session[:user_id] = 2 diff -Nru redmine-2.3.3/test/functional/issues_custom_fields_visibility_test.rb redmine-2.4.2/test/functional/issues_custom_fields_visibility_test.rb --- redmine-2.3.3/test/functional/issues_custom_fields_visibility_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/functional/issues_custom_fields_visibility_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,322 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class IssuesCustomFieldsVisibilityTest < ActionController::TestCase + tests IssuesController + fixtures :projects, + :users, + :roles, + :members, + :member_roles, + :issue_statuses, + :trackers, + :projects_trackers, + :enabled_modules, + :enumerations, + :workflows + + def setup + CustomField.delete_all + Issue.delete_all + field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all} + @fields = [] + @fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true))) + @fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2]))) + @fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3]))) + @issue = Issue.generate!( + :author_id => 1, + :project_id => 1, + :tracker_id => 1, + :custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'} + ) + + @user_with_role_on_other_project = User.generate! + User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3)) + + @users_to_test = { + User.find(1) => [@field1, @field2, @field3], + User.find(3) => [@field1, @field2], + @user_with_role_on_other_project => [@field1], # should see field1 only on Project 1 + User.generate! => [@field1], + User.anonymous => [@field1] + } + + Member.where(:project_id => 1).each do |member| + member.destroy unless @users_to_test.keys.include?(member.principal) + end + end + + def test_show_should_show_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :show, :id => @issue.id + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'td', {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name}" + else + assert_select 'td', {:text => "Value#{i}", :count => 0}, "User #{user.id} was able to view #{field.name}" + end + end + end + end + + def test_show_should_show_visible_custom_fields_only_in_api + @users_to_test.each do |user, fields| + with_settings :rest_api_enabled => '1' do + get :show, :id => @issue.id, :format => 'xml', :include => 'custom_fields', :key => user.api_key + end + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select "custom_field[id=#{field.id}] value", {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name} in API" + else + assert_select "custom_field[id=#{field.id}] value", {:text => "Value#{i}", :count => 0}, "User #{user.id} was not able to view #{field.name} in API" + end + end + end + end + + def test_show_should_show_visible_custom_fields_only_in_history + @issue.init_journal(User.find(1)) + @issue.custom_field_values = {@field1.id => 'NewValue0', @field2.id => 'NewValue1', @field3.id => 'NewValue2'} + @issue.save! + + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :show, :id => @issue.id + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'ul.details i', {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name} change" + else + assert_select 'ul.details i', {:text => "Value#{i}", :count => 0}, "User #{user.id} was able to view #{field.name} change" + end + end + end + end + + def test_show_should_show_visible_custom_fields_only_in_history_api + @issue.init_journal(User.find(1)) + @issue.custom_field_values = {@field1.id => 'NewValue0', @field2.id => 'NewValue1', @field3.id => 'NewValue2'} + @issue.save! + + @users_to_test.each do |user, fields| + with_settings :rest_api_enabled => '1' do + get :show, :id => @issue.id, :format => 'xml', :include => 'journals', :key => user.api_key + end + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'details old_value', {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name} change in API" + else + assert_select 'details old_value', {:text => "Value#{i}", :count => 0}, "User #{user.id} was able to view #{field.name} change in API" + end + end + end + end + + def test_edit_should_show_visible_custom_fields_only + Role.anonymous.add_permission! :edit_issues + + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :edit, :id => @issue.id + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'input[value=?]', "Value#{i}", 1, "User #{user.id} was not able to edit #{field.name}" + else + assert_select 'input[value=?]', "Value#{i}", 0, "User #{user.id} was able to edit #{field.name}" + end + end + end + end + + def test_update_should_update_visible_custom_fields_only + Role.anonymous.add_permission! :edit_issues + + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + put :update, :id => @issue.id, + :issue => {:custom_field_values => { + @field1.id.to_s => "User#{user.id}Value0", + @field2.id.to_s => "User#{user.id}Value1", + @field3.id.to_s => "User#{user.id}Value2", + }} + @issue.reload + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_equal "User#{user.id}Value#{i}", @issue.custom_field_value(field), "User #{user.id} was not able to update #{field.name}" + else + assert_not_equal "User#{user.id}Value#{i}", @issue.custom_field_value(field), "User #{user.id} was able to update #{field.name}" + end + end + end + end + + def test_index_should_show_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :index, :c => (["subject"] + @fields.map{|f| "cf_#{f.id}"}) + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'td', {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name}" + else + assert_select 'td', {:text => "Value#{i}", :count => 0}, "User #{user.id} was able to view #{field.name}" + end + end + end + end + + def test_index_as_csv_should_show_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :index, :c => (["subject"] + @fields.map{|f| "cf_#{f.id}"}), :format => 'csv' + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_include "Value#{i}", response.body, "User #{user.id} was not able to view #{field.name} in CSV" + else + assert_not_include "Value#{i}", response.body, "User #{user.id} was able to view #{field.name} in CSV" + end + end + end + end + + def test_index_with_partial_custom_field_visibility + Issue.delete_all + p1 = Project.generate! + p2 = Project.generate! + user = User.generate! + User.add_to_project(user, p1, Role.find_all_by_id(1,3)) + User.add_to_project(user, p2, Role.find_all_by_id(3)) + Issue.generate!(:project => p1, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueA'}) + Issue.generate!(:project => p2, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueB'}) + Issue.generate!(:project => p1, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueC'}) + + @request.session[:user_id] = user.id + get :index, :c => ["subject", "cf_#{@field2.id}"] + assert_select 'td', :text => 'ValueA' + assert_select 'td', :text => 'ValueB', :count => 0 + assert_select 'td', :text => 'ValueC' + + get :index, :sort => "cf_#{@field2.id}" + # ValueB is not visible to user and ignored while sorting + assert_equal %w(ValueB ValueA ValueC), assigns(:issues).map{|i| i.custom_field_value(@field2)} + + get :index, :set_filter => '1', "cf_#{@field2.id}" => '*' + assert_equal %w(ValueA ValueC), assigns(:issues).map{|i| i.custom_field_value(@field2)} + + CustomField.update_all(:field_format => 'list') + get :index, :group => "cf_#{@field2.id}" + assert_equal %w(ValueA ValueC), assigns(:issues).map{|i| i.custom_field_value(@field2)} + end + + def test_create_should_send_notifications_according_custom_fields_visibility + # anonymous user is never notified + users_to_test = @users_to_test.reject {|k,v| k.anonymous?} + + ActionMailer::Base.deliveries.clear + @request.session[:user_id] = 1 + with_settings :bcc_recipients => '1' do + assert_difference 'Issue.count' do + post :create, + :project_id => 1, + :issue => { + :tracker_id => 1, + :status_id => 1, + :subject => 'New issue', + :priority_id => 5, + :custom_field_values => {@field1.id.to_s => 'Value0', @field2.id.to_s => 'Value1', @field3.id.to_s => 'Value2'}, + :watcher_user_ids => users_to_test.keys.map(&:id) + } + assert_response 302 + end + end + assert_equal users_to_test.values.uniq.size, ActionMailer::Base.deliveries.size + # tests that each user receives 1 email with the custom fields he is allowed to see only + users_to_test.each do |user, fields| + mails = ActionMailer::Base.deliveries.select {|m| m.bcc.include? user.mail} + assert_equal 1, mails.size + mail = mails.first + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_mail_body_match "Value#{i}", mail, "User #{user.id} was not able to view #{field.name} in notification" + else + assert_mail_body_no_match "Value#{i}", mail, "User #{user.id} was able to view #{field.name} in notification" + end + end + end + end + + def test_update_should_send_notifications_according_custom_fields_visibility + # anonymous user is never notified + users_to_test = @users_to_test.reject {|k,v| k.anonymous?} + + users_to_test.keys.each do |user| + Watcher.create!(:user => user, :watchable => @issue) + end + ActionMailer::Base.deliveries.clear + @request.session[:user_id] = 1 + with_settings :bcc_recipients => '1' do + put :update, + :id => @issue.id, + :issue => { + :custom_field_values => {@field1.id.to_s => 'NewValue0', @field2.id.to_s => 'NewValue1', @field3.id.to_s => 'NewValue2'} + } + assert_response 302 + end + assert_equal users_to_test.values.uniq.size, ActionMailer::Base.deliveries.size + # tests that each user receives 1 email with the custom fields he is allowed to see only + users_to_test.each do |user, fields| + mails = ActionMailer::Base.deliveries.select {|m| m.bcc.include? user.mail} + assert_equal 1, mails.size + mail = mails.first + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_mail_body_match "Value#{i}", mail, "User #{user.id} was not able to view #{field.name} in notification" + else + assert_mail_body_no_match "Value#{i}", mail, "User #{user.id} was able to view #{field.name} in notification" + end + end + end + end + + def test_updating_hidden_custom_fields_only_should_not_notifiy_user + # anonymous user is never notified + users_to_test = @users_to_test.reject {|k,v| k.anonymous?} + + users_to_test.keys.each do |user| + Watcher.create!(:user => user, :watchable => @issue) + end + ActionMailer::Base.deliveries.clear + @request.session[:user_id] = 1 + with_settings :bcc_recipients => '1' do + put :update, + :id => @issue.id, + :issue => { + :custom_field_values => {@field2.id.to_s => 'NewValue1', @field3.id.to_s => 'NewValue2'} + } + assert_response 302 + end + users_to_test.each do |user, fields| + mails = ActionMailer::Base.deliveries.select {|m| m.bcc.include? user.mail} + if (fields & [@field2, @field3]).any? + assert_equal 1, mails.size, "User #{user.id} was not notified" + else + assert_equal 0, mails.size, "User #{user.id} was notified" + end + end + end +end diff -Nru redmine-2.3.3/test/functional/projects_controller_test.rb redmine-2.4.2/test/functional/projects_controller_test.rb --- redmine-2.3.3/test/functional/projects_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/projects_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -51,7 +51,7 @@ assert_response :success assert_template 'common/feed' assert_select 'feed>title', :text => 'Redmine: Latest projects' - assert_select 'feed>entry', :count => Project.count(:conditions => Project.visible_condition(User.current)) + assert_select 'feed>entry', :count => Project.visible(User.current).count end test "#index by non-admin user with view_time_entries permission should show overall spent time link" do @@ -320,6 +320,16 @@ assert_select 'li', :text => /Development status/ end + def test_show_should_not_display_empty_sidebar + p = Project.find(1) + p.enabled_module_names = [] + p.save! + + get :show, :id => 'ecookbook' + assert_response :success + assert_select '#main.nosidebar' + end + def test_show_should_not_display_hidden_custom_fields ProjectCustomField.find_by_name('Development status').update_attribute :visible, false get :show, :id => 'ecookbook' @@ -589,4 +599,9 @@ assert_response :success assert_template 'show' end + + def test_body_should_have_project_css_class + get :show, :id => 1 + assert_select 'body.project-ecookbook' + end end diff -Nru redmine-2.3.3/test/functional/queries_controller_test.rb redmine-2.4.2/test/functional/queries_controller_test.rb --- redmine-2.3.3/test/functional/queries_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/queries_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -35,9 +35,7 @@ get :new, :project_id => 1 assert_response :success assert_template 'new' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => nil } + assert_select 'input[name=?][value=0][checked=checked]', 'query[visibility]' assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => nil, @@ -53,8 +51,7 @@ get :new assert_response :success assert_template 'new' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } + assert_select 'input[name=?]', 'query[visibility]', 0 assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => 'checked', @@ -75,7 +72,7 @@ :f => ["status_id", "assigned_to_id"], :op => {"assigned_to_id" => "=", "status_id" => "o"}, :v => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_new_project_public_query", "is_public" => "1"} + :query => {"name" => "test_new_project_public_query", "visibility" => "2"} q = Query.find_by_name('test_new_project_public_query') assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q @@ -92,7 +89,7 @@ :fields => ["status_id", "assigned_to_id"], :operators => {"assigned_to_id" => "=", "status_id" => "o"}, :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_new_project_private_query", "is_public" => "1"} + :query => {"name" => "test_new_project_private_query", "visibility" => "2"} q = Query.find_by_name('test_new_project_private_query') assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q @@ -107,7 +104,7 @@ :fields => ["status_id", "assigned_to_id"], :operators => {"assigned_to_id" => "=", "status_id" => "o"}, :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]}, - :query => {"name" => "test_new_global_private_query", "is_public" => "1"}, + :query => {"name" => "test_new_global_private_query", "visibility" => "2"}, :c => ["", "tracker", "subject", "priority", "category"] q = Query.find_by_name('test_new_global_private_query') @@ -140,7 +137,7 @@ :operators => {"status_id" => "o"}, :values => {"status_id" => ["1"]}, :query => {:name => "test_new_with_sort", - :is_public => "1", + :visibility => "2", :sort_criteria => {"0" => ["due_date", "desc"], "1" => ["tracker", ""]}} query = Query.find_by_name("test_new_with_sort") @@ -158,14 +155,49 @@ assert_select 'input[name=?]', 'query[name]' end + def test_create_global_query_from_gantt + @request.session[:user_id] = 1 + assert_difference 'IssueQuery.count' do + post :create, + :gantt => 1, + :operators => {"status_id" => "o"}, + :values => {"status_id" => ["1"]}, + :query => {:name => "test_create_from_gantt", + :draw_relations => '1', + :draw_progress_line => '1'} + assert_response 302 + end + query = IssueQuery.order('id DESC').first + assert_redirected_to "/issues/gantt?query_id=#{query.id}" + assert_equal true, query.draw_relations + assert_equal true, query.draw_progress_line + end + + def test_create_project_query_from_gantt + @request.session[:user_id] = 1 + assert_difference 'IssueQuery.count' do + post :create, + :project_id => 'ecookbook', + :gantt => 1, + :operators => {"status_id" => "o"}, + :values => {"status_id" => ["1"]}, + :query => {:name => "test_create_from_gantt", + :draw_relations => '0', + :draw_progress_line => '0'} + assert_response 302 + end + query = IssueQuery.order('id DESC').first + assert_redirected_to "/projects/ecookbook/issues/gantt?query_id=#{query.id}" + assert_equal false, query.draw_relations + assert_equal false, query.draw_progress_line + end + def test_edit_global_public_query @request.session[:user_id] = 1 get :edit, :id => 4 assert_response :success assert_template 'edit' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => 'checked' } + assert_select 'input[name=?][value=2][checked=checked]', 'query[visibility]' assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => 'checked', @@ -177,8 +209,7 @@ get :edit, :id => 3 assert_response :success assert_template 'edit' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } + assert_select 'input[name=?]', 'query[visibility]', 0 assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => 'checked', @@ -190,8 +221,7 @@ get :edit, :id => 2 assert_response :success assert_template 'edit' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } + assert_select 'input[name=?]', 'query[visibility]', 0 assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => nil, @@ -203,10 +233,7 @@ get :edit, :id => 1 assert_response :success assert_template 'edit' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => 'checked' - } + assert_select 'input[name=?][value=2][checked=checked]', 'query[visibility]' assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => 'query_is_for_all', :checked => nil, @@ -240,7 +267,7 @@ :fields => ["status_id", "assigned_to_id"], :operators => {"assigned_to_id" => "=", "status_id" => "o"}, :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]}, - :query => {"name" => "test_edit_global_private_query", "is_public" => "1"} + :query => {"name" => "test_edit_global_private_query", "visibility" => "2"} assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 3 q = Query.find_by_name('test_edit_global_private_query') @@ -257,7 +284,7 @@ :fields => ["status_id", "assigned_to_id"], :operators => {"assigned_to_id" => "=", "status_id" => "o"}, :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_edit_global_public_query", "is_public" => "1"} + :query => {"name" => "test_edit_global_public_query", "visibility" => "2"} assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 4 q = Query.find_by_name('test_edit_global_public_query') diff -Nru redmine-2.3.3/test/functional/repositories_bazaar_controller_test.rb redmine-2.4.2/test/functional/repositories_bazaar_controller_test.rb --- redmine-2.3.3/test/functional/repositories_bazaar_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/repositories_bazaar_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -23,17 +23,23 @@ fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules - REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository/trunk').to_s + REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s + REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk") PRJ_ID = 3 + CHAR_1_UTF8_HEX = "\xc3\x9c" def setup User.current = nil @project = Project.find(PRJ_ID) @repository = Repository::Bazaar.create( :project => @project, - :url => REPOSITORY_PATH, + :url => REPOSITORY_PATH_TRUNK, :log_encoding => 'UTF-8') assert @repository + @char_1_utf8 = CHAR_1_UTF8_HEX.dup + if @char_1_utf8.respond_to?(:force_encoding) + @char_1_utf8.force_encoding('UTF-8') + end end if File.directory?(REPOSITORY_PATH) @@ -137,26 +143,68 @@ :path => repository_path_hash(['doc-mkdir.txt'])[:param] assert_response :success assert_template 'annotate' - assert_tag :tag => 'th', :content => '2', - :sibling => { - :tag => 'td', - :child => { - :tag => 'a', - :content => '3' - } - } - assert_tag :tag => 'th', :content => '2', - :sibling => { :tag => 'td', :content => /jsmith/ } - assert_tag :tag => 'th', :content => '2', - :sibling => { - :tag => 'td', - :child => { - :tag => 'a', - :content => '3' - } - } - assert_tag :tag => 'th', :content => '2', - :sibling => { :tag => 'td', :content => /Main purpose/ } + assert_select "th.line-num", :text => '2' do + assert_select "+ td.revision" do + assert_select "a", :text => '3' + assert_select "+ td.author", :text => "jsmith@" do + assert_select "+ td", + :text => "Main purpose:" + end + end + end + end + + def test_annotate_author_escaping + repository = Repository::Bazaar.create( + :project => @project, + :url => File.join(REPOSITORY_PATH, "author_escaping"), + :identifier => 'author_escaping', + :log_encoding => 'UTF-8') + assert repository + get :annotate, :id => PRJ_ID, :repository_id => 'author_escaping', + :path => repository_path_hash(['author-escaping-test.txt'])[:param] + assert_response :success + assert_template 'annotate' + assert_select "th.line-num", :text => '1' do + assert_select "+ td.revision" do + assert_select "a", :text => '2' + assert_select "+ td.author", :text => "test &" do + assert_select "+ td", + :text => "author escaping test" + end + end + end + end + + if REPOSITORY_PATH.respond_to?(:force_encoding) + def test_annotate_author_non_ascii + log_encoding = nil + if Encoding.locale_charmap == "UTF-8" || + Encoding.locale_charmap == "ISO-8859-1" + log_encoding = Encoding.locale_charmap + end + unless log_encoding.nil? + repository = Repository::Bazaar.create( + :project => @project, + :url => File.join(REPOSITORY_PATH, "author_non_ascii"), + :identifier => 'author_non_ascii', + :log_encoding => log_encoding) + assert repository + get :annotate, :id => PRJ_ID, :repository_id => 'author_non_ascii', + :path => repository_path_hash(['author-non-ascii-test.txt'])[:param] + assert_response :success + assert_template 'annotate' + assert_select "th.line-num", :text => '1' do + assert_select "+ td.revision" do + assert_select "a", :text => '2' + assert_select "+ td.author", :text => "test #{@char_1_utf8}" do + assert_select "+ td", + :text => "author non ASCII test" + end + end + end + end + end end def test_destroy_valid_repository diff -Nru redmine-2.3.3/test/functional/repositories_controller_test.rb redmine-2.4.2/test/functional/repositories_controller_test.rb --- redmine-2.3.3/test/functional/repositories_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/repositories_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -111,6 +111,31 @@ assert_nil Repository.find_by_id(11) end + def test_show_with_autofetch_changesets_enabled_should_fetch_changesets + Repository::Subversion.any_instance.expects(:fetch_changesets).once + + with_settings :autofetch_changesets => '1' do + get :show, :id => 1 + end + end + + def test_show_with_autofetch_changesets_disabled_should_not_fetch_changesets + Repository::Subversion.any_instance.expects(:fetch_changesets).never + + with_settings :autofetch_changesets => '0' do + get :show, :id => 1 + end + end + + def test_show_with_closed_project_should_not_fetch_changesets + Repository::Subversion.any_instance.expects(:fetch_changesets).never + Project.find(1).close + + with_settings :autofetch_changesets => '1' do + get :show, :id => 1 + end + end + def test_revisions get :revisions, :id => 1 assert_response :success @@ -174,6 +199,14 @@ assert_include 'Feature request #2', response.body end + def test_add_related_issue_should_accept_issue_id_with_sharp + @request.session[:user_id] = 2 + assert_difference 'Changeset.find(103).issues.size' do + xhr :post, :add_related_issue, :id => 1, :rev => 4, :issue_id => "#2", :format => 'js' + end + assert_equal [2], Changeset.find(103).issue_ids + end + def test_add_related_issue_with_invalid_issue_id @request.session[:user_id] = 2 assert_no_difference 'Changeset.find(103).issues.size' do @@ -255,7 +288,7 @@ :revision => 100, :comments => 'Committed by foo.' ) - assert_no_difference "Changeset.count(:conditions => 'user_id = 3')" do + assert_no_difference "Changeset.where(:user_id => 3).count" do post :committers, :id => 10, :committers => { '0' => ['foo', '2'], '1' => ['dlopper', '3']} assert_response 302 assert_equal User.find(2), c.reload.user diff -Nru redmine-2.3.3/test/functional/repositories_git_controller_test.rb redmine-2.4.2/test/functional/repositories_git_controller_test.rb --- redmine-2.3.3/test/functional/repositories_git_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/repositories_git_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -27,6 +27,7 @@ REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? PRJ_ID = 3 CHAR_1_HEX = "\xc3\x9c" + FELIX_HEX = "Felix Sch\xC3\xA4fer" NUM_REV = 28 ## Git, Mercurial and CVS path encodings are binary. @@ -50,8 +51,10 @@ ) assert @repository @char_1 = CHAR_1_HEX.dup + @felix_utf8 = FELIX_HEX.dup if @char_1.respond_to?(:force_encoding) @char_1.force_encoding('UTF-8') + @felix_utf8.force_encoding('UTF-8') end end @@ -532,11 +535,32 @@ get :annotate, :id => PRJ_ID, :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param], :rev => r1 - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /test-#{@char_1}.txt/ } + assert_select "th.line-num", :text => '1' do + assert_select "+ td.revision" do + assert_select "a", :text => '57ca437c' + assert_select "+ td.author", :text => "jsmith" do + assert_select "+ td", + :text => "test-#{@char_1}.txt" + end + end + end + end + end + end + end + + def test_annotate_latin_1_author + ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', '83ca5fd546063a'].each do |r1| + get :annotate, :id => PRJ_ID, + :path => repository_path_hash([" filename with a leading space.txt "])[:param], + :rev => r1 + assert_select "th.line-num", :text => '1' do + assert_select "+ td.revision" do + assert_select "a", :text => '83ca5fd5' + assert_select "+ td.author", :text => @felix_utf8 do + assert_select "+ td", + :text => "And this is a file with a leading and trailing space..." + end end end end diff -Nru redmine-2.3.3/test/functional/repositories_mercurial_controller_test.rb redmine-2.4.2/test/functional/repositories_mercurial_controller_test.rb --- redmine-2.3.3/test/functional/repositories_mercurial_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/repositories_mercurial_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -432,30 +432,15 @@ :rev => r1 assert_response :success assert_template 'annotate' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => - { - :tag => 'td', - :attributes => { :class => 'revision' }, - :child => { :tag => 'a', :content => '20:709858aafd1b' } - } - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => - { - :tag => 'td' , - :content => 'jsmith' , - :attributes => { :class => 'author' }, - } - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /Mercurial is a distributed version control system/ } - + assert_select "th.line-num", :text => '1' do + assert_select "+ td.revision" do + assert_select "a", :text => '20:709858aafd1b' + assert_select "+ td.author", :text => "jsmith" do + assert_select "+ td", + :text => "Mercurial is a distributed version control system." + end + end + end end end @@ -474,6 +459,22 @@ end end + def test_revision + assert_equal 0, @repository.changesets.count + @repository.fetch_changesets + @project.reload + assert_equal NUM_REV, @repository.changesets.count + ['1', '9d5b5b', '9d5b5b004199'].each do |r| + with_settings :default_language => "en" do + get :revision, :id => PRJ_ID, :rev => r + assert_response :success + assert_template 'revision' + assert_select 'title', + :text => 'Revision 1:9d5b5b004199 - Added 2 files and modified one. - eCookbook Subproject 1 - Redmine' + end + end + end + def test_empty_revision assert_equal 0, @repository.changesets.count @repository.fetch_changesets diff -Nru redmine-2.3.3/test/functional/repositories_subversion_controller_test.rb redmine-2.4.2/test/functional/repositories_subversion_controller_test.rb --- redmine-2.3.3/test/functional/repositories_subversion_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/repositories_subversion_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -326,10 +326,10 @@ @project.reload assert_equal NUM_REV, @repository.changesets.count - get :diff, :id => PRJ_ID, :rev => 3, :format => 'diff' + get :diff, :id => PRJ_ID, :rev => 5, :format => 'diff' assert_response :success assert_equal 'text/x-patch', @response.content_type - assert_equal 'Index: subversion_test/textfile.txt', @response.body.split(/\r?\n/).first + assert_equal 'Index: subversion_test/folder/greeter.rb', @response.body.split(/\r?\n/).first end def test_directory_diff diff -Nru redmine-2.3.3/test/functional/search_custom_fields_visibility_test.rb redmine-2.4.2/test/functional/search_custom_fields_visibility_test.rb --- redmine-2.3.3/test/functional/search_custom_fields_visibility_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/functional/search_custom_fields_visibility_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,78 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class SearchCustomFieldsVisibilityTest < ActionController::TestCase + tests SearchController + fixtures :projects, + :users, + :roles, + :members, + :member_roles, + :issue_statuses, + :trackers, + :projects_trackers, + :enabled_modules, + :enumerations, + :workflows + + def setup + field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :searchable => true, :trackers => Tracker.all} + @fields = [] + @fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true))) + @fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2]))) + @fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3]))) + @issue = Issue.generate!( + :author_id => 1, + :project_id => 1, + :tracker_id => 1, + :custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'} + ) + + @user_with_role_on_other_project = User.generate! + User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3)) + + @users_to_test = { + User.find(1) => [@field1, @field2, @field3], + User.find(3) => [@field1, @field2], + @user_with_role_on_other_project => [@field1], # should see field1 only on Project 1 + User.generate! => [@field1], + User.anonymous => [@field1] + } + + Member.where(:project_id => 1).each do |member| + member.destroy unless @users_to_test.keys.include?(member.principal) + end + end + + def test_search_should_search_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + @fields.each_with_index do |field, i| + get :index, :q => "value#{i}" + assert_response :success + # we should get a result only if the custom field is visible + if fields.include?(field) + assert_equal 1, assigns(:results).size + else + assert_equal 0, assigns(:results).size + end + end + end + end +end diff -Nru redmine-2.3.3/test/functional/settings_controller_test.rb redmine-2.4.2/test/functional/settings_controller_test.rb --- redmine-2.3.3/test/functional/settings_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/settings_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -80,6 +80,61 @@ Setting.clear_cache end + def test_edit_commit_update_keywords + with_settings :commit_update_keywords => [ + {"keywords" => "fixes, resolves", "status_id" => "3"}, + {"keywords" => "closes", "status_id" => "5", "done_ratio" => "100", "if_tracker_id" => "2"} + ] do + get :edit + end + assert_response :success + assert_select 'tr.commit-keywords', 2 + assert_select 'tr.commit-keywords:nth-child(1)' do + assert_select 'input[name=?][value=?]', 'settings[commit_update_keywords][keywords][]', 'fixes, resolves' + assert_select 'select[name=?]', 'settings[commit_update_keywords][status_id][]' do + assert_select 'option[value=3][selected=selected]' + end + end + assert_select 'tr.commit-keywords:nth-child(2)' do + assert_select 'input[name=?][value=?]', 'settings[commit_update_keywords][keywords][]', 'closes' + assert_select 'select[name=?]', 'settings[commit_update_keywords][status_id][]' do + assert_select 'option[value=5][selected=selected]', :text => 'Closed' + end + assert_select 'select[name=?]', 'settings[commit_update_keywords][done_ratio][]' do + assert_select 'option[value=100][selected=selected]', :text => '100 %' + end + assert_select 'select[name=?]', 'settings[commit_update_keywords][if_tracker_id][]' do + assert_select 'option[value=2][selected=selected]', :text => 'Feature request' + end + end + end + + def test_edit_without_commit_update_keywords_should_show_blank_line + with_settings :commit_update_keywords => [] do + get :edit + end + assert_response :success + assert_select 'tr.commit-keywords', 1 do + assert_select 'input[name=?]:not([value])', 'settings[commit_update_keywords][keywords][]' + end + end + + def test_post_edit_commit_update_keywords + post :edit, :settings => { + :commit_update_keywords => { + :keywords => ["resolves", "closes"], + :status_id => ["3", "5"], + :done_ratio => ["", "100"], + :if_tracker_id => ["", "2"] + } + } + assert_redirected_to '/settings' + assert_equal([ + {"keywords" => "resolves", "status_id" => "3"}, + {"keywords" => "closes", "status_id" => "5", "done_ratio" => "100", "if_tracker_id" => "2"} + ], Setting.commit_update_keywords) + end + def test_get_plugin_settings Setting.stubs(:plugin_foo).returns({'sample_setting' => 'Plugin setting value'}) ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins")) diff -Nru redmine-2.3.3/test/functional/time_entry_reports_controller_test.rb redmine-2.4.2/test/functional/time_entry_reports_controller_test.rb --- redmine-2.3.3/test/functional/time_entry_reports_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/time_entry_reports_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -256,8 +256,8 @@ assert_equal 'text/csv; header=present', @response.content_type lines = @response.body.chomp.split("\n") # Headers - s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xc1`\xadp" - s2 = "\xc1`\xadp" + s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp" + s2 = "\xa4u\xae\xc9\xc1`\xadp" if s1.respond_to?(:force_encoding) s1.force_encoding('Big5') s2.force_encoding('Big5') @@ -307,7 +307,7 @@ assert_equal 'text/csv; header=present', @response.content_type lines = @response.body.chomp.split("\n") # Headers - s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xc1`\xadp" + s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp" if s1.respond_to?(:force_encoding) s1.force_encoding('Big5') end diff -Nru redmine-2.3.3/test/functional/timelog_controller_test.rb redmine-2.4.2/test/functional/timelog_controller_test.rb --- redmine-2.3.3/test/functional/timelog_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/timelog_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -429,6 +429,14 @@ assert_tag 'a', :attributes => {:href => '/time_entries/new'}, :content => /Log time/ end + def test_index_my_spent_time + @request.session[:user_id] = 2 + get :index, :user_id => 'me' + assert_response :success + assert_template 'index' + assert assigns(:entries).all? {|entry| entry.user_id == 2} + end + def test_index_at_project_level get :index, :project_id => 'ecookbook' assert_response :success @@ -562,6 +570,17 @@ assert_select 'td.issue_cf_2', :text => 'filter_on_issue_custom_field' end + def test_index_with_time_entry_custom_field_column + field = TimeEntryCustomField.generate!(:field_format => 'string') + entry = TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value'}) + field_name = "cf_#{field.id}" + + get :index, :c => ["hours", field_name] + assert_response :success + assert_include field_name.to_sym, assigns(:query).column_names + assert_select "td.#{field_name}", :text => 'CF Value' + end + def test_index_with_time_entry_custom_field_sorting field = TimeEntryCustomField.generate!(:field_format => 'string', :name => 'String Field') TimeEntry.generate!(:hours => 2.5, :custom_field_values => {field.id => 'CF Value 1'}) diff -Nru redmine-2.3.3/test/functional/timelog_custom_fields_visibility_test.rb redmine-2.4.2/test/functional/timelog_custom_fields_visibility_test.rb --- redmine-2.3.3/test/functional/timelog_custom_fields_visibility_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/functional/timelog_custom_fields_visibility_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,113 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class TimelogCustomFieldsVisibilityTest < ActionController::TestCase + tests TimelogController + fixtures :projects, + :users, + :roles, + :members, + :member_roles, + :issue_statuses, + :trackers, + :projects_trackers, + :enabled_modules, + :enumerations, + :workflows + + def setup + field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all} + @fields = [] + @fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true))) + @fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2]))) + @fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3]))) + @issue = Issue.generate!( + :author_id => 1, + :project_id => 1, + :tracker_id => 1, + :custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'} + ) + TimeEntry.generate!(:issue => @issue) + + @user_with_role_on_other_project = User.generate! + User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3)) + + @users_to_test = { + User.find(1) => [@field1, @field2, @field3], + User.find(3) => [@field1, @field2], + @user_with_role_on_other_project => [@field1], # should see field1 only on Project 1 + User.generate! => [@field1], + User.anonymous => [@field1] + } + + Member.where(:project_id => 1).each do |member| + member.destroy unless @users_to_test.keys.include?(member.principal) + end + end + + def test_index_should_show_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :index, :project_id => 1, :issue_id => @issue.id, :c => (['hours'] + @fields.map{|f| "issue.cf_#{f.id}"}) + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_select 'td', {:text => "Value#{i}", :count => 1}, "User #{user.id} was not able to view #{field.name}" + else + assert_select 'td', {:text => "Value#{i}", :count => 0}, "User #{user.id} was able to view #{field.name}" + end + end + end + end + + def test_index_as_csv_should_show_visible_custom_fields_only + @users_to_test.each do |user, fields| + @request.session[:user_id] = user.id + get :index, :project_id => 1, :issue_id => @issue.id, :c => (['hours'] + @fields.map{|f| "issue.cf_#{f.id}"}), :format => 'csv' + @fields.each_with_index do |field, i| + if fields.include?(field) + assert_include "Value#{i}", response.body, "User #{user.id} was not able to view #{field.name} in CSV" + else + assert_not_include "Value#{i}", response.body, "User #{user.id} was able to view #{field.name} in CSV" + end + end + end + end + + def test_index_with_partial_custom_field_visibility_should_show_visible_custom_fields_only + Issue.delete_all + TimeEntry.delete_all + p1 = Project.generate! + p2 = Project.generate! + user = User.generate! + User.add_to_project(user, p1, Role.find_all_by_id(1,3)) + User.add_to_project(user, p2, Role.find_all_by_id(3)) + TimeEntry.generate!(:issue => Issue.generate!(:project => p1, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueA'})) + TimeEntry.generate!(:issue => Issue.generate!(:project => p2, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueB'})) + TimeEntry.generate!(:issue => Issue.generate!(:project => p1, :tracker_id => 1, :custom_field_values => {@field2.id => 'ValueC'})) + + @request.session[:user_id] = user.id + get :index, :c => ["hours", "issue.cf_#{@field2.id}"] + assert_select 'td', :text => 'ValueA' + assert_select 'td', :text => 'ValueB', :count => 0 + assert_select 'td', :text => 'ValueC' + + get :index, :set_filter => '1', "issue.cf_#{@field2.id}" => '*' + assert_equal %w(ValueA ValueC), assigns(:entries).map{|i| i.issue.custom_field_value(@field2)}.sort + end +end diff -Nru redmine-2.3.3/test/functional/users_controller_test.rb redmine-2.4.2/test/functional/users_controller_test.rb --- redmine-2.3.3/test/functional/users_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/users_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,12 +33,6 @@ get :index assert_response :success assert_template 'index' - end - - def test_index - get :index - assert_response :success - assert_template 'index' assert_not_nil assigns(:users) # active users only assert_nil assigns(:users).detect {|u| !u.active?} @@ -218,6 +212,30 @@ assert_equal '0', user.pref[:warn_on_leaving_unsaved] end + def test_create_with_generate_password_should_email_the_password + assert_difference 'User.count' do + post :create, :user => { + :login => 'randompass', + :firstname => 'Random', + :lastname => 'Pass', + :mail => 'randompass@example.net', + :language => 'en', + :generate_password => '1', + :password => '', + :password_confirmation => '' + }, :send_information => 1 + end + user = User.order('id DESC').first + assert_equal 'randompass', user.login + + mail = ActionMailer::Base.deliveries.last + assert_not_nil mail + m = mail_body(mail).match(/Password: ([a-zA-Z0-9]+)/) + assert m + password = m[1] + assert user.check_password?(password) + end + def test_create_with_failure assert_no_difference 'User.count' do post :create, :user => {} @@ -290,6 +308,37 @@ assert_mail_body_match 'newpass123', mail end + def test_update_with_generate_password_should_email_the_password + ActionMailer::Base.deliveries.clear + Setting.bcc_recipients = '1' + + put :update, :id => 2, :user => { + :generate_password => '1', + :password => '', + :password_confirmation => '' + }, :send_information => '1' + + mail = ActionMailer::Base.deliveries.last + assert_not_nil mail + m = mail_body(mail).match(/Password: ([a-zA-Z0-9]+)/) + assert m + password = m[1] + assert User.find(2).check_password?(password) + end + + def test_update_without_generate_password_should_not_change_password + put :update, :id => 2, :user => { + :firstname => 'changed', + :generate_password => '0', + :password => '', + :password_confirmation => '' + }, :send_information => '1' + + user = User.find(2) + assert_equal 'changed', user.firstname + assert user.check_password?('jsmith') + end + def test_update_user_switchin_from_auth_source_to_password_authentication # Configure as auth source u = User.find(2) @@ -309,17 +358,13 @@ u = User.find(2) assert_equal [1, 2, 5], u.projects.collect{|p| p.id}.sort assert_equal [1, 2, 5], u.notified_projects_ids.sort - assert_tag :tag => 'input', - :attributes => { - :id => 'notified_project_ids_', - :value => 1, - } + assert_select 'input[name=?][value=?]', 'user[notified_project_ids][]', '1' assert_equal 'all', u.mail_notification put :update, :id => 2, :user => { - :mail_notification => 'selected', - }, - :notified_project_ids => [1, 2] + :mail_notification => 'selected', + :notified_project_ids => [1, 2] + } u = User.find(2) assert_equal 'selected', u.mail_notification assert_equal [1, 2], u.notified_projects_ids.sort diff -Nru redmine-2.3.3/test/functional/versions_controller_test.rb redmine-2.4.2/test/functional/versions_controller_test.rb --- redmine-2.3.3/test/functional/versions_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/versions_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,9 @@ require File.expand_path('../../test_helper', __FILE__) class VersionsControllerTest < ActionController::TestCase - fixtures :projects, :versions, :issues, :users, :roles, :members, :member_roles, :enabled_modules, :issue_statuses, :issue_categories + fixtures :projects, :versions, :issues, :users, :roles, :members, + :member_roles, :enabled_modules, :issue_statuses, + :issue_categories def setup User.current = nil @@ -35,12 +37,12 @@ assert !assigns(:versions).include?(Version.find(1)) # Context menu on issues assert_select "script", :text => Regexp.new(Regexp.escape("contextMenuInit('/issues/context_menu')")) - # Links to versions anchors - assert_tag 'a', :attributes => {:href => '#2.0'}, - :ancestor => {:tag => 'div', :attributes => {:id => 'sidebar'}} - # Links to completed versions in the sidebar - assert_tag 'a', :attributes => {:href => '/versions/1'}, - :ancestor => {:tag => 'div', :attributes => {:id => 'sidebar'}} + assert_select "div#sidebar" do + # Links to versions anchors + assert_select 'a[href=?]', '#2.0' + # Links to completed versions in the sidebar + assert_select 'a[href=?]', '/versions/1' + end end def test_index_with_completed_versions @@ -171,16 +173,18 @@ Version.update_all("status = 'open'") @request.session[:user_id] = 2 put :close_completed, :project_id => 'ecookbook' - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' + assert_redirected_to :controller => 'projects', :action => 'settings', + :tab => 'versions', :id => 'ecookbook' assert_not_nil Version.find_by_status('closed') end def test_post_update @request.session[:user_id] = 2 put :update, :id => 2, - :version => { :name => 'New version name', - :effective_date => Date.today.strftime("%Y-%m-%d")} - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' + :version => {:name => 'New version name', + :effective_date => Date.today.strftime("%Y-%m-%d")} + assert_redirected_to :controller => 'projects', :action => 'settings', + :tab => 'versions', :id => 'ecookbook' version = Version.find(2) assert_equal 'New version name', version.name assert_equal Date.today, version.effective_date @@ -200,7 +204,8 @@ assert_difference 'Version.count', -1 do delete :destroy, :id => 3 end - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' + assert_redirected_to :controller => 'projects', :action => 'settings', + :tab => 'versions', :id => 'ecookbook' assert_nil Version.find_by_id(3) end @@ -209,7 +214,8 @@ assert_no_difference 'Version.count' do delete :destroy, :id => 2 end - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' + assert_redirected_to :controller => 'projects', :action => 'settings', + :tab => 'versions', :id => 'ecookbook' assert flash[:error].match(/Unable to delete version/) assert Version.find_by_id(2) end diff -Nru redmine-2.3.3/test/functional/welcome_controller_test.rb redmine-2.4.2/test/functional/welcome_controller_test.rb --- redmine-2.3.3/test/functional/welcome_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/welcome_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -106,60 +106,50 @@ end end - context "test_api_offset_and_limit" do - context "without params" do - should "return 0, 25" do - assert_equal [0, 25], @controller.api_offset_and_limit({}) - end - end + def test_api_offset_and_limit_without_params + assert_equal [0, 25], @controller.api_offset_and_limit({}) + end - context "with limit" do - should "return 0, limit" do - assert_equal [0, 30], @controller.api_offset_and_limit({:limit => 30}) - end - - should "not exceed 100" do - assert_equal [0, 100], @controller.api_offset_and_limit({:limit => 120}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:limit => -10}) - end - end + def test_api_offset_and_limit_with_limit + assert_equal [0, 30], @controller.api_offset_and_limit({:limit => 30}) + assert_equal [0, 100], @controller.api_offset_and_limit({:limit => 120}) + assert_equal [0, 25], @controller.api_offset_and_limit({:limit => -10}) + end - context "with offset" do - should "return offset, 25" do - assert_equal [10, 25], @controller.api_offset_and_limit({:offset => 10}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:offset => -10}) - end - - context "and limit" do - should "return offset, limit" do - assert_equal [10, 50], @controller.api_offset_and_limit({:offset => 10, :limit => 50}) - end - end - end + def test_api_offset_and_limit_with_offset + assert_equal [10, 25], @controller.api_offset_and_limit({:offset => 10}) + assert_equal [0, 25], @controller.api_offset_and_limit({:offset => -10}) + end - context "with page" do - should "return offset, 25" do - assert_equal [0, 25], @controller.api_offset_and_limit({:page => 1}) - assert_equal [50, 25], @controller.api_offset_and_limit({:page => 3}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:page => 0}) - assert_equal [0, 25], @controller.api_offset_and_limit({:page => -2}) - end - - context "and limit" do - should "return offset, limit" do - assert_equal [0, 100], @controller.api_offset_and_limit({:page => 1, :limit => 100}) - assert_equal [200, 100], @controller.api_offset_and_limit({:page => 3, :limit => 100}) - end - end - end + def test_api_offset_and_limit_with_offset_and_limit + assert_equal [10, 50], @controller.api_offset_and_limit({:offset => 10, :limit => 50}) + end + + def test_api_offset_and_limit_with_page + assert_equal [0, 25], @controller.api_offset_and_limit({:page => 1}) + assert_equal [50, 25], @controller.api_offset_and_limit({:page => 3}) + assert_equal [0, 25], @controller.api_offset_and_limit({:page => 0}) + assert_equal [0, 25], @controller.api_offset_and_limit({:page => -2}) + end + + def test_api_offset_and_limit_with_page_and_limit + assert_equal [0, 100], @controller.api_offset_and_limit({:page => 1, :limit => 100}) + assert_equal [200, 100], @controller.api_offset_and_limit({:page => 3, :limit => 100}) + end + + def test_unhautorized_exception_with_anonymous_should_redirect_to_login + WelcomeController.any_instance.stubs(:index).raises(::Unauthorized) + + get :index + assert_response 302 + assert_redirected_to('/login?back_url='+CGI.escape('http://test.host/')) + end + + def test_unhautorized_exception_with_anonymous_and_xmlhttprequest_should_respond_with_401_to_anonymous + WelcomeController.any_instance.stubs(:index).raises(::Unauthorized) + + @request.env["HTTP_X_REQUESTED_WITH"] = "XMLHttpRequest" + get :index + assert_response 401 end end diff -Nru redmine-2.3.3/test/functional/wiki_controller_test.rb redmine-2.4.2/test/functional/wiki_controller_test.rb --- redmine-2.3.3/test/functional/wiki_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/wiki_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -177,6 +177,16 @@ assert_response 302 end + def test_show_page_without_content_should_display_the_edit_form + @request.session[:user_id] = 2 + WikiPage.create!(:title => 'NoContent', :wiki => Project.find(1).wiki) + + get :show, :project_id => 1, :id => 'NoContent' + assert_response :success + assert_template 'edit' + assert_select 'textarea[name=?]', 'content[text]' + end + def test_create_page @request.session[:user_id] = 2 assert_difference 'WikiPage.count' do @@ -412,6 +422,19 @@ assert_equal 2, c.version end + def test_update_page_without_content_should_create_content + @request.session[:user_id] = 2 + page = WikiPage.create!(:title => 'NoContent', :wiki => Project.find(1).wiki) + + assert_no_difference 'WikiPage.count' do + assert_difference 'WikiContent.count' do + put :update, :project_id => 1, :id => 'NoContent', :content => {:text => 'Some content'} + assert_response 302 + end + end + assert_equal 'Some content', page.reload.content.text + end + def test_update_section @request.session[:user_id] = 2 page = WikiPage.find_by_title('Page_with_sections') @@ -431,7 +454,7 @@ end end end - assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections' + assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections#section-2' assert_equal Redmine::WikiFormatting::Textile::Formatter.new(text).update_section(2, "New section content"), page.reload.content.text end @@ -454,7 +477,7 @@ end end end - assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections' + assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections#section-2' page.reload assert_equal Redmine::WikiFormatting::Textile::Formatter.new(text).update_section(2, "New section content"), page.content.text assert_equal 4, page.content.version diff -Nru redmine-2.3.3/test/functional/workflows_controller_test.rb redmine-2.4.2/test/functional/workflows_controller_test.rb --- redmine-2.3.3/test/functional/workflows_controller_test.rb 2013-09-14 06:48:01.000000000 +0000 +++ redmine-2.4.2/test/functional/workflows_controller_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -30,7 +30,7 @@ assert_response :success assert_template 'index' - count = WorkflowTransition.count(:all, :conditions => 'role_id = 1 AND tracker_id = 2') + count = WorkflowTransition.where(:role_id => 1, :tracker_id => 2).count assert_tag :tag => 'a', :content => count.to_s, :attributes => { :href => '/workflows/edit?role_id=1&tracker_id=2' } end @@ -125,10 +125,10 @@ end def test_clear_workflow - assert WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2}) > 0 + assert WorkflowTransition.where(:role_id => 1, :tracker_id => 2).count > 0 - post :edit, :role_id => 2, :tracker_id => 1 - assert_equal 0, WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2}) + post :edit, :role_id => 1, :tracker_id => 2 + assert_equal 0, WorkflowTransition.where(:role_id => 1, :tracker_id => 2).count end def test_get_permissions @@ -200,6 +200,23 @@ end end + def test_get_permissions_should_disable_hidden_custom_fields + cf1 = IssueCustomField.generate!(:tracker_ids => [1], :visible => true) + cf2 = IssueCustomField.generate!(:tracker_ids => [1], :visible => false, :role_ids => [1]) + cf3 = IssueCustomField.generate!(:tracker_ids => [1], :visible => false, :role_ids => [1, 2]) + + get :permissions, :role_id => 2, :tracker_id => 1 + assert_response :success + assert_template 'permissions' + + assert_select 'select[name=?]:not(.disabled)', "permissions[#{cf1.id}][1]" + assert_select 'select[name=?]:not(.disabled)', "permissions[#{cf3.id}][1]" + + assert_select 'select[name=?][disabled=disabled]', "permissions[#{cf2.id}][1]" do + assert_select 'option[value=][selected=selected]', :text => 'Hidden' + end + end + def test_get_permissions_with_role_and_tracker_and_all_statuses WorkflowTransition.delete_all diff -Nru redmine-2.3.3/test/integration/account_test.rb redmine-2.4.2/test/integration/account_test.rb --- redmine-2.3.3/test/integration/account_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/account_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,7 @@ require File.expand_path('../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' rescue # Won't run some tests end @@ -59,7 +59,7 @@ user.update_attribute :last_login_on, nil assert_nil user.reload.last_login_on - # User comes back with his autologin cookie + # User comes back with user's autologin cookie cookies[:autologin] = token.value get '/my/page' assert_response :success @@ -81,7 +81,7 @@ assert_response 302 assert cookies['custom_autologin'].present? token = cookies['custom_autologin'] - + # Session is cleared reset! cookies['custom_autologin'] = token @@ -118,7 +118,9 @@ assert_select 'input[name=new_password]' assert_select 'input[name=new_password_confirmation]' - post "account/lost_password", :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123' + post "account/lost_password", + :token => token.value, :new_password => 'newpass123', + :new_password_confirmation => 'newpass123' assert_redirected_to "/login" assert_equal 'Password was successfully updated.', flash[:notice] @@ -126,6 +128,35 @@ assert_equal 0, Token.count end + def test_user_with_must_change_passwd_should_be_forced_to_change_its_password + User.find_by_login('jsmith').update_attribute :must_change_passwd, true + + post '/login', :username => 'jsmith', :password => 'jsmith' + assert_redirected_to '/my/page' + follow_redirect! + assert_redirected_to '/my/password' + + get '/issues' + assert_redirected_to '/my/password' + end + + def test_user_with_must_change_passwd_should_be_able_to_change_its_password + User.find_by_login('jsmith').update_attribute :must_change_passwd, true + + post '/login', :username => 'jsmith', :password => 'jsmith' + assert_redirected_to '/my/page' + follow_redirect! + assert_redirected_to '/my/password' + follow_redirect! + assert_response :success + post '/my/password', :password => 'jsmith', :new_password => 'newpassword', :new_password_confirmation => 'newpassword' + assert_redirected_to '/my/account' + follow_redirect! + assert_response :success + + assert_equal false, User.find_by_login('jsmith').must_change_passwd? + end + def test_register_with_automatic_activation Setting.self_registration = '3' @@ -133,8 +164,10 @@ assert_response :success assert_template 'account/register' - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} + post 'account/register', + :user => {:login => "newuser", :language => "en", + :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", + :password => "newpass123", :password_confirmation => "newpass123"} assert_redirected_to '/my/account' follow_redirect! assert_response :success @@ -149,8 +182,10 @@ def test_register_with_manual_activation Setting.self_registration = '2' - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} + post 'account/register', + :user => {:login => "newuser", :language => "en", + :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", + :password => "newpass123", :password_confirmation => "newpass123"} assert_redirected_to '/login' assert !User.find_by_login('newuser').active? end @@ -159,8 +194,10 @@ Setting.self_registration = '1' Token.delete_all - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} + post 'account/register', + :user => {:login => "newuser", :language => "en", + :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", + :password => "newpass123", :password_confirmation => "newpass123"} assert_redirected_to '/login' assert !User.find_by_login('newuser').active? @@ -177,7 +214,9 @@ def test_onthefly_registration # disable registration Setting.self_registration = '0' - AuthSource.expects(:authenticate).returns({:login => 'foo', :firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com', :auth_source_id => 66}) + AuthSource.expects(:authenticate).returns( + {:login => 'foo', :firstname => 'Foo', :lastname => 'Smith', + :mail => 'foo@bar.com', :auth_source_id => 66}) post '/login', :username => 'foo', :password => 'bar' assert_redirected_to '/my/page' @@ -191,7 +230,8 @@ def test_onthefly_registration_with_invalid_attributes # disable registration Setting.self_registration = '0' - AuthSource.expects(:authenticate).returns({:login => 'foo', :lastname => 'Smith', :auth_source_id => 66}) + AuthSource.expects(:authenticate).returns( + {:login => 'foo', :lastname => 'Smith', :auth_source_id => 66}) post '/login', :username => 'foo', :password => 'bar' assert_response :success @@ -201,7 +241,8 @@ assert_no_tag :input, :attributes => { :name => 'user[login]' } assert_no_tag :input, :attributes => { :name => 'user[password]' } - post 'account/register', :user => {:firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com'} + post 'account/register', + :user => {:firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com'} assert_redirected_to '/my/account' user = User.find_by_login('foo') @@ -209,4 +250,49 @@ assert_equal 66, user.auth_source_id assert user.hashed_password.blank? end + + def test_registered_user_should_be_able_to_get_a_new_activation_email + Token.delete_all + + with_settings :self_registration => '1', :default_language => 'en' do + # register a new account + assert_difference 'User.count' do + assert_difference 'Token.count' do + post 'account/register', + :user => {:login => "newuser", :language => "en", + :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", + :password => "newpass123", :password_confirmation => "newpass123"} + end + end + user = User.order('id desc').first + assert_equal User::STATUS_REGISTERED, user.status + reset! + + # try to use "lost password" + assert_no_difference 'ActionMailer::Base.deliveries.size' do + post '/account/lost_password', :mail => 'newuser@foo.bar' + end + assert_redirected_to '/account/lost_password' + follow_redirect! + assert_response :success + assert_select 'div.flash', :text => /new activation email/ + assert_select 'div.flash a[href=/account/activation_email]' + + # request a new action activation email + assert_difference 'ActionMailer::Base.deliveries.size' do + get '/account/activation_email' + end + assert_redirected_to '/login' + token = Token.order('id desc').first + activation_path = "/account/activate?token=#{token.value}" + assert_include activation_path, mail_body(ActionMailer::Base.deliveries.last) + + # activate the account + get activation_path + assert_redirected_to '/login' + + post '/login', :username => 'newuser', :password => 'newpass123' + assert_redirected_to '/my/page' + end + end end diff -Nru redmine-2.3.3/test/integration/api_test/api_test.rb redmine-2.4.2/test/integration/api_test/api_test.rb --- redmine-2.3.3/test/integration/api_test/api_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/api_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,41 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../../test_helper', __FILE__) + +class Redmine::ApiTest::ApiTest < Redmine::ApiTest::Base + fixtures :users + + def setup + Setting.rest_api_enabled = '1' + end + + def test_api_should_work_with_protect_from_forgery + ActionController::Base.allow_forgery_protection = true + assert_difference('User.count') do + post '/users.xml', { + :user => { + :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', + :mail => 'foo@example.net', :password => 'secret123'} + }, + credentials('admin') + assert_response 201 + end + ensure + ActionController::Base.allow_forgery_protection = false + end +end \ No newline at end of file diff -Nru redmine-2.3.3/test/integration/api_test/custom_fields_test.rb redmine-2.4.2/test/integration/api_test/custom_fields_test.rb --- redmine-2.3.3/test/integration/api_test/custom_fields_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/custom_fields_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,43 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../../test_helper', __FILE__) + +class Redmine::ApiTest::CustomFieldsTest < Redmine::ApiTest::Base + fixtures :users, :custom_fields + + def setup + Setting.rest_api_enabled = '1' + end + + test "GET /custom_fields.xml should return custom fields" do + get '/custom_fields.xml', {}, credentials('admin') + assert_response :success + assert_equal 'application/xml', response.content_type + + assert_select 'custom_fields' do + assert_select 'custom_field' do + assert_select 'name', :text => 'Database' + assert_select 'id', :text => '2' + assert_select 'customized_type', :text => 'issue' + assert_select 'possible_values[type=array]' do + assert_select 'possible_value>value', :text => 'PostgreSQL' + end + end + end + end +end diff -Nru redmine-2.3.3/test/integration/api_test/enumerations_test.rb redmine-2.4.2/test/integration/api_test/enumerations_test.rb --- redmine-2.3.3/test/integration/api_test/enumerations_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/enumerations_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,20 +24,14 @@ Setting.rest_api_enabled = '1' end - context "/enumerations/issue_priorities" do - context "GET" do - - should "return priorities" do - get '/enumerations/issue_priorities.xml' - - assert_response :success - assert_equal 'application/xml', response.content_type - assert_select 'issue_priorities[type=array]' do - assert_select 'issue_priority' do - assert_select 'id', :text => '6' - assert_select 'name', :text => 'High' - end - end + test "GET /enumerations/issue_priorities.xml should return priorities" do + get '/enumerations/issue_priorities.xml' + assert_response :success + assert_equal 'application/xml', response.content_type + assert_select 'issue_priorities[type=array]' do + assert_select 'issue_priority' do + assert_select 'id', :text => '6' + assert_select 'name', :text => 'High' end end end diff -Nru redmine-2.3.3/test/integration/api_test/groups_test.rb redmine-2.4.2/test/integration/api_test/groups_test.rb --- redmine-2.3.3/test/integration/api_test/groups_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/groups_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,189 +24,147 @@ Setting.rest_api_enabled = '1' end - context "GET /groups" do - context ".xml" do - should "require authentication" do - get '/groups.xml' - assert_response 401 - end + test "GET /groups.xml should require authentication" do + get '/groups.xml' + assert_response 401 + end - should "return groups" do - get '/groups.xml', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'groups' do - assert_select 'group' do - assert_select 'name', :text => 'A Team' - assert_select 'id', :text => '10' - end - end + test "GET /groups.xml should return groups" do + get '/groups.xml', {}, credentials('admin') + assert_response :success + assert_equal 'application/xml', response.content_type + + assert_select 'groups' do + assert_select 'group' do + assert_select 'name', :text => 'A Team' + assert_select 'id', :text => '10' end end + end - context ".json" do - should "require authentication" do - get '/groups.json' - assert_response 401 - end + test "GET /groups.json should require authentication" do + get '/groups.json' + assert_response 401 + end - should "return groups" do - get '/groups.json', {}, credentials('admin') - assert_response :success - assert_equal 'application/json', response.content_type - - json = MultiJson.load(response.body) - groups = json['groups'] - assert_kind_of Array, groups - group = groups.detect {|g| g['name'] == 'A Team'} - assert_not_nil group - assert_equal({'id' => 10, 'name' => 'A Team'}, group) - end + test "GET /groups.json should return groups" do + get '/groups.json', {}, credentials('admin') + assert_response :success + assert_equal 'application/json', response.content_type + + json = MultiJson.load(response.body) + groups = json['groups'] + assert_kind_of Array, groups + group = groups.detect {|g| g['name'] == 'A Team'} + assert_not_nil group + assert_equal({'id' => 10, 'name' => 'A Team'}, group) + end + + test "GET /groups/:id.xml should return the group with its users" do + get '/groups/10.xml', {}, credentials('admin') + assert_response :success + assert_equal 'application/xml', response.content_type + + assert_select 'group' do + assert_select 'name', :text => 'A Team' + assert_select 'id', :text => '10' end end - context "GET /groups/:id" do - context ".xml" do - should "return the group with its users" do - get '/groups/10.xml', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'name', :text => 'A Team' - assert_select 'id', :text => '10' - end - end + test "GET /groups/:id.xml should include users if requested" do + get '/groups/10.xml?include=users', {}, credentials('admin') + assert_response :success + assert_equal 'application/xml', response.content_type - should "include users if requested" do - get '/groups/10.xml?include=users', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'users' do - assert_select 'user', Group.find(10).users.count - assert_select 'user[id=8]' - end - end + assert_select 'group' do + assert_select 'users' do + assert_select 'user', Group.find(10).users.count + assert_select 'user[id=8]' end + end + end - should "include memberships if requested" do - get '/groups/10.xml?include=memberships', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'memberships' - end - end + test "GET /groups/:id.xml include memberships if requested" do + get '/groups/10.xml?include=memberships', {}, credentials('admin') + assert_response :success + assert_equal 'application/xml', response.content_type + + assert_select 'group' do + assert_select 'memberships' end end - context "POST /groups" do - context "with valid parameters" do - context ".xml" do - should "create groups" do - assert_difference('Group.count') do - post '/groups.xml', {:group => {:name => 'Test', :user_ids => [2, 3]}}, credentials('admin') - assert_response :created - assert_equal 'application/xml', response.content_type - end - - group = Group.order('id DESC').first - assert_equal 'Test', group.name - assert_equal [2, 3], group.users.map(&:id).sort - - assert_select 'group' do - assert_select 'name', :text => 'Test' - end - end - end + test "POST /groups.xml with valid parameters should create the group" do + assert_difference('Group.count') do + post '/groups.xml', {:group => {:name => 'Test', :user_ids => [2, 3]}}, credentials('admin') + assert_response :created + assert_equal 'application/xml', response.content_type end - context "with invalid parameters" do - context ".xml" do - should "return errors" do - assert_no_difference('Group.count') do - post '/groups.xml', {:group => {:name => ''}}, credentials('admin') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', response.content_type - - assert_select 'errors' do - assert_select 'error', :text => /Name can't be blank/ - end - end - end + group = Group.order('id DESC').first + assert_equal 'Test', group.name + assert_equal [2, 3], group.users.map(&:id).sort + + assert_select 'group' do + assert_select 'name', :text => 'Test' end end - context "PUT /groups/:id" do - context "with valid parameters" do - context ".xml" do - should "update the group" do - put '/groups/10.xml', {:group => {:name => 'New name', :user_ids => [2, 3]}}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - - group = Group.find(10) - assert_equal 'New name', group.name - assert_equal [2, 3], group.users.map(&:id).sort - end - end + test "POST /groups.xml with invalid parameters should return errors" do + assert_no_difference('Group.count') do + post '/groups.xml', {:group => {:name => ''}}, credentials('admin') end + assert_response :unprocessable_entity + assert_equal 'application/xml', response.content_type - context "with invalid parameters" do - context ".xml" do - should "return errors" do - put '/groups/10.xml', {:group => {:name => ''}}, credentials('admin') - assert_response :unprocessable_entity - assert_equal 'application/xml', response.content_type - - assert_select 'errors' do - assert_select 'error', :text => /Name can't be blank/ - end - end - end + assert_select 'errors' do + assert_select 'error', :text => /Name can't be blank/ end end - context "DELETE /groups/:id" do - context ".xml" do - should "delete the group" do - assert_difference 'Group.count', -1 do - delete '/groups/10.xml', {}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - end + test "PUT /groups/:id.xml with valid parameters should update the group" do + put '/groups/10.xml', {:group => {:name => 'New name', :user_ids => [2, 3]}}, credentials('admin') + assert_response :ok + assert_equal '', @response.body + + group = Group.find(10) + assert_equal 'New name', group.name + assert_equal [2, 3], group.users.map(&:id).sort + end + + test "PUT /groups/:id.xml with invalid parameters should return errors" do + put '/groups/10.xml', {:group => {:name => ''}}, credentials('admin') + assert_response :unprocessable_entity + assert_equal 'application/xml', response.content_type + + assert_select 'errors' do + assert_select 'error', :text => /Name can't be blank/ end end - context "POST /groups/:id/users" do - context ".xml" do - should "add user to the group" do - assert_difference 'Group.find(10).users.count' do - post '/groups/10/users.xml', {:user_id => 5}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - assert_include User.find(5), Group.find(10).users - end + test "DELETE /groups/:id.xml should delete the group" do + assert_difference 'Group.count', -1 do + delete '/groups/10.xml', {}, credentials('admin') + assert_response :ok + assert_equal '', @response.body end end - context "DELETE /groups/:id/users/:user_id" do - context ".xml" do - should "remove user from the group" do - assert_difference 'Group.find(10).users.count', -1 do - delete '/groups/10/users/8.xml', {}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - assert_not_include User.find(8), Group.find(10).users - end + test "POST /groups/:id/users.xml should add user to the group" do + assert_difference 'Group.find(10).users.count' do + post '/groups/10/users.xml', {:user_id => 5}, credentials('admin') + assert_response :ok + assert_equal '', @response.body + end + assert_include User.find(5), Group.find(10).users + end + + test "DELETE /groups/:id/users/:user_id.xml should remove user from the group" do + assert_difference 'Group.find(10).users.count', -1 do + delete '/groups/10/users/8.xml', {}, credentials('admin') + assert_response :ok + assert_equal '', @response.body end + assert_not_include User.find(8), Group.find(10).users end end diff -Nru redmine-2.3.3/test/integration/api_test/issue_categories_test.rb redmine-2.4.2/test/integration/api_test/issue_categories_test.rb --- redmine-2.3.3/test/integration/api_test/issue_categories_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/issue_categories_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -28,99 +28,83 @@ Setting.rest_api_enabled = '1' end - context "GET /projects/:project_id/issue_categories.xml" do - should "return issue categories" do - get '/projects/1/issue_categories.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_categories', - :child => {:tag => 'issue_category', :child => {:tag => 'id', :content => '2'}} - end + test "GET /projects/:project_id/issue_categories.xml should return the issue categories" do + get '/projects/1/issue_categories.xml', {}, credentials('jsmith') + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'issue_categories', + :child => {:tag => 'issue_category', :child => {:tag => 'id', :content => '2'}} end - context "GET /issue_categories/2.xml" do - should "return requested issue category" do - get '/issue_categories/2.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_category', - :child => {:tag => 'id', :content => '2'} - end + test "GET /issue_categories/:id.xml should return the issue category" do + get '/issue_categories/2.xml', {}, credentials('jsmith') + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'issue_category', + :child => {:tag => 'id', :content => '2'} end - context "POST /projects/:project_id/issue_categories.xml" do - should "return create issue category" do - assert_difference 'IssueCategory.count' do - post '/projects/1/issue_categories.xml', {:issue_category => {:name => 'API'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type + test "POST /projects/:project_id/issue_categories.xml should return create issue category" do + assert_difference 'IssueCategory.count' do + post '/projects/1/issue_categories.xml', {:issue_category => {:name => 'API'}}, credentials('jsmith') + end + assert_response :created + assert_equal 'application/xml', @response.content_type - category = IssueCategory.first(:order => 'id DESC') - assert_equal 'API', category.name - assert_equal 1, category.project_id - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'IssueCategory.count' do - post '/projects/1/issue_categories.xml', {:issue_category => {:name => ''}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type + category = IssueCategory.first(:order => 'id DESC') + assert_equal 'API', category.name + assert_equal 1, category.project_id + end - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end + test "POST /projects/:project_id/issue_categories.xml with invalid parameters should return errors" do + assert_no_difference 'IssueCategory.count' do + post '/projects/1/issue_categories.xml', {:issue_category => {:name => ''}}, credentials('jsmith') end + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + + assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} end - context "PUT /issue_categories/2.xml" do - context "with valid parameters" do - should "update issue category" do - assert_no_difference 'IssueCategory.count' do - put '/issue_categories/2.xml', {:issue_category => {:name => 'API Update'}}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'API Update', IssueCategory.find(2).name - end + test "PUT /issue_categories/:id.xml with valid parameters should update the issue category" do + assert_no_difference 'IssueCategory.count' do + put '/issue_categories/2.xml', {:issue_category => {:name => 'API Update'}}, credentials('jsmith') end + assert_response :ok + assert_equal '', @response.body + assert_equal 'API Update', IssueCategory.find(2).name + end - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'IssueCategory.count' do - put '/issue_categories/2.xml', {:issue_category => {:name => ''}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end + test "PUT /issue_categories/:id.xml with invalid parameters should return errors" do + assert_no_difference 'IssueCategory.count' do + put '/issue_categories/2.xml', {:issue_category => {:name => ''}}, credentials('jsmith') end + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + + assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} end - context "DELETE /issue_categories/1.xml" do - should "destroy issue categories" do - assert_difference 'IssueCategory.count', -1 do - delete '/issue_categories/1.xml', {}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_nil IssueCategory.find_by_id(1) + test "DELETE /issue_categories/:id.xml should destroy the issue category" do + assert_difference 'IssueCategory.count', -1 do + delete '/issue_categories/1.xml', {}, credentials('jsmith') end + assert_response :ok + assert_equal '', @response.body + assert_nil IssueCategory.find_by_id(1) + end - should "reassign issues with :reassign_to_id param" do - issue_count = Issue.count(:conditions => {:category_id => 1}) - assert issue_count > 0 - - assert_difference 'IssueCategory.count', -1 do - assert_difference 'Issue.count(:conditions => {:category_id => 2})', 3 do - delete '/issue_categories/1.xml', {:reassign_to_id => 2}, credentials('jsmith') - end + test "DELETE /issue_categories/:id.xml should reassign issues with :reassign_to_id param" do + issue_count = Issue.where(:category_id => 1).count + assert issue_count > 0 + + assert_difference 'IssueCategory.count', -1 do + assert_difference 'Issue.where(:category_id => 2).count', 3 do + delete '/issue_categories/1.xml', {:reassign_to_id => 2}, credentials('jsmith') end - assert_response :ok - assert_equal '', @response.body - assert_nil IssueCategory.find_by_id(1) end + assert_response :ok + assert_equal '', @response.body + assert_nil IssueCategory.find_by_id(1) end end diff -Nru redmine-2.3.3/test/integration/api_test/issue_relations_test.rb redmine-2.4.2/test/integration/api_test/issue_relations_test.rb --- redmine-2.3.3/test/integration/api_test/issue_relations_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/issue_relations_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -31,76 +31,62 @@ Setting.rest_api_enabled = '1' end - context "/issues/:issue_id/relations" do - context "GET" do - should "return issue relations" do - get '/issues/9/relations.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'relations', - :attributes => { :type => 'array' }, - :child => { - :tag => 'relation', - :child => { - :tag => 'id', - :content => '1' - } - } - end - end + test "GET /issues/:issue_id/relations.xml should return issue relations" do + get '/issues/9/relations.xml', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_tag :tag => 'relations', + :attributes => { :type => 'array' }, + :child => { + :tag => 'relation', + :child => { + :tag => 'id', + :content => '1' + } + } + end - context "POST" do - should "create a relation" do - assert_difference('IssueRelation.count') do - post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'relates'}}, credentials('jsmith') - end - - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 2, relation.issue_from_id - assert_equal 7, relation.issue_to_id - assert_equal 'relates', relation.relation_type - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'relation', :child => {:tag => 'id', :content => relation.id.to_s} - end - - context "with failure" do - should "return the errors" do - assert_no_difference('IssueRelation.count') do - post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'foo'}}, credentials('jsmith') - end - - assert_response :unprocessable_entity - assert_tag :errors, :child => {:tag => 'error', :content => /relation_type is not included in the list/} - end - end + test "POST /issues/:issue_id/relations.xml should create the relation" do + assert_difference('IssueRelation.count') do + post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'relates'}}, credentials('jsmith') end + + relation = IssueRelation.first(:order => 'id DESC') + assert_equal 2, relation.issue_from_id + assert_equal 7, relation.issue_to_id + assert_equal 'relates', relation.relation_type + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_tag 'relation', :child => {:tag => 'id', :content => relation.id.to_s} end - context "/relations/:id" do - context "GET" do - should "return the relation" do - get '/relations/2.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag 'relation', :child => {:tag => 'id', :content => '2'} - end + test "POST /issues/:issue_id/relations.xml with failure should return errors" do + assert_no_difference('IssueRelation.count') do + post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'foo'}}, credentials('jsmith') end - context "DELETE" do - should "delete the relation" do - assert_difference('IssueRelation.count', -1) do - delete '/relations/2.xml', {}, credentials('jsmith') - end - - assert_response :ok - assert_equal '', @response.body - assert_nil IssueRelation.find_by_id(2) - end + assert_response :unprocessable_entity + assert_tag :errors, :child => {:tag => 'error', :content => /relation_type is not included in the list/} + end + + test "GET /relations/:id.xml should return the relation" do + get '/relations/2.xml', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag 'relation', :child => {:tag => 'id', :content => '2'} + end + + test "DELETE /relations/:id.xml should delete the relation" do + assert_difference('IssueRelation.count', -1) do + delete '/relations/2.xml', {}, credentials('jsmith') end + + assert_response :ok + assert_equal '', @response.body + assert_nil IssueRelation.find_by_id(2) end end diff -Nru redmine-2.3.3/test/integration/api_test/issue_statuses_test.rb redmine-2.4.2/test/integration/api_test/issue_statuses_test.rb --- redmine-2.3.3/test/integration/api_test/issue_statuses_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/issue_statuses_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,28 +24,23 @@ Setting.rest_api_enabled = '1' end - context "/issue_statuses" do - context "GET" do + test "GET /issue_statuses.xml should return issue statuses" do + get '/issue_statuses.xml' - should "return issue statuses" do - get '/issue_statuses.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_statuses', - :attributes => {:type => 'array'}, - :child => { - :tag => 'issue_status', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Assigned' - } - } + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'issue_statuses', + :attributes => {:type => 'array'}, + :child => { + :tag => 'issue_status', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'name', + :content => 'Assigned' } - end - end + } + } end end diff -Nru redmine-2.3.3/test/integration/api_test/issues_test.rb redmine-2.4.2/test/integration/api_test/issues_test.rb --- redmine-2.3.3/test/integration/api_test/issues_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/issues_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -138,9 +138,9 @@ get '/issues.xml', {:set_filter => 1, :f => ['cf_1'], :op => {:cf_1 => '='}, :v => {:cf_1 => ['MySQL']}} - expected_ids = Issue.visible.all( - :include => :custom_values, - :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id) + expected_ids = Issue.visible. + joins(:custom_values). + where(:custom_values => {:custom_field_id => 1, :value => 'MySQL'}).map(&:id) assert_select 'issues > issue > id', :count => expected_ids.count do |ids| ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } end @@ -151,9 +151,9 @@ should "show only issues with the custom field value" do get '/issues.xml', { :cf_1 => 'MySQL' } - expected_ids = Issue.visible.all( - :include => :custom_values, - :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id) + expected_ids = Issue.visible. + joins(:custom_values). + where(:custom_values => {:custom_field_id => 1, :value => 'MySQL'}).map(&:id) assert_select 'issues > issue > id', :count => expected_ids.count do |ids| ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } @@ -170,7 +170,7 @@ should "show only issues with the status_id" do get '/issues.xml?status_id=5' - expected_ids = Issue.visible.all(:conditions => {:status_id => 5}).map(&:id) + expected_ids = Issue.visible.where(:status_id => 5).map(&:id) assert_select 'issues > issue > id', :count => expected_ids.count do |ids| ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } diff -Nru redmine-2.3.3/test/integration/api_test/memberships_test.rb redmine-2.4.2/test/integration/api_test/memberships_test.rb --- redmine-2.3.3/test/integration/api_test/memberships_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/memberships_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,177 +24,149 @@ Setting.rest_api_enabled = '1' end - context "/projects/:project_id/memberships" do - context "GET" do - context "xml" do - should "return memberships" do - get '/projects/1/memberships.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'memberships', - :attributes => {:type => 'array'}, - :child => { - :tag => 'membership', + test "GET /projects/:project_id/memberships.xml should return memberships" do + get '/projects/1/memberships.xml', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'memberships', + :attributes => {:type => 'array'}, + :child => { + :tag => 'membership', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'user', + :attributes => {:id => '3', :name => 'Dave Lopper'}, + :sibling => { + :tag => 'roles', :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'user', - :attributes => {:id => '3', :name => 'Dave Lopper'}, - :sibling => { - :tag => 'roles', - :child => { - :tag => 'role', - :attributes => {:id => '2', :name => 'Developer'} - } - } - } + :tag => 'role', + :attributes => {:id => '2', :name => 'Developer'} } } - end - end + } + } + } + end + + test "GET /projects/:project_id/memberships.json should return memberships" do + get '/projects/1/memberships.json', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/json', @response.content_type + json = ActiveSupport::JSON.decode(response.body) + assert_equal({ + "memberships" => + [{"id"=>1, + "project" => {"name"=>"eCookbook", "id"=>1}, + "roles" => [{"name"=>"Manager", "id"=>1}], + "user" => {"name"=>"John Smith", "id"=>2}}, + {"id"=>2, + "project" => {"name"=>"eCookbook", "id"=>1}, + "roles" => [{"name"=>"Developer", "id"=>2}], + "user" => {"name"=>"Dave Lopper", "id"=>3}}], + "limit" => 25, + "total_count" => 2, + "offset" => 0}, + json) + end - context "json" do - should "return memberships" do - get '/projects/1/memberships.json', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_equal({ - "memberships" => - [{"id"=>1, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Manager", "id"=>1}], - "user" => {"name"=>"John Smith", "id"=>2}}, - {"id"=>2, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Developer", "id"=>2}], - "user" => {"name"=>"Dave Lopper", "id"=>3}}], - "limit" => 25, - "total_count" => 2, - "offset" => 0}, - json) - end - end + test "POST /projects/:project_id/memberships.xml should create the membership" do + assert_difference 'Member.count' do + post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith') + + assert_response :created end + end - context "POST" do - context "xml" do - should "create membership" do - assert_difference 'Member.count' do - post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith') - - assert_response :created - end - end - - should "return errors on failure" do - assert_no_difference 'Member.count' do - post '/projects/1/memberships.xml', {:membership => {:role_ids => [2,3]}}, credentials('jsmith') - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"} - end - end - end + test "POST /projects/:project_id/memberships.xml with invalid parameters should return errors" do + assert_no_difference 'Member.count' do + post '/projects/1/memberships.xml', {:membership => {:role_ids => [2,3]}}, credentials('jsmith') + + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"} end end - context "/memberships/:id" do - context "GET" do - context "xml" do - should "return the membership" do - get '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'membership', + test "GET /memberships/:id.xml should return the membership" do + get '/memberships/2.xml', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'membership', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'user', + :attributes => {:id => '3', :name => 'Dave Lopper'}, + :sibling => { + :tag => 'roles', :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'user', - :attributes => {:id => '3', :name => 'Dave Lopper'}, - :sibling => { - :tag => 'roles', - :child => { - :tag => 'role', - :attributes => {:id => '2', :name => 'Developer'} - } - } - } + :tag => 'role', + :attributes => {:id => '2', :name => 'Developer'} } - end - end + } + } + } + end - context "json" do - should "return the membership" do - get '/memberships/2.json', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_equal( - {"membership" => { - "id" => 2, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Developer", "id"=>2}], - "user" => {"name"=>"Dave Lopper", "id"=>3}} - }, - json) - end - end + test "GET /memberships/:id.json should return the membership" do + get '/memberships/2.json', {}, credentials('jsmith') + + assert_response :success + assert_equal 'application/json', @response.content_type + json = ActiveSupport::JSON.decode(response.body) + assert_equal( + {"membership" => { + "id" => 2, + "project" => {"name"=>"eCookbook", "id"=>1}, + "roles" => [{"name"=>"Developer", "id"=>2}], + "user" => {"name"=>"Dave Lopper", "id"=>3}} + }, + json) + end + + test "PUT /memberships/:id.xml should update the membership" do + assert_not_equal [1,2], Member.find(2).role_ids.sort + assert_no_difference 'Member.count' do + put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith') + + assert_response :ok + assert_equal '', @response.body end + member = Member.find(2) + assert_equal [1,2], member.role_ids.sort + end + + test "PUT /memberships/:id.xml with invalid parameters should return errors" do + put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith') - context "PUT" do - context "xml" do - should "update membership" do - assert_not_equal [1,2], Member.find(2).role_ids.sort - assert_no_difference 'Member.count' do - put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - end - member = Member.find(2) - assert_equal [1,2], member.role_ids.sort - end - - should "return errors on failure" do - put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith') - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/} - end - end + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/} + end + + test "DELETE /memberships/:id.xml should destroy the membership" do + assert_difference 'Member.count', -1 do + delete '/memberships/2.xml', {}, credentials('jsmith') + + assert_response :ok + assert_equal '', @response.body end + assert_nil Member.find_by_id(2) + end + + test "DELETE /memberships/:id.xml should respond with 422 on failure" do + assert_no_difference 'Member.count' do + # A membership with an inherited role can't be deleted + Member.find(2).member_roles.first.update_attribute :inherited_from, 99 + delete '/memberships/2.xml', {}, credentials('jsmith') - context "DELETE" do - context "xml" do - should "destroy membership" do - assert_difference 'Member.count', -1 do - delete '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - end - assert_nil Member.find_by_id(2) - end - - should "respond with 422 on failure" do - assert_no_difference 'Member.count' do - # A membership with an inherited role can't be deleted - Member.find(2).member_roles.first.update_attribute :inherited_from, 99 - delete '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :unprocessable_entity - end - end - end + assert_response :unprocessable_entity end end end diff -Nru redmine-2.3.3/test/integration/api_test/news_test.rb redmine-2.4.2/test/integration/api_test/news_test.rb --- redmine-2.3.3/test/integration/api_test/news_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/news_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -31,67 +31,54 @@ Setting.rest_api_enabled = '1' end - context "GET /news" do - context ".xml" do - should "return news" do - get '/news.xml' - - assert_tag :tag => 'news', - :attributes => {:type => 'array'}, - :child => { - :tag => 'news', - :child => { - :tag => 'id', - :content => '2' - } - } - end - end - - context ".json" do - should "return news" do - get '/news.json' - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['news'] - assert_kind_of Hash, json['news'].first - assert_equal 2, json['news'].first['id'] - end - end + should_allow_api_authentication(:get, "/projects/onlinestore/news.xml") + should_allow_api_authentication(:get, "/projects/onlinestore/news.json") + + test "GET /news.xml should return news" do + get '/news.xml' + + assert_tag :tag => 'news', + :attributes => {:type => 'array'}, + :child => { + :tag => 'news', + :child => { + :tag => 'id', + :content => '2' + } + } + end + + test "GET /news.json should return news" do + get '/news.json' + + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Array, json['news'] + assert_kind_of Hash, json['news'].first + assert_equal 2, json['news'].first['id'] end - context "GET /projects/:project_id/news" do - context ".xml" do - should_allow_api_authentication(:get, "/projects/onlinestore/news.xml") - - should "return news" do - get '/projects/ecookbook/news.xml' - - assert_tag :tag => 'news', - :attributes => {:type => 'array'}, - :child => { - :tag => 'news', - :child => { - :tag => 'id', - :content => '2' - } - } - end - end - - context ".json" do - should_allow_api_authentication(:get, "/projects/onlinestore/news.json") - - should "return news" do - get '/projects/ecookbook/news.json' - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['news'] - assert_kind_of Hash, json['news'].first - assert_equal 2, json['news'].first['id'] - end - end + test "GET /projects/:project_id/news.xml should return news" do + get '/projects/ecookbook/news.xml' + + assert_tag :tag => 'news', + :attributes => {:type => 'array'}, + :child => { + :tag => 'news', + :child => { + :tag => 'id', + :content => '2' + } + } + end + + test "GET /projects/:project_id/news.json should return news" do + get '/projects/ecookbook/news.json' + + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Array, json['news'] + assert_kind_of Hash, json['news'].first + assert_equal 2, json['news'].first['id'] end end diff -Nru redmine-2.3.3/test/integration/api_test/projects_test.rb redmine-2.4.2/test/integration/api_test/projects_test.rb --- redmine-2.3.3/test/integration/api_test/projects_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/projects_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -27,271 +27,209 @@ set_tmp_attachments_directory end - context "GET /projects" do - context ".xml" do - should "return projects" do - get '/projects.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'projects', - :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}} - end - end + # TODO: A private project is needed because should_allow_api_authentication + # actually tests that authentication is *required*, not just allowed + should_allow_api_authentication(:get, "/projects/2.xml") + should_allow_api_authentication(:get, "/projects/2.json") + should_allow_api_authentication(:post, + '/projects.xml', + {:project => {:name => 'API test', :identifier => 'api-test'}}, + {:success_code => :created}) + should_allow_api_authentication(:put, + '/projects/2.xml', + {:project => {:name => 'API update'}}, + {:success_code => :ok}) + should_allow_api_authentication(:delete, + '/projects/2.xml', + {}, + {:success_code => :ok}) + + test "GET /projects.xml should return projects" do + get '/projects.xml' + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_tag :tag => 'projects', + :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}} + end + + test "GET /projects.json should return projects" do + get '/projects.json' + assert_response :success + assert_equal 'application/json', @response.content_type + + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Array, json['projects'] + assert_kind_of Hash, json['projects'].first + assert json['projects'].first.has_key?('id') + end + + test "GET /projects/:id.xml should return the project" do + get '/projects/1.xml' + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_tag :tag => 'project', + :child => {:tag => 'id', :content => '1'} + assert_tag :tag => 'custom_field', + :attributes => {:name => 'Development status'}, :content => 'Stable' + + assert_no_tag 'trackers' + assert_no_tag 'issue_categories' + end + + test "GET /projects/:id.json should return the project" do + get '/projects/1.json' + + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Hash, json['project'] + assert_equal 1, json['project']['id'] + end + + test "GET /projects/:id.xml with hidden custom fields should not display hidden custom fields" do + ProjectCustomField.find_by_name('Development status').update_attribute :visible, false + + get '/projects/1.xml' + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_no_tag 'custom_field', + :attributes => {:name => 'Development status'} + end - context ".json" do - should "return projects" do - get '/projects.json' - assert_response :success - assert_equal 'application/json', @response.content_type - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['projects'] - assert_kind_of Hash, json['projects'].first - assert json['projects'].first.has_key?('id') - end + test "GET /projects/:id.xml with include=issue_categories should return categories" do + get '/projects/1.xml?include=issue_categories' + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_tag 'issue_categories', + :attributes => {:type => 'array'}, + :child => { + :tag => 'issue_category', + :attributes => { + :id => '2', + :name => 'Recipes' + } + } + end + + test "GET /projects/:id.xml with include=trackers should return trackers" do + get '/projects/1.xml?include=trackers' + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_tag 'trackers', + :attributes => {:type => 'array'}, + :child => { + :tag => 'tracker', + :attributes => { + :id => '2', + :name => 'Feature request' + } + } + end + + test "POST /projects.xml with valid parameters should create the project" do + Setting.default_projects_modules = ['issue_tracking', 'repository'] + + assert_difference('Project.count') do + post '/projects.xml', + {:project => {:name => 'API test', :identifier => 'api-test'}}, + credentials('admin') end + + project = Project.first(:order => 'id DESC') + assert_equal 'API test', project.name + assert_equal 'api-test', project.identifier + assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort + assert_equal Tracker.all.size, project.trackers.size + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s} end - context "GET /projects/:id" do - context ".xml" do - # TODO: A private project is needed because should_allow_api_authentication - # actually tests that authentication is *required*, not just allowed - should_allow_api_authentication(:get, "/projects/2.xml") - - should "return requested project" do - get '/projects/1.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'project', - :child => {:tag => 'id', :content => '1'} - assert_tag :tag => 'custom_field', - :attributes => {:name => 'Development status'}, :content => 'Stable' - - assert_no_tag 'trackers' - assert_no_tag 'issue_categories' - end - - context "with hidden custom fields" do - setup do - ProjectCustomField.find_by_name('Development status').update_attribute :visible, false - end - - should "not display hidden custom fields" do - get '/projects/1.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_no_tag 'custom_field', - :attributes => {:name => 'Development status'} - end - end - - should "return categories with include=issue_categories" do - get '/projects/1.xml?include=issue_categories' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag 'issue_categories', - :attributes => {:type => 'array'}, - :child => { - :tag => 'issue_category', - :attributes => { - :id => '2', - :name => 'Recipes' - } - } - end - - should "return trackers with include=trackers" do - get '/projects/1.xml?include=trackers' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag 'trackers', - :attributes => {:type => 'array'}, - :child => { - :tag => 'tracker', - :attributes => { - :id => '2', - :name => 'Feature request' - } - } - end + test "POST /projects.xml should accept enabled_module_names attribute" do + assert_difference('Project.count') do + post '/projects.xml', + {:project => {:name => 'API test', :identifier => 'api-test', :enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}}, + credentials('admin') end - context ".json" do - should_allow_api_authentication(:get, "/projects/2.json") + project = Project.first(:order => 'id DESC') + assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort + end + + test "POST /projects.xml should accept tracker_ids attribute" do + assert_difference('Project.count') do + post '/projects.xml', + {:project => {:name => 'API test', :identifier => 'api-test', :tracker_ids => [1, 3]}}, + credentials('admin') + end - should "return requested project" do - get '/projects/1.json' + project = Project.first(:order => 'id DESC') + assert_equal [1, 3], project.trackers.map(&:id).sort + end - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['project'] - assert_equal 1, json['project']['id'] - end + test "POST /projects.xml with invalid parameters should return errors" do + assert_no_difference('Project.count') do + post '/projects.xml', {:project => {:name => 'API test'}}, credentials('admin') end + + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"} end - context "POST /projects" do - context "with valid parameters" do - setup do - Setting.default_projects_modules = ['issue_tracking', 'repository'] - @parameters = {:project => {:name => 'API test', :identifier => 'api-test'}} - end - - context ".xml" do - should_allow_api_authentication(:post, - '/projects.xml', - {:project => {:name => 'API test', :identifier => 'api-test'}}, - {:success_code => :created}) - - - should "create a project with the attributes" do - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal 'API test', project.name - assert_equal 'api-test', project.identifier - assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort - assert_equal Tracker.all.size, project.trackers.size - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s} - end - - should "accept enabled_module_names attribute" do - @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}) - - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort - end - - should "accept tracker_ids attribute" do - @parameters[:project].merge!({:tracker_ids => [1, 3]}) - - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal [1, 3], project.trackers.map(&:id).sort - end - end + test "PUT /projects/:id.xml with valid parameters should update the project" do + assert_no_difference 'Project.count' do + put '/projects/2.xml', {:project => {:name => 'API update'}}, credentials('jsmith') end + assert_response :ok + assert_equal '', @response.body + assert_equal 'application/xml', @response.content_type + project = Project.find(2) + assert_equal 'API update', project.name + end - context "with invalid parameters" do - setup do - @parameters = {:project => {:name => 'API test'}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"} - end - end + test "PUT /projects/:id.xml should accept enabled_module_names attribute" do + assert_no_difference 'Project.count' do + put '/projects/2.xml', {:project => {:name => 'API update', :enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}}, credentials('admin') end + assert_response :ok + assert_equal '', @response.body + project = Project.find(2) + assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort end - context "PUT /projects/:id" do - context "with valid parameters" do - setup do - @parameters = {:project => {:name => 'API update'}} - end - - context ".xml" do - should_allow_api_authentication(:put, - '/projects/2.xml', - {:project => {:name => 'API update'}}, - {:success_code => :ok}) - - should "update the project" do - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'application/xml', @response.content_type - project = Project.find(2) - assert_equal 'API update', project.name - end - - should "accept enabled_module_names attribute" do - @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}) - - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - project = Project.find(2) - assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort - end - - should "accept tracker_ids attribute" do - @parameters[:project].merge!({:tracker_ids => [1, 3]}) - - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - project = Project.find(2) - assert_equal [1, 3], project.trackers.map(&:id).sort - end - end + test "PUT /projects/:id.xml should accept tracker_ids attribute" do + assert_no_difference 'Project.count' do + put '/projects/2.xml', {:project => {:name => 'API update', :tracker_ids => [1, 3]}}, credentials('admin') end + assert_response :ok + assert_equal '', @response.body + project = Project.find(2) + assert_equal [1, 3], project.trackers.map(&:id).sort + end - context "with invalid parameters" do - setup do - @parameters = {:project => {:name => ''}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('Project.count') do - put '/projects/2.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end - end + test "PUT /projects/:id.xml with invalid parameters should return errors" do + assert_no_difference('Project.count') do + put '/projects/2.xml', {:project => {:name => ''}}, credentials('admin') end + + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} end - context "DELETE /projects/:id" do - context ".xml" do - should_allow_api_authentication(:delete, - '/projects/2.xml', - {}, - {:success_code => :ok}) - - should "delete the project" do - assert_difference('Project.count',-1) do - delete '/projects/2.xml', {}, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - assert_nil Project.find_by_id(2) - end + test "DELETE /projects/:id.xml should delete the project" do + assert_difference('Project.count',-1) do + delete '/projects/2.xml', {}, credentials('admin') end + assert_response :ok + assert_equal '', @response.body + assert_nil Project.find_by_id(2) end end diff -Nru redmine-2.3.3/test/integration/api_test/queries_test.rb redmine-2.4.2/test/integration/api_test/queries_test.rb --- redmine-2.3.3/test/integration/api_test/queries_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/queries_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -31,28 +31,23 @@ Setting.rest_api_enabled = '1' end - context "/queries" do - context "GET" do + test "GET /queries.xml should return queries" do + get '/queries.xml' - should "return queries" do - get '/queries.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'queries', - :attributes => {:type => 'array'}, - :child => { - :tag => 'query', - :child => { - :tag => 'id', - :content => '4', - :sibling => { - :tag => 'name', - :content => 'Public query for all projects' - } - } + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'queries', + :attributes => {:type => 'array'}, + :child => { + :tag => 'query', + :child => { + :tag => 'id', + :content => '4', + :sibling => { + :tag => 'name', + :content => 'Public query for all projects' } - end - end + } + } end end diff -Nru redmine-2.3.3/test/integration/api_test/roles_test.rb redmine-2.4.2/test/integration/api_test/roles_test.rb --- redmine-2.3.3/test/integration/api_test/roles_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/roles_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,66 +24,52 @@ Setting.rest_api_enabled = '1' end - context "/roles" do - context "GET" do - context "xml" do - should "return the roles" do - get '/roles.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_equal 3, assigns(:roles).size - - assert_tag :tag => 'roles', - :attributes => {:type => 'array'}, - :child => { - :tag => 'role', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Developer' - } - } - } - end - end + test "GET /roles.xml should return the roles" do + get '/roles.xml' - context "json" do - should "return the roles" do - get '/roles.json' - - assert_response :success - assert_equal 'application/json', @response.content_type - assert_equal 3, assigns(:roles).size - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['roles'] - assert_include({'id' => 2, 'name' => 'Developer'}, json['roles']) - end - end - end + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_equal 3, assigns(:roles).size + + assert_tag :tag => 'roles', + :attributes => {:type => 'array'}, + :child => { + :tag => 'role', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'name', + :content => 'Developer' + } + } + } + end + + test "GET /roles.json should return the roles" do + get '/roles.json' + + assert_response :success + assert_equal 'application/json', @response.content_type + assert_equal 3, assigns(:roles).size + + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Array, json['roles'] + assert_include({'id' => 2, 'name' => 'Developer'}, json['roles']) end - context "/roles/:id" do - context "GET" do - context "xml" do - should "return the role" do - get '/roles/1.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_select 'role' do - assert_select 'name', :text => 'Manager' - assert_select 'role permissions[type=array]' do - assert_select 'permission', Role.find(1).permissions.size - assert_select 'permission', :text => 'view_issues' - end - end - end + test "GET /roles/:id.xml should return the role" do + get '/roles/1.xml' + + assert_response :success + assert_equal 'application/xml', @response.content_type + + assert_select 'role' do + assert_select 'name', :text => 'Manager' + assert_select 'role permissions[type=array]' do + assert_select 'permission', Role.find(1).permissions.size + assert_select 'permission', :text => 'view_issues' end end end diff -Nru redmine-2.3.3/test/integration/api_test/time_entries_test.rb redmine-2.4.2/test/integration/api_test/time_entries_test.rb --- redmine-2.3.3/test/integration/api_test/time_entries_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/time_entries_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -31,134 +31,112 @@ Setting.rest_api_enabled = '1' end - context "GET /time_entries.xml" do - should "return time entries" do - get '/time_entries.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entries', - :child => {:tag => 'time_entry', :child => {:tag => 'id', :content => '2'}} - end - - context "with limit" do - should "return limited results" do - get '/time_entries.xml?limit=2', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entries', - :children => {:count => 2} - end - end - end - - context "GET /time_entries/2.xml" do - should "return requested time entry" do - get '/time_entries/2.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entry', - :child => {:tag => 'id', :content => '2'} - end - end - - context "POST /time_entries.xml" do - context "with issue_id" do - should "return create time entry" do - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'jsmith', entry.user.login - assert_equal Issue.find(1), entry.issue - assert_equal Project.find(1), entry.project - assert_equal Date.parse('2010-12-02'), entry.spent_on - assert_equal 3.5, entry.hours - assert_equal TimeEntryActivity.find(11), entry.activity - end - - should "accept custom fields" do - field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string') - - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => { - :issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11', :custom_fields => [{:id => field.id.to_s, :value => 'accepted'}] - }}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'accepted', entry.custom_field_value(field) - end - end - - context "with project_id" do - should "return create time entry" do - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'jsmith', entry.user.login - assert_nil entry.issue - assert_equal Project.find(1), entry.project - assert_equal Date.parse('2010-12-02'), entry.spent_on - assert_equal 3.5, entry.hours - assert_equal TimeEntryActivity.find(11), entry.activity - end - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} - end - end - end - - context "PUT /time_entries/2.xml" do - context "with valid parameters" do - should "update time entry" do - assert_no_difference 'TimeEntry.count' do - put '/time_entries/2.xml', {:time_entry => {:comments => 'API Update'}}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'API Update', TimeEntry.find(2).comments - end - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'TimeEntry.count' do - put '/time_entries/2.xml', {:time_entry => {:hours => '', :comments => 'API Update'}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} - end - end - end - - context "DELETE /time_entries/2.xml" do - should "destroy time entry" do - assert_difference 'TimeEntry.count', -1 do - delete '/time_entries/2.xml', {}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_nil TimeEntry.find_by_id(2) + test "GET /time_entries.xml should return time entries" do + get '/time_entries.xml', {}, credentials('jsmith') + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'time_entries', + :child => {:tag => 'time_entry', :child => {:tag => 'id', :content => '2'}} + end + + test "GET /time_entries.xml with limit should return limited results" do + get '/time_entries.xml?limit=2', {}, credentials('jsmith') + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'time_entries', + :children => {:count => 2} + end + + test "GET /time_entries/:id.xml should return the time entry" do + get '/time_entries/2.xml', {}, credentials('jsmith') + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'time_entry', + :child => {:tag => 'id', :content => '2'} + end + + test "POST /time_entries.xml with issue_id should create time entry" do + assert_difference 'TimeEntry.count' do + post '/time_entries.xml', {:time_entry => {:issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') + end + assert_response :created + assert_equal 'application/xml', @response.content_type + + entry = TimeEntry.first(:order => 'id DESC') + assert_equal 'jsmith', entry.user.login + assert_equal Issue.find(1), entry.issue + assert_equal Project.find(1), entry.project + assert_equal Date.parse('2010-12-02'), entry.spent_on + assert_equal 3.5, entry.hours + assert_equal TimeEntryActivity.find(11), entry.activity + end + + test "POST /time_entries.xml with issue_id should accept custom fields" do + field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string') + + assert_difference 'TimeEntry.count' do + post '/time_entries.xml', {:time_entry => { + :issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11', :custom_fields => [{:id => field.id.to_s, :value => 'accepted'}] + }}, credentials('jsmith') + end + assert_response :created + assert_equal 'application/xml', @response.content_type + + entry = TimeEntry.first(:order => 'id DESC') + assert_equal 'accepted', entry.custom_field_value(field) + end + + test "POST /time_entries.xml with project_id should create time entry" do + assert_difference 'TimeEntry.count' do + post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') + end + assert_response :created + assert_equal 'application/xml', @response.content_type + + entry = TimeEntry.first(:order => 'id DESC') + assert_equal 'jsmith', entry.user.login + assert_nil entry.issue + assert_equal Project.find(1), entry.project + assert_equal Date.parse('2010-12-02'), entry.spent_on + assert_equal 3.5, entry.hours + assert_equal TimeEntryActivity.find(11), entry.activity + end + + test "POST /time_entries.xml with invalid parameters should return errors" do + assert_no_difference 'TimeEntry.count' do + post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :activity_id => '11'}}, credentials('jsmith') + end + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + + assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} + end + + test "PUT /time_entries/:id.xml with valid parameters should update time entry" do + assert_no_difference 'TimeEntry.count' do + put '/time_entries/2.xml', {:time_entry => {:comments => 'API Update'}}, credentials('jsmith') + end + assert_response :ok + assert_equal '', @response.body + assert_equal 'API Update', TimeEntry.find(2).comments + end + + test "PUT /time_entries/:id.xml with invalid parameters should return errors" do + assert_no_difference 'TimeEntry.count' do + put '/time_entries/2.xml', {:time_entry => {:hours => '', :comments => 'API Update'}}, credentials('jsmith') + end + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + + assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} + end + + test "DELETE /time_entries/:id.xml should destroy time entry" do + assert_difference 'TimeEntry.count', -1 do + delete '/time_entries/2.xml', {}, credentials('jsmith') end + assert_response :ok + assert_equal '', @response.body + assert_nil TimeEntry.find_by_id(2) end end diff -Nru redmine-2.3.3/test/integration/api_test/token_authentication_test.rb redmine-2.4.2/test/integration/api_test/token_authentication_test.rb --- redmine-2.3.3/test/integration/api_test/token_authentication_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/token_authentication_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -37,13 +37,6 @@ end # Using the NewsController because it's a simple API. - context "get /news" do - context "in :xml format" do - should_allow_key_based_auth(:get, "/news.xml") - end - - context "in :json format" do - should_allow_key_based_auth(:get, "/news.json") - end - end + should_allow_key_based_auth(:get, "/news.xml") + should_allow_key_based_auth(:get, "/news.json") end diff -Nru redmine-2.3.3/test/integration/api_test/trackers_test.rb redmine-2.4.2/test/integration/api_test/trackers_test.rb --- redmine-2.3.3/test/integration/api_test/trackers_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/trackers_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,28 +24,23 @@ Setting.rest_api_enabled = '1' end - context "/trackers" do - context "GET" do + test "GET /trackers.xml should return trackers" do + get '/trackers.xml' - should "return trackers" do - get '/trackers.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'trackers', - :attributes => {:type => 'array'}, - :child => { - :tag => 'tracker', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Feature request' - } - } + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'trackers', + :attributes => {:type => 'array'}, + :child => { + :tag => 'tracker', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'name', + :content => 'Feature request' } - end - end + } + } end end diff -Nru redmine-2.3.3/test/integration/api_test/users_test.rb redmine-2.4.2/test/integration/api_test/users_test.rb --- redmine-2.3.3/test/integration/api_test/users_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/users_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -24,76 +24,96 @@ Setting.rest_api_enabled = '1' end - context "GET /users" do - should_allow_api_authentication(:get, "/users.xml") - should_allow_api_authentication(:get, "/users.json") - end - - context "GET /users/2" do - context ".xml" do - should "return requested user" do - get '/users/2.xml' - - assert_response :success - assert_tag :tag => 'user', - :child => {:tag => 'id', :content => '2'} - end - - context "with include=memberships" do - should "include memberships" do - get '/users/2.xml?include=memberships' - - assert_response :success - assert_tag :tag => 'memberships', - :parent => {:tag => 'user'}, - :children => {:count => 1} - end - end - end + should_allow_api_authentication(:get, "/users.xml") + should_allow_api_authentication(:get, "/users.json") + should_allow_api_authentication(:post, + '/users.xml', + {:user => { + :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', + :mail => 'foo@example.net', :password => 'secret123' + }}, + {:success_code => :created}) + should_allow_api_authentication(:post, + '/users.json', + {:user => { + :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', + :mail => 'foo@example.net' + }}, + {:success_code => :created}) + should_allow_api_authentication(:put, + '/users/2.xml', + {:user => { + :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', + :mail => 'jsmith@somenet.foo' + }}, + {:success_code => :ok}) + should_allow_api_authentication(:put, + '/users/2.json', + {:user => { + :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', + :mail => 'jsmith@somenet.foo' + }}, + {:success_code => :ok}) + should_allow_api_authentication(:delete, + '/users/2.xml', + {}, + {:success_code => :ok}) + should_allow_api_authentication(:delete, + '/users/2.xml', + {}, + {:success_code => :ok}) - context ".json" do - should "return requested user" do - get '/users/2.json' - - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['user'] - assert_equal 2, json['user']['id'] - end - - context "with include=memberships" do - should "include memberships" do - get '/users/2.json?include=memberships' - - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Array, json['user']['memberships'] - assert_equal [{ - "id"=>1, - "project"=>{"name"=>"eCookbook", "id"=>1}, - "roles"=>[{"name"=>"Manager", "id"=>1}] - }], json['user']['memberships'] - end - end - end + test "GET /users/:id.xml should return the user" do + get '/users/2.xml' + + assert_response :success + assert_tag :tag => 'user', + :child => {:tag => 'id', :content => '2'} end - context "GET /users/current" do - context ".xml" do - should "require authentication" do - get '/users/current.xml' - - assert_response 401 - end - - should "return current user" do - get '/users/current.xml', {}, credentials('jsmith') - - assert_tag :tag => 'user', - :child => {:tag => 'id', :content => '2'} - end - end + test "GET /users/:id.json should return the user" do + get '/users/2.json' + + assert_response :success + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Hash, json['user'] + assert_equal 2, json['user']['id'] + end + + test "GET /users/:id.xml with include=memberships should include memberships" do + get '/users/2.xml?include=memberships' + + assert_response :success + assert_tag :tag => 'memberships', + :parent => {:tag => 'user'}, + :children => {:count => 1} + end + + test "GET /users/:id.json with include=memberships should include memberships" do + get '/users/2.json?include=memberships' + + assert_response :success + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Array, json['user']['memberships'] + assert_equal [{ + "id"=>1, + "project"=>{"name"=>"eCookbook", "id"=>1}, + "roles"=>[{"name"=>"Manager", "id"=>1}] + }], json['user']['memberships'] + end + + test "GET /users/current.xml should require authentication" do + get '/users/current.xml' + + assert_response 401 + end + + test "GET /users/current.xml should return current user" do + get '/users/current.xml', {}, credentials('jsmith') + + assert_tag :tag => 'user', + :child => {:tag => 'id', :content => '2'} end test "GET /users/:id should not return login for other user" do @@ -120,252 +140,188 @@ assert_tag 'user', :child => {:tag => 'api_key', :content => User.find(2).api_key} end - context "POST /users" do - context "with valid parameters" do - setup do - @parameters = { - :user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net', :password => 'secret123', - :mail_notification => 'only_assigned' - } - } - end - - context ".xml" do - should_allow_api_authentication(:post, - '/users.xml', - {:user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net', :password => 'secret123' - }}, - {:success_code => :created}) - - should "create a user with the attributes" do - assert_difference('User.count') do - post '/users.xml', @parameters, credentials('admin') - end - - user = User.first(:order => 'id DESC') - assert_equal 'foo', user.login - assert_equal 'Firstname', user.firstname - assert_equal 'Lastname', user.lastname - assert_equal 'foo@example.net', user.mail - assert_equal 'only_assigned', user.mail_notification - assert !user.admin? - assert user.check_password?('secret123') - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s} - end - end - - context ".json" do - should_allow_api_authentication(:post, - '/users.json', - {:user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net' - }}, - {:success_code => :created}) - - should "create a user with the attributes" do - assert_difference('User.count') do - post '/users.json', @parameters, credentials('admin') - end - - user = User.first(:order => 'id DESC') - assert_equal 'foo', user.login - assert_equal 'Firstname', user.firstname - assert_equal 'Lastname', user.lastname - assert_equal 'foo@example.net', user.mail - assert !user.admin? - - assert_response :created - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['user'] - assert_equal user.id, json['user']['id'] - end - end + test "GET /users/:id should not return status for standard user" do + get '/users/3.xml', {}, credentials('jsmith') + assert_response :success + assert_no_tag 'user', :child => {:tag => 'status'} + end + + test "GET /users/:id should return status for administrators" do + get '/users/2.xml', {}, credentials('admin') + assert_response :success + assert_tag 'user', :child => {:tag => 'status', :content => User.find(1).status.to_s} + end + + test "POST /users.xml with valid parameters should create the user" do + assert_difference('User.count') do + post '/users.xml', { + :user => { + :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', + :mail => 'foo@example.net', :password => 'secret123', + :mail_notification => 'only_assigned'} + }, + credentials('admin') end - context "with invalid parameters" do - setup do - @parameters = {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('User.count') do - post '/users.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => { - :tag => 'error', - :content => "First name can't be blank" - } - end - end - - context ".json" do - should "return errors" do - assert_no_difference('User.count') do - post '/users.json', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert json.has_key?('errors') - assert_kind_of Array, json['errors'] - end - end + user = User.first(:order => 'id DESC') + assert_equal 'foo', user.login + assert_equal 'Firstname', user.firstname + assert_equal 'Lastname', user.lastname + assert_equal 'foo@example.net', user.mail + assert_equal 'only_assigned', user.mail_notification + assert !user.admin? + assert user.check_password?('secret123') + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s} + end + + test "POST /users.json with valid parameters should create the user" do + assert_difference('User.count') do + post '/users.json', { + :user => { + :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', + :mail => 'foo@example.net', :password => 'secret123', + :mail_notification => 'only_assigned'} + }, + credentials('admin') end + + user = User.first(:order => 'id DESC') + assert_equal 'foo', user.login + assert_equal 'Firstname', user.firstname + assert_equal 'Lastname', user.lastname + assert_equal 'foo@example.net', user.mail + assert !user.admin? + + assert_response :created + assert_equal 'application/json', @response.content_type + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert_kind_of Hash, json['user'] + assert_equal user.id, json['user']['id'] + end + + test "POST /users.xml with with invalid parameters should return errors" do + assert_no_difference('User.count') do + post '/users.xml', {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}}, credentials('admin') + end + + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => { + :tag => 'error', + :content => "First name can't be blank" + } end - context "PUT /users/2" do - context "with valid parameters" do - setup do - @parameters = { - :user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - } - } - end - - context ".xml" do - should_allow_api_authentication(:put, - '/users/2.xml', - {:user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - }}, - {:success_code => :ok}) - - should "update user with the attributes" do - assert_no_difference('User.count') do - put '/users/2.xml', @parameters, credentials('admin') - end - - user = User.find(2) - assert_equal 'jsmith', user.login - assert_equal 'John', user.firstname - assert_equal 'Renamed', user.lastname - assert_equal 'jsmith@somenet.foo', user.mail - assert !user.admin? - - assert_response :ok - assert_equal '', @response.body - end - end - - context ".json" do - should_allow_api_authentication(:put, - '/users/2.json', - {:user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - }}, - {:success_code => :ok}) - - should "update user with the attributes" do - assert_no_difference('User.count') do - put '/users/2.json', @parameters, credentials('admin') - end - - user = User.find(2) - assert_equal 'jsmith', user.login - assert_equal 'John', user.firstname - assert_equal 'Renamed', user.lastname - assert_equal 'jsmith@somenet.foo', user.mail - assert !user.admin? - - assert_response :ok - assert_equal '', @response.body - end - end + test "POST /users.json with with invalid parameters should return errors" do + assert_no_difference('User.count') do + post '/users.json', {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}}, credentials('admin') end - context "with invalid parameters" do - setup do - @parameters = { - :user => { - :login => 'jsmith', :firstname => '', :lastname => 'Lastname', - :mail => 'foo' - } - } - end - - context ".xml" do - should "return errors" do - assert_no_difference('User.count') do - put '/users/2.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => { - :tag => 'error', - :content => "First name can't be blank" - } - end - end - - context ".json" do - should "return errors" do - assert_no_difference('User.count') do - put '/users/2.json', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert json.has_key?('errors') - assert_kind_of Array, json['errors'] - end - end + assert_response :unprocessable_entity + assert_equal 'application/json', @response.content_type + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert json.has_key?('errors') + assert_kind_of Array, json['errors'] + end + + test "PUT /users/:id.xml with valid parameters should update the user" do + assert_no_difference('User.count') do + put '/users/2.xml', { + :user => { + :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', + :mail => 'jsmith@somenet.foo'} + }, + credentials('admin') end + + user = User.find(2) + assert_equal 'jsmith', user.login + assert_equal 'John', user.firstname + assert_equal 'Renamed', user.lastname + assert_equal 'jsmith@somenet.foo', user.mail + assert !user.admin? + + assert_response :ok + assert_equal '', @response.body + end + + test "PUT /users/:id.json with valid parameters should update the user" do + assert_no_difference('User.count') do + put '/users/2.json', { + :user => { + :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', + :mail => 'jsmith@somenet.foo'} + }, + credentials('admin') + end + + user = User.find(2) + assert_equal 'jsmith', user.login + assert_equal 'John', user.firstname + assert_equal 'Renamed', user.lastname + assert_equal 'jsmith@somenet.foo', user.mail + assert !user.admin? + + assert_response :ok + assert_equal '', @response.body + end + + test "PUT /users/:id.xml with invalid parameters" do + assert_no_difference('User.count') do + put '/users/2.xml', { + :user => { + :login => 'jsmith', :firstname => '', :lastname => 'Lastname', + :mail => 'foo'} + }, + credentials('admin') + end + + assert_response :unprocessable_entity + assert_equal 'application/xml', @response.content_type + assert_tag 'errors', :child => { + :tag => 'error', + :content => "First name can't be blank" + } + end + + test "PUT /users/:id.json with invalid parameters" do + assert_no_difference('User.count') do + put '/users/2.json', { + :user => { + :login => 'jsmith', :firstname => '', :lastname => 'Lastname', + :mail => 'foo'} + }, + credentials('admin') + end + + assert_response :unprocessable_entity + assert_equal 'application/json', @response.content_type + json = ActiveSupport::JSON.decode(response.body) + assert_kind_of Hash, json + assert json.has_key?('errors') + assert_kind_of Array, json['errors'] end - context "DELETE /users/2" do - context ".xml" do - should_allow_api_authentication(:delete, - '/users/2.xml', - {}, - {:success_code => :ok}) - - should "delete user" do - assert_difference('User.count', -1) do - delete '/users/2.xml', {}, credentials('admin') - end - - assert_response :ok - assert_equal '', @response.body - end + test "DELETE /users/:id.xml should delete the user" do + assert_difference('User.count', -1) do + delete '/users/2.xml', {}, credentials('admin') end - context ".json" do - should_allow_api_authentication(:delete, - '/users/2.xml', - {}, - {:success_code => :ok}) - - should "delete user" do - assert_difference('User.count', -1) do - delete '/users/2.json', {}, credentials('admin') - end - - assert_response :ok - assert_equal '', @response.body - end + assert_response :ok + assert_equal '', @response.body + end + + test "DELETE /users/:id.json should delete the user" do + assert_difference('User.count', -1) do + delete '/users/2.json', {}, credentials('admin') end + + assert_response :ok + assert_equal '', @response.body end end diff -Nru redmine-2.3.3/test/integration/api_test/versions_test.rb redmine-2.4.2/test/integration/api_test/versions_test.rb --- redmine-2.3.3/test/integration/api_test/versions_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/versions_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -31,128 +31,112 @@ Setting.rest_api_enabled = '1' end - context "/projects/:project_id/versions" do - context "GET" do - should "return project versions" do - get '/projects/1/versions.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'versions', - :attributes => {:type => 'array'}, - :child => { - :tag => 'version', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => '1.0' - } - } + test "GET /projects/:project_id/versions.xml should return project versions" do + get '/projects/1/versions.xml' + + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_tag :tag => 'versions', + :attributes => {:type => 'array'}, + :child => { + :tag => 'version', + :child => { + :tag => 'id', + :content => '2', + :sibling => { + :tag => 'name', + :content => '1.0' + } + } + } + end + + test "POST /projects/:project_id/versions.xml should create the version" do + assert_difference 'Version.count' do + post '/projects/1/versions.xml', {:version => {:name => 'API test'}}, credentials('jsmith') + end + + version = Version.first(:order => 'id DESC') + assert_equal 'API test', version.name + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} + end + + test "POST /projects/:project_id/versions.xml should create the version with due date" do + assert_difference 'Version.count' do + post '/projects/1/versions.xml', {:version => {:name => 'API test', :due_date => '2012-01-24'}}, credentials('jsmith') + end + + version = Version.first(:order => 'id DESC') + assert_equal 'API test', version.name + assert_equal Date.parse('2012-01-24'), version.due_date + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} + end + + test "POST /projects/:project_id/versions.xml should create the version with custom fields" do + field = VersionCustomField.generate! + + assert_difference 'Version.count' do + post '/projects/1/versions.xml', { + :version => { + :name => 'API test', + :custom_fields => [ + {'id' => field.id.to_s, 'value' => 'Some value'} + ] } - end + }, credentials('jsmith') end - context "POST" do - should "create the version" do - assert_difference 'Version.count' do - post '/projects/1/versions.xml', {:version => {:name => 'API test'}}, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} - end - - should "create the version with due date" do - assert_difference 'Version.count' do - post '/projects/1/versions.xml', {:version => {:name => 'API test', :due_date => '2012-01-24'}}, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - assert_equal Date.parse('2012-01-24'), version.due_date - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} - end - - should "create the version with custom fields" do - field = VersionCustomField.generate! - - assert_difference 'Version.count' do - post '/projects/1/versions.xml', { - :version => { - :name => 'API test', - :custom_fields => [ - {'id' => field.id.to_s, 'value' => 'Some value'} - ] - } - }, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - assert_equal 'Some value', version.custom_field_value(field) - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_select 'version>custom_fields>custom_field[id=?]>value', field.id.to_s, 'Some value' - end - - context "with failure" do - should "return the errors" do - assert_no_difference('Version.count') do - post '/projects/1/versions.xml', {:version => {:name => ''}}, credentials('jsmith') - end - - assert_response :unprocessable_entity - assert_tag :errors, :child => {:tag => 'error', :content => "Name can't be blank"} - end - end - end - end - - context "/versions/:id" do - context "GET" do - should "return the version" do - get '/versions/2.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_select 'version' do - assert_select 'id', :text => '2' - assert_select 'name', :text => '1.0' - assert_select 'sharing', :text => 'none' - end - end - end - - context "PUT" do - should "update the version" do - put '/versions/2.xml', {:version => {:name => 'API update'}}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - assert_equal 'API update', Version.find(2).name - end - end - - context "DELETE" do - should "destroy the version" do - assert_difference 'Version.count', -1 do - delete '/versions/3.xml', {}, credentials('jsmith') - end - - assert_response :ok - assert_equal '', @response.body - assert_nil Version.find_by_id(3) - end + version = Version.first(:order => 'id DESC') + assert_equal 'API test', version.name + assert_equal 'Some value', version.custom_field_value(field) + + assert_response :created + assert_equal 'application/xml', @response.content_type + assert_select 'version>custom_fields>custom_field[id=?]>value', field.id.to_s, 'Some value' + end + + test "POST /projects/:project_id/versions.xml with failure should return the errors" do + assert_no_difference('Version.count') do + post '/projects/1/versions.xml', {:version => {:name => ''}}, credentials('jsmith') + end + + assert_response :unprocessable_entity + assert_tag :errors, :child => {:tag => 'error', :content => "Name can't be blank"} + end + + test "GET /versions/:id.xml should return the version" do + get '/versions/2.xml' + + assert_response :success + assert_equal 'application/xml', @response.content_type + assert_select 'version' do + assert_select 'id', :text => '2' + assert_select 'name', :text => '1.0' + assert_select 'sharing', :text => 'none' end end + + test "PUT /versions/:id.xml should update the version" do + put '/versions/2.xml', {:version => {:name => 'API update'}}, credentials('jsmith') + + assert_response :ok + assert_equal '', @response.body + assert_equal 'API update', Version.find(2).name + end + + test "DELETE /versions/:id.xml should destroy the version" do + assert_difference 'Version.count', -1 do + delete '/versions/3.xml', {}, credentials('jsmith') + end + + assert_response :ok + assert_equal '', @response.body + assert_nil Version.find_by_id(3) + end end diff -Nru redmine-2.3.3/test/integration/api_test/wiki_pages_test.rb redmine-2.4.2/test/integration/api_test/wiki_pages_test.rb --- redmine-2.3.3/test/integration/api_test/wiki_pages_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/api_test/wiki_pages_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -90,6 +90,7 @@ assert_select 'version', :text => '2' assert_select 'text' assert_select 'author' + assert_select 'comments', :text => 'Small update' assert_select 'created_on' assert_select 'updated_on' end diff -Nru redmine-2.3.3/test/integration/application_test.rb redmine-2.4.2/test/integration/application_test.rb --- redmine-2.3.3/test/integration/application_test.rb 2013-09-14 06:48:04.000000000 +0000 +++ redmine-2.4.2/test/integration/application_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -36,17 +36,20 @@ assert_response :success assert_tag :tag => 'h2', :content => 'Projets' assert_equal :fr, current_language + assert_select "html[lang=?]", "fr" # then an italien user get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'it;q=0.8,en-us;q=0.5,en;q=0.3' assert_response :success assert_tag :tag => 'h2', :content => 'Progetti' assert_equal :it, current_language + assert_select "html[lang=?]", "it" # not a supported language: default language should be used get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'zz' assert_response :success assert_tag :tag => 'h2', :content => 'Projects' + assert_select "html[lang=?]", "en" end def test_token_based_access_should_not_start_session @@ -64,4 +67,13 @@ get '/login.png' assert_response 404 end + + def test_invalid_token_should_call_custom_handler + ActionController::Base.allow_forgery_protection = true + post '/issues' + assert_response 422 + assert_include "Invalid form authenticity token.", response.body + ensure + ActionController::Base.allow_forgery_protection = false + end end diff -Nru redmine-2.3.3/test/integration/routing/custom_fields_test.rb redmine-2.4.2/test/integration/routing/custom_fields_test.rb --- redmine-2.3.3/test/integration/routing/custom_fields_test.rb 2013-09-14 06:48:03.000000000 +0000 +++ redmine-2.4.2/test/integration/routing/custom_fields_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -44,4 +44,11 @@ { :controller => 'custom_fields', :action => 'destroy', :id => '2' } ) end + + def test_custom_fields_api + assert_routing( + { :method => 'get', :path => "/custom_fields.xml" }, + { :controller => 'custom_fields', :action => 'index', :format => 'xml' } + ) + end end diff -Nru redmine-2.3.3/test/object_helpers.rb redmine-2.4.2/test/object_helpers.rb --- redmine-2.3.3/test/object_helpers.rb 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/object_helpers.rb 2013-12-23 08:48:37.000000000 +0000 @@ -65,13 +65,20 @@ role end - def Issue.generate!(attributes={}) + # Generates an unsaved Issue + def Issue.generate(attributes={}) issue = Issue.new(attributes) issue.project ||= Project.find(1) issue.tracker ||= issue.project.trackers.first issue.subject = 'Generated' if issue.subject.blank? issue.author ||= User.find(2) yield issue if block_given? + issue + end + + # Generates a saved Issue + def Issue.generate!(attributes={}, &block) + issue = Issue.generate(attributes, &block) issue.save! issue end @@ -159,4 +166,16 @@ field.save! field end + + def Changeset.generate!(attributes={}) + @generated_changeset_rev ||= '123456' + @generated_changeset_rev.succ! + changeset = new(attributes) + changeset.repository ||= Project.find(1).repository + changeset.revision ||= @generated_changeset_rev + changeset.committed_on ||= Time.now + yield changeset if block_given? + changeset.save! + changeset + end end diff -Nru redmine-2.3.3/test/test_helper.rb redmine-2.4.2/test/test_helper.rb --- redmine-2.3.3/test/test_helper.rb 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/test_helper.rb 2013-12-23 08:48:37.000000000 +0000 @@ -112,7 +112,7 @@ end def change_user_password(login, new_password) - user = User.first(:conditions => {:login => login}) + user = User.where(:login => login).first user.password, user.password_confirmation = new_password, new_password user.save! end @@ -169,8 +169,8 @@ assert s.include?(expected), (message || "\"#{expected}\" not found in \"#{s}\"") end - def assert_not_include(expected, s) - assert !s.include?(expected), "\"#{expected}\" found in \"#{s}\"" + def assert_not_include(expected, s, message=nil) + assert !s.include?(expected), (message || "\"#{expected}\" found in \"#{s}\"") end def assert_select_in(text, *args, &block) @@ -178,19 +178,19 @@ assert_select(d, *args, &block) end - def assert_mail_body_match(expected, mail) + def assert_mail_body_match(expected, mail, message=nil) if expected.is_a?(String) - assert_include expected, mail_body(mail) + assert_include expected, mail_body(mail), message else - assert_match expected, mail_body(mail) + assert_match expected, mail_body(mail), message end end - def assert_mail_body_no_match(expected, mail) + def assert_mail_body_no_match(expected, mail, message=nil) if expected.is_a?(String) - assert_not_include expected, mail_body(mail) + assert_not_include expected, mail_body(mail), message else - assert_no_match expected, mail_body(mail) + assert_no_match expected, mail_body(mail), message end end diff -Nru redmine-2.3.3/test/ui/base.rb redmine-2.4.2/test/ui/base.rb --- redmine-2.3.3/test/ui/base.rb 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/ui/base.rb 2013-12-23 08:48:37.000000000 +0000 @@ -20,16 +20,24 @@ Capybara.default_driver = :selenium Capybara.register_driver :selenium do |app| - # Use the following driver definition to test locally using Chrome (also requires chromedriver to be in PATH) + # Use the following driver definition to test locally using Chrome + # (also requires chromedriver to be in PATH) # Capybara::Selenium::Driver.new(app, :browser => :chrome) # Add :switches => %w[--lang=en] to force default browser locale to English # Default for Selenium remote driver is to connect to local host on port 4444 # This can be change using :url => 'http://localhost:9195' if necessary - # PhantomJS 1.8 now directly supports Webdriver Wire API, simply run it with `phantomjs --webdriver 4444` - # Add :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.internet_explorer) to run on Selenium Grid Hub with IE + # PhantomJS 1.8 now directly supports Webdriver Wire API, + # simply run it with `phantomjs --webdriver 4444` + # Add :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.internet_explorer) + # to run on Selenium Grid Hub with IE Capybara::Selenium::Driver.new(app, :browser => :remote) end +# default: 2 +Capybara.default_wait_time = 2 + +DatabaseCleaner.strategy = :truncation + module Redmine module UiTest # Base class for UI tests @@ -57,6 +65,7 @@ teardown do Capybara.reset_sessions! # Forget the (simulated) browser state Capybara.use_default_driver # Revert Capybara.current_driver to Capybara.default_driver + DatabaseCleaner.clean end end end diff -Nru redmine-2.3.3/test/ui/issues_test.rb redmine-2.4.2/test/ui/issues_test.rb --- redmine-2.3.3/test/ui/issues_test.rb 2013-09-14 06:48:10.000000000 +0000 +++ redmine-2.4.2/test/ui/issues_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -33,7 +33,6 @@ fill_in 'Description', :with => 'new issue' select '0 %', :from => 'Done' fill_in 'Due date', :with => '' - select '', :from => 'Assignee' fill_in 'Searchable field', :with => 'Value for field 2' # click_button 'Create' would match both 'Create' and 'Create and continue' buttons find('input[name=commit]').click @@ -102,14 +101,16 @@ end def test_create_issue_with_watchers - User.generate!(:firstname => 'Some', :lastname => 'Watcher') - + user = User.generate!(:firstname => 'Some', :lastname => 'Watcher') + assert_equal 'Some Watcher', user.name log_user('jsmith', 'jsmith') visit '/projects/ecookbook/issues/new' fill_in 'Subject', :with => 'Issue with watchers' # Add a project member as watcher check 'Dave Lopper' # Search for another user + assert page.has_no_css?('form#new-watcher-form') + assert page.has_no_content?('Some Watcher') click_link 'Search for watchers to add' within('form#new-watcher-form') do assert page.has_content?('Some One') @@ -118,6 +119,15 @@ check 'Some Watcher' click_button 'Add' end + assert page.has_css?('form#issue-form') + assert page.has_css?('p#watchers_form') + using_wait_time(30) do + within('span#watchers_inputs') do + within("label#issue_watcher_user_ids_#{user.id}") do + assert has_content?('Some Watcher'), "No watcher content" + end + end + end assert_difference 'Issue.count' do find('input[name=commit]').click end @@ -126,6 +136,37 @@ assert_equal ['Dave Lopper', 'Some Watcher'], issue.watcher_users.map(&:name).sort end + def test_create_issue_start_due_date + with_settings :default_issue_start_date_to_creation_date => 0 do + log_user('jsmith', 'jsmith') + visit '/projects/ecookbook/issues/new' + assert_equal "", page.find('input#issue_start_date').value + assert_equal "", page.find('input#issue_due_date').value + page.first('p#start_date_area img').click + page.first("td.ui-datepicker-days-cell-over a").click + assert_equal Date.today.to_s, page.find('input#issue_start_date').value + page.first('p#due_date_area img').click + page.first("td.ui-datepicker-days-cell-over a").click + assert_equal Date.today.to_s, page.find('input#issue_due_date').value + end + end + + def test_create_issue_start_due_date_default + log_user('jsmith', 'jsmith') + visit '/projects/ecookbook/issues/new' + fill_in 'Start date', :with => '2012-04-01' + fill_in 'Due date', :with => '' + page.first('p#due_date_area img').click + page.first("td.ui-datepicker-days-cell-over a").click + assert_equal '2012-04-01', page.find('input#issue_due_date').value + + fill_in 'Start date', :with => '' + fill_in 'Due date', :with => '2012-04-01' + page.first('p#start_date_area img').click + page.first("td.ui-datepicker-days-cell-over a").click + assert_equal '2012-04-01', page.find('input#issue_start_date').value + end + def test_preview_issue_description log_user('jsmith', 'jsmith') visit '/projects/ecookbook/issues/new' @@ -182,20 +223,22 @@ assert page.first('#sidebar').has_content?(user.name) assert_difference 'Watcher.count', -1 do page.first('ul.watchers .user-3 a.delete').click + assert page.first('#sidebar').has_content?('Watchers (0)') end - assert page.first('#sidebar').has_content?('Watchers (0)') assert page.first('#sidebar').has_no_content?(user.name) end def test_watch_issue_via_context_menu log_user('jsmith', 'jsmith') visit '/issues' + assert page.has_css?('tr#issue-1') find('tr#issue-1 td.updated_on').click page.execute_script "$('tr#issue-1 td.updated_on').trigger('contextmenu');" assert_difference 'Watcher.count' do within('#context-menu') do click_link 'Watch' end + assert page.has_css?('tr#issue-1') end assert Issue.find(1).watched_by?(User.find_by_login('jsmith')) end @@ -203,6 +246,8 @@ def test_bulk_watch_issues_via_context_menu log_user('jsmith', 'jsmith') visit '/issues' + assert page.has_css?('tr#issue-1') + assert page.has_css?('tr#issue-4') find('tr#issue-1 input[type=checkbox]').click find('tr#issue-4 input[type=checkbox]').click page.execute_script "$('tr#issue-1 td.updated_on').trigger('contextmenu');" @@ -210,6 +255,8 @@ within('#context-menu') do click_link 'Watch' end + assert page.has_css?('tr#issue-1') + assert page.has_css?('tr#issue-4') end assert Issue.find(1).watched_by?(User.find_by_login('jsmith')) assert Issue.find(4).watched_by?(User.find_by_login('jsmith')) diff -Nru redmine-2.3.3/test/unit/attachment_test.rb redmine-2.4.2/test/unit/attachment_test.rb --- redmine-2.3.3/test/unit/attachment_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/attachment_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -42,6 +42,13 @@ assert_nil Attachment.new.container end + def test_filename_should_remove_eols + assert_equal "line_feed", Attachment.new(:filename => "line\nfeed").filename + assert_equal "line_feed", Attachment.new(:filename => "some\npath/line\nfeed").filename + assert_equal "carriage_return", Attachment.new(:filename => "carriage\rreturn").filename + assert_equal "carriage_return", Attachment.new(:filename => "some\rpath/carriage\rreturn").filename + end + def test_create a = Attachment.new(:container => Issue.find(1), :file => uploaded_test_file("testfile.txt", "text/plain"), diff -Nru redmine-2.3.3/test/unit/board_test.rb redmine-2.4.2/test/unit/board_test.rb --- redmine-2.3.3/test/unit/board_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/board_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -100,7 +100,7 @@ end end end - assert_equal 0, Message.count(:conditions => {:board_id => 1}) + assert_equal 0, Message.where(:board_id => 1).count end def test_destroy_should_nullify_children diff -Nru redmine-2.3.3/test/unit/changeset_test.rb redmine-2.4.2/test/unit/changeset_test.rb --- redmine-2.3.3/test/unit/changeset_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/changeset_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -30,11 +30,8 @@ def test_ref_keywords_any ActionMailer::Base.deliveries.clear - Setting.commit_fix_status_id = IssueStatus.find( - :first, :conditions => ["is_closed = ?", true]).id - Setting.commit_fix_done_ratio = '90' Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = 'fixes , closes' + Setting.commit_update_keywords = [{'keywords' => 'fixes , closes', 'status_id' => '5', 'done_ratio' => '90'}] c = Changeset.new(:repository => Project.find(1).repository, :committed_on => Time.now, @@ -50,7 +47,7 @@ def test_ref_keywords Setting.commit_ref_keywords = 'refs' - Setting.commit_fix_keywords = '' + Setting.commit_update_keywords = '' c = Changeset.new(:repository => Project.find(1).repository, :committed_on => Time.now, :comments => 'Ignores #2. Refs #1', @@ -61,7 +58,7 @@ def test_ref_keywords_any_only Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = '' + Setting.commit_update_keywords = '' c = Changeset.new(:repository => Project.find(1).repository, :committed_on => Time.now, :comments => 'Ignores #2. Refs #1', @@ -113,10 +110,8 @@ end def test_ref_keywords_closing_with_timelog - Setting.commit_fix_status_id = IssueStatus.find( - :first, :conditions => ["is_closed = ?", true]).id Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = 'fixes , closes' + Setting.commit_update_keywords = [{'keywords' => 'fixes , closes', 'status_id' => IssueStatus.where(:is_closed => true).first.id.to_s}] Setting.commit_logtime_enabled = '1' c = Changeset.new(:repository => Project.find(1).repository, @@ -165,6 +160,48 @@ assert_equal [1,2,3], c.issue_ids.sort end + def test_update_keywords_with_multiple_rules + with_settings :commit_update_keywords => [ + {'keywords' => 'fixes, closes', 'status_id' => '5'}, + {'keywords' => 'resolves', 'status_id' => '3'} + ] do + + issue1 = Issue.generate! + issue2 = Issue.generate! + Changeset.generate!(:comments => "Closes ##{issue1.id}\nResolves ##{issue2.id}") + assert_equal 5, issue1.reload.status_id + assert_equal 3, issue2.reload.status_id + end + end + + def test_update_keywords_with_multiple_rules_should_match_tracker + with_settings :commit_update_keywords => [ + {'keywords' => 'fixes', 'status_id' => '5', 'if_tracker_id' => '2'}, + {'keywords' => 'fixes', 'status_id' => '3', 'if_tracker_id' => ''} + ] do + + issue1 = Issue.generate!(:tracker_id => 2) + issue2 = Issue.generate! + Changeset.generate!(:comments => "Fixes ##{issue1.id}, ##{issue2.id}") + assert_equal 5, issue1.reload.status_id + assert_equal 3, issue2.reload.status_id + end + end + + def test_update_keywords_with_multiple_rules_and_no_match + with_settings :commit_update_keywords => [ + {'keywords' => 'fixes', 'status_id' => '5', 'if_tracker_id' => '2'}, + {'keywords' => 'fixes', 'status_id' => '3', 'if_tracker_id' => '3'} + ] do + + issue1 = Issue.generate!(:tracker_id => 2) + issue2 = Issue.generate! + Changeset.generate!(:comments => "Fixes ##{issue1.id}, ##{issue2.id}") + assert_equal 5, issue1.reload.status_id + assert_equal 1, issue2.reload.status_id # no updates + end + end + def test_commit_referencing_a_subproject_issue c = Changeset.new(:repository => Project.find(1).repository, :committed_on => Time.now, @@ -176,7 +213,7 @@ end def test_commit_closing_a_subproject_issue - with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes', + with_settings :commit_update_keywords => [{'keywords' => 'closes', 'status_id' => '5'}], :default_language => 'en' do issue = Issue.find(5) assert !issue.closed? @@ -238,6 +275,28 @@ end end + def test_old_commits_should_not_update_issues_nor_log_time + Setting.commit_ref_keywords = '*' + Setting.commit_update_keywords = {'fixes , closes' => {'status_id' => '5', 'done_ratio' => '90'}} + Setting.commit_logtime_enabled = '1' + + repository = Project.find(1).repository + repository.created_on = Time.now + repository.save! + + c = Changeset.new(:repository => repository, + :committed_on => 1.month.ago, + :comments => 'New commit (#2). Fixes #1 @1h', + :revision => '12345') + assert_no_difference 'TimeEntry.count' do + assert c.save + end + assert_equal [1, 2], c.issue_ids.sort + issue = Issue.find(1) + assert_equal 1, issue.status_id + assert_equal 0, issue.done_ratio + end + def test_text_tag_revision c = Changeset.new(:revision => '520') assert_equal 'r520', c.text_tag diff -Nru redmine-2.3.3/test/unit/custom_field_test.rb redmine-2.4.2/test/unit/custom_field_test.rb --- redmine-2.3.3/test/unit/custom_field_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/custom_field_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -57,6 +57,20 @@ assert field.valid? end + def test_field_format_should_be_validated + field = CustomField.new(:name => 'Test', :field_format => 'foo') + assert !field.valid? + end + + def test_field_format_validation_should_accept_formats_added_at_runtime + Redmine::CustomFieldFormat.register 'foobar' + + field = CustomField.new(:name => 'Some Custom Field', :field_format => 'foobar') + assert field.valid?, 'field should be valid' + ensure + Redmine::CustomFieldFormat.delete 'foobar' + end + def test_should_not_change_field_format_of_existing_custom_field field = CustomField.find(1) field.field_format = 'int' @@ -241,4 +255,42 @@ field = CustomField.find(1) assert_equal 'PostgreSQL', field.value_from_keyword('postgresql', Issue.find(1)) end + + def test_visibile_scope_with_admin_should_return_all_custom_fields + CustomField.delete_all + fields = [ + CustomField.generate!(:visible => true), + CustomField.generate!(:visible => false), + CustomField.generate!(:visible => false, :role_ids => [1, 3]), + CustomField.generate!(:visible => false, :role_ids => [1, 2]), + ] + + assert_equal 4, CustomField.visible(User.find(1)).count + end + + def test_visibile_scope_with_non_admin_user_should_return_visible_custom_fields + CustomField.delete_all + fields = [ + CustomField.generate!(:visible => true), + CustomField.generate!(:visible => false), + CustomField.generate!(:visible => false, :role_ids => [1, 3]), + CustomField.generate!(:visible => false, :role_ids => [1, 2]), + ] + user = User.generate! + User.add_to_project(user, Project.first, Role.find(3)) + + assert_equal [fields[0], fields[2]], CustomField.visible(user).order("id").to_a + end + + def test_visibile_scope_with_anonymous_user_should_return_visible_custom_fields + CustomField.delete_all + fields = [ + CustomField.generate!(:visible => true), + CustomField.generate!(:visible => false), + CustomField.generate!(:visible => false, :role_ids => [1, 3]), + CustomField.generate!(:visible => false, :role_ids => [1, 2]), + ] + + assert_equal [fields[0]], CustomField.visible(User.anonymous).order("id").to_a + end end diff -Nru redmine-2.3.3/test/unit/helpers/activities_helper_test.rb redmine-2.4.2/test/unit/helpers/activities_helper_test.rb --- redmine-2.3.3/test/unit/helpers/activities_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/activities_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -19,6 +19,7 @@ class ActivitiesHelperTest < ActionView::TestCase include ActivitiesHelper + include Redmine::I18n class MockEvent attr_reader :event_datetime, :event_group, :name diff -Nru redmine-2.3.3/test/unit/helpers/application_helper_test.rb redmine-2.4.2/test/unit/helpers/application_helper_test.rb --- redmine-2.3.3/test/unit/helpers/application_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/application_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -20,6 +20,7 @@ require File.expand_path('../../../test_helper', __FILE__) class ApplicationHelperTest < ActionView::TestCase + include Redmine::I18n include ERB::Util include Rails.application.routes.url_helpers @@ -33,26 +34,30 @@ def setup super set_tmp_attachments_directory - end - - context "#link_to_if_authorized" do - context "authorized user" do - should "be tested" - end - - context "unauthorized user" do - should "be tested" + @russian_test = "\xd1\x82\xd0\xb5\xd1\x81\xd1\x82" + if @russian_test.respond_to?(:force_encoding) + @russian_test.force_encoding('UTF-8') end + end - should "allow using the :controller and :action for the target link" do - User.current = User.find_by_login('admin') - - @project = Issue.first.project # Used by helper - response = link_to_if_authorized("By controller/action", - {:controller => 'issues', :action => 'edit', :id => Issue.first.id}) - assert_match /href/, response - end + test "#link_to_if_authorized for authorized user should allow using the :controller and :action for the target link" do + User.current = User.find_by_login('admin') + @project = Issue.first.project # Used by helper + response = link_to_if_authorized('By controller/actionr', + {:controller => 'issues', :action => 'edit', :id => Issue.first.id}) + assert_match /href/, response + end + + test "#link_to_if_authorized for unauthorized user should display nothing if user isn't authorized" do + User.current = User.find_by_login('dlopper') + @project = Project.find('private-child') + issue = @project.issues.first + assert !issue.visible? + + response = link_to_if_authorized('Never displayed', + {:controller => 'issues', :action => 'show', :id => issue}) + assert_nil response end def test_auto_links @@ -96,7 +101,8 @@ if 'ruby'.respond_to?(:encoding) def test_auto_links_with_non_ascii_characters to_test = { - 'http://foo.bar/тест' => 'http://foo.bar/тест' + "http://foo.bar/#{@russian_test}" => + %|http://foo.bar/#{@russian_test}| } to_test.each { |text, result| assert_equal "

    #{result}

    ", textilizable(text) } end @@ -250,7 +256,8 @@ if 'ruby'.respond_to?(:encoding) def test_textile_external_links_with_non_ascii_characters to_test = { - 'This is a "link":http://foo.bar/тест' => 'This is a link' + %|This is a "link":http://foo.bar/#{@russian_test}| => + %|This is a link| } to_test.each { |text, result| assert_equal "

    #{result}

    ", textilizable(text) } end @@ -261,7 +268,9 @@ def test_redmine_links issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3}, :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') - note_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'}, + note_link = link_to('#3-14', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'}, + :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') + note_link2 = link_to('#3#note-14', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'}, :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') revision_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, @@ -304,7 +313,7 @@ '#3, [#3], (#3) and #3.' => "#{issue_link}, [#{issue_link}], (#{issue_link}) and #{issue_link}.", # ticket notes '#3-14' => note_link, - '#3#note-14' => note_link, + '#3#note-14' => note_link2, # should not ignore leading zero '#03' => '#03', # changesets @@ -586,6 +595,7 @@ end def test_wiki_links + russian_eacape = CGI.escape(@russian_test) to_test = { '[[CookBook documentation]]' => 'CookBook documentation', '[[Another page|Page]]' => 'Page', @@ -596,7 +606,8 @@ '[[CookBook documentation#One-section]]' => 'CookBook documentation', '[[Another page#anchor|Page]]' => 'Page', # UTF8 anchor - '[[Another_page#Тест|Тест]]' => %|Тест|, + "[[Another_page##{@russian_test}|#{@russian_test}]]" => + %|#{@russian_test}|, # page that doesn't exist '[[Unknown page]]' => 'Unknown page', '[[Unknown page|404]]' => '404', @@ -1005,14 +1016,14 @@ result = textilizable(raw, :edit_section_links => {:controller => 'wiki', :action => 'edit', :project_id => '1', :id => 'Test'}).gsub("\n", "") # heading that contains inline code - assert_match Regexp.new('
    ' + + assert_match Regexp.new('
    ' + 'Edit
    ' + '' + '

    Subtitle with inline code

    '), result # last heading - assert_match Regexp.new('
    ' + + assert_match Regexp.new('
    ' + 'Edit
    ' + '' + '

    Subtitle after pre tag

    '), @@ -1220,4 +1231,38 @@ s = raw_json(["foo"]) assert s.html_safe? end + + def test_html_title_should_app_title_if_not_set + assert_equal 'Redmine', html_title + end + + def test_html_title_should_join_items + html_title 'Foo', 'Bar' + assert_equal 'Foo - Bar - Redmine', html_title + end + + def test_html_title_should_append_current_project_name + @project = Project.find(1) + html_title 'Foo', 'Bar' + assert_equal 'Foo - Bar - eCookbook - Redmine', html_title + end + + def test_title_should_return_a_h2_tag + assert_equal '

    Foo

    ', title('Foo') + end + + def test_title_should_set_html_title + title('Foo') + assert_equal 'Foo - Redmine', html_title + end + + def test_title_should_turn_arrays_into_links + assert_equal '

    Foo

    ', title(['Foo', '/foo']) + assert_equal 'Foo - Redmine', html_title + end + + def test_title_should_join_items + assert_equal '

    Foo » Bar

    ', title('Foo', 'Bar') + assert_equal 'Bar - Foo - Redmine', html_title + end end diff -Nru redmine-2.3.3/test/unit/helpers/custom_fields_helper_test.rb redmine-2.4.2/test/unit/helpers/custom_fields_helper_test.rb --- redmine-2.3.3/test/unit/helpers/custom_fields_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/custom_fields_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -41,7 +41,7 @@ field = CustomField.new(:field_format => 'foo') field.id = 52 - assert_equal '', + assert_include '', custom_field_tag_for_bulk_edit('object', field) end end diff -Nru redmine-2.3.3/test/unit/helpers/issues_helper_test.rb redmine-2.4.2/test/unit/helpers/issues_helper_test.rb --- redmine-2.3.3/test/unit/helpers/issues_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/issues_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -19,6 +19,7 @@ class IssuesHelperTest < ActionView::TestCase include ApplicationHelper + include Redmine::I18n include IssuesHelper include CustomFieldsHelper include ERB::Util @@ -45,65 +46,72 @@ end def test_issues_destroy_confirmation_message_with_one_root_issue - assert_equal l(:text_issues_destroy_confirmation), issues_destroy_confirmation_message(Issue.find(1)) + assert_equal l(:text_issues_destroy_confirmation), + issues_destroy_confirmation_message(Issue.find(1)) end def test_issues_destroy_confirmation_message_with_an_arrayt_of_root_issues - assert_equal l(:text_issues_destroy_confirmation), issues_destroy_confirmation_message(Issue.find([1, 2])) + assert_equal l(:text_issues_destroy_confirmation), + issues_destroy_confirmation_message(Issue.find([1, 2])) end def test_issues_destroy_confirmation_message_with_one_parent_issue Issue.find(2).update_attribute :parent_issue_id, 1 - assert_equal l(:text_issues_destroy_confirmation) + "\n" + l(:text_issues_destroy_descendants_confirmation, :count => 1), - issues_destroy_confirmation_message(Issue.find(1)) + assert_equal l(:text_issues_destroy_confirmation) + "\n" + + l(:text_issues_destroy_descendants_confirmation, :count => 1), + issues_destroy_confirmation_message(Issue.find(1)) end def test_issues_destroy_confirmation_message_with_one_parent_issue_and_its_child Issue.find(2).update_attribute :parent_issue_id, 1 - assert_equal l(:text_issues_destroy_confirmation), issues_destroy_confirmation_message(Issue.find([1, 2])) + assert_equal l(:text_issues_destroy_confirmation), + issues_destroy_confirmation_message(Issue.find([1, 2])) end - test 'IssuesHelper#show_detail with no_html should show a changing attribute' do - detail = JournalDetail.new(:property => 'attr', :old_value => '40', :value => '100', :prop_key => 'done_ratio') + test 'show_detail with no_html should show a changing attribute' do + detail = JournalDetail.new(:property => 'attr', :old_value => '40', + :value => '100', :prop_key => 'done_ratio') assert_equal "% Done changed from 40 to 100", show_detail(detail, true) end - test 'IssuesHelper#show_detail with no_html should show a new attribute' do - detail = JournalDetail.new(:property => 'attr', :old_value => nil, :value => '100', :prop_key => 'done_ratio') + test 'show_detail with no_html should show a new attribute' do + detail = JournalDetail.new(:property => 'attr', :old_value => nil, + :value => '100', :prop_key => 'done_ratio') assert_equal "% Done set to 100", show_detail(detail, true) end - test 'IssuesHelper#show_detail with no_html should show a deleted attribute' do - detail = JournalDetail.new(:property => 'attr', :old_value => '50', :value => nil, :prop_key => 'done_ratio') + test 'show_detail with no_html should show a deleted attribute' do + detail = JournalDetail.new(:property => 'attr', :old_value => '50', + :value => nil, :prop_key => 'done_ratio') assert_equal "% Done deleted (50)", show_detail(detail, true) end - test 'IssuesHelper#show_detail with html should show a changing attribute with HTML highlights' do - detail = JournalDetail.new(:property => 'attr', :old_value => '40', :value => '100', :prop_key => 'done_ratio') + test 'show_detail with html should show a changing attribute with HTML highlights' do + detail = JournalDetail.new(:property => 'attr', :old_value => '40', + :value => '100', :prop_key => 'done_ratio') html = show_detail(detail, false) - assert_include '% Done', html assert_include '40', html assert_include '100', html end - test 'IssuesHelper#show_detail with html should show a new attribute with HTML highlights' do - detail = JournalDetail.new(:property => 'attr', :old_value => nil, :value => '100', :prop_key => 'done_ratio') + test 'show_detail with html should show a new attribute with HTML highlights' do + detail = JournalDetail.new(:property => 'attr', :old_value => nil, + :value => '100', :prop_key => 'done_ratio') html = show_detail(detail, false) - assert_include '% Done', html assert_include '100', html end - test 'IssuesHelper#show_detail with html should show a deleted attribute with HTML highlights' do - detail = JournalDetail.new(:property => 'attr', :old_value => '50', :value => nil, :prop_key => 'done_ratio') + test 'show_detail with html should show a deleted attribute with HTML highlights' do + detail = JournalDetail.new(:property => 'attr', :old_value => '50', + :value => nil, :prop_key => 'done_ratio') html = show_detail(detail, false) - assert_include '% Done', html assert_include '50', html end - test 'IssuesHelper#show_detail with a start_date attribute should format the dates' do + test 'show_detail with a start_date attribute should format the dates' do detail = JournalDetail.new( :property => 'attr', :old_value => '2010-01-01', @@ -116,7 +124,7 @@ end end - test 'IssuesHelper#show_detail with a due_date attribute should format the dates' do + test 'show_detail with a due_date attribute should format the dates' do detail = JournalDetail.new( :property => 'attr', :old_value => '2010-01-01', @@ -129,66 +137,135 @@ end end - test 'IssuesHelper#show_detail should show old and new values with a project attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'project_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a project attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'project_id', + :old_value => 1, :value => 2) assert_match 'eCookbook', show_detail(detail, true) assert_match 'OnlineStore', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a issue status attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'status_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a issue status attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'status_id', + :old_value => 1, :value => 2) assert_match 'New', show_detail(detail, true) assert_match 'Assigned', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a tracker attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'tracker_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a tracker attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'tracker_id', + :old_value => 1, :value => 2) assert_match 'Bug', show_detail(detail, true) assert_match 'Feature request', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a assigned to attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'assigned_to_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a assigned to attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'assigned_to_id', + :old_value => 1, :value => 2) assert_match 'Redmine Admin', show_detail(detail, true) assert_match 'John Smith', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a priority attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'priority_id', :old_value => 4, :value => 5) + test 'show_detail should show old and new values with a priority attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'priority_id', + :old_value => 4, :value => 5) assert_match 'Low', show_detail(detail, true) assert_match 'Normal', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a category attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'category_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a category attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'category_id', + :old_value => 1, :value => 2) assert_match 'Printing', show_detail(detail, true) assert_match 'Recipes', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a fixed version attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'fixed_version_id', :old_value => 1, :value => 2) + test 'show_detail should show old and new values with a fixed version attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'fixed_version_id', + :old_value => 1, :value => 2) assert_match '0.1', show_detail(detail, true) assert_match '1.0', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a estimated hours attribute' do - detail = JournalDetail.new(:property => 'attr', :prop_key => 'estimated_hours', :old_value => '5', :value => '6.3') + test 'show_detail should show old and new values with a estimated hours attribute' do + detail = JournalDetail.new(:property => 'attr', :prop_key => 'estimated_hours', + :old_value => '5', :value => '6.3') assert_match '5.00', show_detail(detail, true) assert_match '6.30', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show old and new values with a custom field' do - detail = JournalDetail.new(:property => 'cf', :prop_key => '1', :old_value => 'MySQL', :value => 'PostgreSQL') + test 'show_detail should show old and new values with a custom field' do + detail = JournalDetail.new(:property => 'cf', :prop_key => '1', + :old_value => 'MySQL', :value => 'PostgreSQL') assert_equal 'Database changed from MySQL to PostgreSQL', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show added file' do - detail = JournalDetail.new(:property => 'attachment', :prop_key => '1', :old_value => nil, :value => 'error281.txt') + test 'show_detail should show added file' do + detail = JournalDetail.new(:property => 'attachment', :prop_key => '1', + :old_value => nil, :value => 'error281.txt') assert_match 'error281.txt', show_detail(detail, true) end - test 'IssuesHelper#show_detail should show removed file' do - detail = JournalDetail.new(:property => 'attachment', :prop_key => '1', :old_value => 'error281.txt', :value => nil) + test 'show_detail should show removed file' do + detail = JournalDetail.new(:property => 'attachment', :prop_key => '1', + :old_value => 'error281.txt', :value => nil) assert_match 'error281.txt', show_detail(detail, true) end + + def test_show_detail_relation_added + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :value => 1) + assert_equal "Precedes Bug #1: Can't print recipes added", show_detail(detail, true) + assert_match %r{Precedes Bug #1: Can't print recipes added}, + show_detail(detail, false) + end + + def test_show_detail_relation_added_with_inexistant_issue + inexistant_issue_number = 9999 + assert_nil Issue.find_by_id(inexistant_issue_number) + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :value => inexistant_issue_number) + assert_equal "Precedes Issue ##{inexistant_issue_number} added", show_detail(detail, true) + assert_equal "Precedes Issue ##{inexistant_issue_number} added", show_detail(detail, false) + end + + def test_show_detail_relation_added_should_not_disclose_issue_that_is_not_visible + issue = Issue.generate!(:is_private => true) + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :value => issue.id) + + assert_equal "Precedes Issue ##{issue.id} added", show_detail(detail, true) + assert_equal "Precedes Issue ##{issue.id} added", show_detail(detail, false) + end + + def test_show_detail_relation_deleted + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :old_value => 1) + assert_equal "Precedes deleted (Bug #1: Can't print recipes)", show_detail(detail, true) + assert_match %r{Precedes deleted \(Bug #1: Can't print recipes\)}, + show_detail(detail, false) + end + + def test_show_detail_relation_deleted_with_inexistant_issue + inexistant_issue_number = 9999 + assert_nil Issue.find_by_id(inexistant_issue_number) + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :old_value => inexistant_issue_number) + assert_equal "Precedes deleted (Issue #9999)", show_detail(detail, true) + assert_equal "Precedes deleted (Issue #9999)", show_detail(detail, false) + end + + def test_show_detail_relation_deleted_should_not_disclose_issue_that_is_not_visible + issue = Issue.generate!(:is_private => true) + detail = JournalDetail.new(:property => 'relation', + :prop_key => 'label_precedes', + :old_value => issue.id) + + assert_equal "Precedes deleted (Issue ##{issue.id})", show_detail(detail, true) + assert_equal "Precedes deleted (Issue ##{issue.id})", show_detail(detail, false) + end end diff -Nru redmine-2.3.3/test/unit/helpers/projects_helper_test.rb redmine-2.4.2/test/unit/helpers/projects_helper_test.rb --- redmine-2.3.3/test/unit/helpers/projects_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/projects_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -20,6 +20,7 @@ class ProjectsHelperTest < ActionView::TestCase include ApplicationHelper include ProjectsHelper + include Redmine::I18n include ERB::Util fixtures :projects, :trackers, :issue_statuses, :issues, diff -Nru redmine-2.3.3/test/unit/helpers/queries_helper_test.rb redmine-2.4.2/test/unit/helpers/queries_helper_test.rb --- redmine-2.3.3/test/unit/helpers/queries_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/queries_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -29,41 +29,11 @@ :projects_trackers, :custom_fields_trackers - def test_filters_options_should_be_ordered - set_language_if_valid 'en' + def test_filters_options_has_empty_item query = IssueQuery.new filter_count = query.available_filters.size fo = filters_options(query) assert_equal filter_count + 1, fo.size assert_equal [], fo[0] - - expected_order = [ - "Status", - "Project", - "Tracker", - "Priority" - ] - assert_equal expected_order, (fo.map(&:first) & expected_order) - end - - def test_filters_options_should_be_ordered_with_custom_fields - set_language_if_valid 'en' - field = UserCustomField.create!( - :name => 'order test', :field_format => 'string', - :is_for_all => true, :is_filter => true - ) - query = IssueQuery.new - filter_count = query.available_filters.size - fo = filters_options(query) - assert_equal filter_count + 1, fo.size - - expected_order = [ - "Searchable field", - "Database", - "Project's Development status", - "Author's order test", - "Assignee's order test" - ] - assert_equal expected_order, (fo.map(&:first) & expected_order) end end diff -Nru redmine-2.3.3/test/unit/helpers/search_helper_test.rb redmine-2.4.2/test/unit/helpers/search_helper_test.rb --- redmine-2.3.3/test/unit/helpers/search_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/search_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -21,6 +21,7 @@ class SearchHelperTest < ActionView::TestCase include SearchHelper + include Redmine::I18n include ERB::Util def test_highlight_single_token diff -Nru redmine-2.3.3/test/unit/helpers/sort_helper_test.rb redmine-2.4.2/test/unit/helpers/sort_helper_test.rb --- redmine-2.3.3/test/unit/helpers/sort_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/sort_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -19,6 +19,7 @@ class SortHelperTest < ActionView::TestCase include SortHelper + include Redmine::I18n include ERB::Util def setup diff -Nru redmine-2.3.3/test/unit/helpers/timelog_helper_test.rb redmine-2.4.2/test/unit/helpers/timelog_helper_test.rb --- redmine-2.3.3/test/unit/helpers/timelog_helper_test.rb 2013-09-14 06:47:51.000000000 +0000 +++ redmine-2.4.2/test/unit/helpers/timelog_helper_test.rb 2013-12-23 08:48:36.000000000 +0000 @@ -19,6 +19,7 @@ class TimelogHelperTest < ActionView::TestCase include TimelogHelper + include Redmine::I18n include ActionView::Helpers::TextHelper include ActionView::Helpers::DateHelper include ERB::Util diff -Nru redmine-2.3.3/test/unit/initializers/patches_test.rb redmine-2.4.2/test/unit/initializers/patches_test.rb --- redmine-2.3.3/test/unit/initializers/patches_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/initializers/patches_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -20,21 +20,19 @@ class PatchesTest < ActiveSupport::TestCase include Redmine::I18n - context "ActiveRecord::Base.human_attribute_name" do - setup do - Setting.default_language = 'en' - end + def setup + Setting.default_language = 'en' + end - should "transform name to field_name" do - assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on') - end + test "ActiveRecord::Base.human_attribute_name should transform name to field_name" do + assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on') + end - should "cut extra _id suffix for better validation" do - assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on_id') - end + test "ActiveRecord::Base.human_attribute_name should cut extra _id suffix for better validation" do + assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on_id') + end - should "default to humanized value if no translation has been found (useful for custom fields)" do - assert_equal 'Patch name', ActiveRecord::Base.human_attribute_name('Patch name') - end + test "ActiveRecord::Base.human_attribute_name should default to humanized value if no translation has been found (useful for custom fields)" do + assert_equal 'Patch name', ActiveRecord::Base.human_attribute_name('Patch name') end end diff -Nru redmine-2.3.3/test/unit/issue_custom_field_test.rb redmine-2.4.2/test/unit/issue_custom_field_test.rb --- redmine-2.3.3/test/unit/issue_custom_field_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/unit/issue_custom_field_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,42 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class IssueCustomFieldTest < ActiveSupport::TestCase + include Redmine::I18n + + fixtures :roles + + def test_custom_field_with_visible_set_to_false_should_validate_roles + set_language_if_valid 'en' + field = IssueCustomField.new(:name => 'Field', :field_format => 'string', :visible => false) + assert !field.save + assert_include "Roles can't be blank", field.errors.full_messages + field.role_ids = [1, 2] + assert field.save + end + + def test_changing_visible_to_true_should_clear_roles + field = IssueCustomField.create!(:name => 'Field', :field_format => 'string', :visible => false, :role_ids => [1, 2]) + assert_equal 2, field.roles.count + + field.visible = true + field.save! + assert_equal 0, field.roles.count + end +end diff -Nru redmine-2.3.3/test/unit/issue_nested_set_test.rb redmine-2.4.2/test/unit/issue_nested_set_test.rb --- redmine-2.3.3/test/unit/issue_nested_set_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/issue_nested_set_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -166,6 +166,41 @@ assert_not_equal [], child.errors[:parent_issue_id] end + def test_updating_a_root_issue_should_not_trigger_update_nested_set_attributes_on_parent_change + issue = Issue.find(Issue.generate!.id) + issue.parent_issue_id = "" + issue.expects(:update_nested_set_attributes_on_parent_change).never + issue.save! + end + + def test_updating_a_child_issue_should_not_trigger_update_nested_set_attributes_on_parent_change + issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id) + issue.parent_issue_id = "1" + issue.expects(:update_nested_set_attributes_on_parent_change).never + issue.save! + end + + def test_moving_a_root_issue_should_trigger_update_nested_set_attributes_on_parent_change + issue = Issue.find(Issue.generate!.id) + issue.parent_issue_id = "1" + issue.expects(:update_nested_set_attributes_on_parent_change).once + issue.save! + end + + def test_moving_a_child_issue_to_another_parent_should_trigger_update_nested_set_attributes_on_parent_change + issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id) + issue.parent_issue_id = "2" + issue.expects(:update_nested_set_attributes_on_parent_change).once + issue.save! + end + + def test_moving_a_child_issue_to_root_should_trigger_update_nested_set_attributes_on_parent_change + issue = Issue.find(Issue.generate!(:parent_issue_id => 1).id) + issue.parent_issue_id = "" + issue.expects(:update_nested_set_attributes_on_parent_change).once + issue.save! + end + def test_destroy_should_destroy_children issue1 = Issue.generate! issue2 = Issue.generate! diff -Nru redmine-2.3.3/test/unit/issue_relation_test.rb redmine-2.4.2/test/unit/issue_relation_test.rb --- redmine-2.3.3/test/unit/issue_relation_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/issue_relation_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -28,7 +28,8 @@ :issue_relations, :enabled_modules, :enumerations, - :trackers + :trackers, + :projects_trackers include Redmine::I18n @@ -167,4 +168,49 @@ assert !r.save assert_not_equal [], r.errors[:base] end + + def test_create_should_make_journal_entry + from = Issue.find(1) + to = Issue.find(2) + from_journals = from.journals.size + to_journals = to.journals.size + relation = IssueRelation.new(:issue_from => from, :issue_to => to, + :relation_type => IssueRelation::TYPE_PRECEDES) + assert relation.save + from.reload + to.reload + relation.reload + assert_equal from.journals.size, (from_journals + 1) + assert_equal to.journals.size, (to_journals + 1) + assert_equal 'relation', from.journals.last.details.last.property + assert_equal 'label_precedes', from.journals.last.details.last.prop_key + assert_equal '2', from.journals.last.details.last.value + assert_nil from.journals.last.details.last.old_value + assert_equal 'relation', to.journals.last.details.last.property + assert_equal 'label_follows', to.journals.last.details.last.prop_key + assert_equal '1', to.journals.last.details.last.value + assert_nil to.journals.last.details.last.old_value + end + + def test_delete_should_make_journal_entry + relation = IssueRelation.find(1) + id = relation.id + from = relation.issue_from + to = relation.issue_to + from_journals = from.journals.size + to_journals = to.journals.size + assert relation.destroy + from.reload + to.reload + assert_equal from.journals.size, (from_journals + 1) + assert_equal to.journals.size, (to_journals + 1) + assert_equal 'relation', from.journals.last.details.last.property + assert_equal 'label_blocks', from.journals.last.details.last.prop_key + assert_equal '9', from.journals.last.details.last.old_value + assert_nil from.journals.last.details.last.value + assert_equal 'relation', to.journals.last.details.last.property + assert_equal 'label_blocked_by', to.journals.last.details.last.prop_key + assert_equal '10', to.journals.last.details.last.old_value + assert_nil to.journals.last.details.last.value + end end diff -Nru redmine-2.3.3/test/unit/issue_status_test.rb redmine-2.4.2/test/unit/issue_status_test.rb --- redmine-2.3.3/test/unit/issue_status_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/issue_status_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -36,8 +36,8 @@ assert_difference 'IssueStatus.count', -1 do assert status.destroy end - assert_nil WorkflowTransition.first(:conditions => {:old_status_id => status.id}) - assert_nil WorkflowTransition.first(:conditions => {:new_status_id => status.id}) + assert_nil WorkflowTransition.where(:old_status_id => status.id).first + assert_nil WorkflowTransition.where(:new_status_id => status.id).first end def test_destroy_status_in_use @@ -98,7 +98,7 @@ with_settings :issue_done_ratio => 'issue_field' do IssueStatus.update_issue_done_ratios - assert_equal 0, Issue.count(:conditions => {:done_ratio => 50}) + assert_equal 0, Issue.where(:done_ratio => 50).count end end @@ -107,7 +107,7 @@ with_settings :issue_done_ratio => 'issue_status' do IssueStatus.update_issue_done_ratios - issues = Issue.all(:conditions => {:status_id => 1}) + issues = Issue.where(:status_id => 1).all assert_equal [50], issues.map {|issue| issue.read_attribute(:done_ratio)}.uniq end end diff -Nru redmine-2.3.3/test/unit/issue_test.rb redmine-2.4.2/test/unit/issue_test.rb --- redmine-2.3.3/test/unit/issue_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/issue_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -92,6 +92,27 @@ assert_include 'Due date must be greater than start date', issue.errors.full_messages end + def test_start_date_lesser_than_soonest_start_should_not_validate_on_create + issue = Issue.generate(:start_date => '2013-06-04') + issue.stubs(:soonest_start).returns(Date.parse('2013-06-10')) + assert !issue.valid? + assert_include "Start date cannot be earlier than 06/10/2013 because of preceding issues", issue.errors.full_messages + end + + def test_start_date_lesser_than_soonest_start_should_not_validate_on_update_if_changed + issue = Issue.generate!(:start_date => '2013-06-04') + issue.stubs(:soonest_start).returns(Date.parse('2013-06-10')) + issue.start_date = '2013-06-07' + assert !issue.valid? + assert_include "Start date cannot be earlier than 06/10/2013 because of preceding issues", issue.errors.full_messages + end + + def test_start_date_lesser_than_soonest_start_should_validate_on_update_if_unchanged + issue = Issue.generate!(:start_date => '2013-06-04') + issue.stubs(:soonest_start).returns(Date.parse('2013-06-10')) + assert issue.valid? + end + def test_estimated_hours_should_be_validated set_language_if_valid 'en' ['-2'].each do |invalid| @@ -246,7 +267,7 @@ def test_visible_scope_for_member user = User.find(9) - # User should see issues of projects for which he has view_issues permissions only + # User should see issues of projects for which user has view_issues permissions only Role.non_member.remove_permission!(:view_issues) Member.create!(:principal => user, :project_id => 3, :role_ids => [2]) issues = Issue.visible(user).all @@ -261,18 +282,18 @@ assert user.groups.any? Member.create!(:principal => user.groups.first, :project_id => 1, :role_ids => [2]) Role.non_member.remove_permission!(:view_issues) - + issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Assignment test', :assigned_to => user.groups.first, :is_private => true) - + Role.find(2).update_attribute :issues_visibility, 'default' issues = Issue.visible(User.find(8)).all assert issues.any? assert issues.include?(issue) - + Role.find(2).update_attribute :issues_visibility, 'own' issues = Issue.visible(User.find(8)).all assert issues.any? @@ -285,7 +306,7 @@ assert user.projects.empty? issues = Issue.visible(user).all assert issues.any? - # Admin should see issues on private projects that he does not belong to + # Admin should see issues on private projects that admin does not belong to assert issues.detect {|issue| !issue.project.is_public?} # Admin should see private issues of other users assert issues.detect {|issue| issue.is_private? && issue.author != user} @@ -542,7 +563,7 @@ admin = User.find(1) issue = Issue.find(1) assert !admin.member_of?(issue.project) - expected_statuses = [issue.status] + + expected_statuses = [issue.status] + WorkflowTransition.find_all_by_old_status_id( issue.status_id).map(&:new_status).uniq.sort assert_equal expected_statuses, issue.new_statuses_allowed_to(admin) @@ -1082,7 +1103,7 @@ def test_should_keep_shared_version_when_changing_project Version.find(2).update_attribute :sharing, 'tree' - + issue = Issue.find(2) assert_equal 2, issue.fixed_version_id issue.project_id = 3 @@ -1474,6 +1495,7 @@ :relation_type => IssueRelation::TYPE_PRECEDES) assert_equal Date.parse('2012-10-18'), issue2.reload.start_date + issue1.reload issue1.due_date = '2012-10-23' issue1.save! issue2.reload @@ -1488,6 +1510,7 @@ :relation_type => IssueRelation::TYPE_PRECEDES) assert_equal Date.parse('2012-10-18'), issue2.reload.start_date + issue1.reload issue1.start_date = '2012-09-17' issue1.due_date = '2012-09-18' issue1.save! @@ -1506,6 +1529,7 @@ :relation_type => IssueRelation::TYPE_PRECEDES) assert_equal Date.parse('2012-10-18'), issue2.reload.start_date + issue1.reload issue1.start_date = '2012-09-17' issue1.due_date = '2012-09-18' issue1.save! @@ -1542,7 +1566,7 @@ child = Issue.new(:parent_issue_id => issue2.id, :start_date => '2012-10-16', :project_id => 1, :tracker_id => 1, :status_id => 1, :subject => 'Child', :author_id => 1) assert !child.valid? - assert_include 'Start date is invalid', child.errors.full_messages + assert_include 'Start date cannot be earlier than 10/18/2012 because of preceding issues', child.errors.full_messages assert_equal Date.parse('2012-10-18'), child.soonest_start child.start_date = '2012-10-18' assert child.save @@ -1676,6 +1700,19 @@ assert_equal 1, ActionMailer::Base.deliveries.size end + def test_update_should_notify_previous_assignee + ActionMailer::Base.deliveries.clear + user = User.find(3) + user.members.update_all ["mail_notification = ?", false] + user.update_attribute :mail_notification, 'only_assigned' + + issue = Issue.find(2) + issue.init_journal User.find(1) + issue.assigned_to = nil + issue.save! + assert_include user.mail, ActionMailer::Base.deliveries.last.bcc + end + def test_stale_issue_should_not_send_email_notification ActionMailer::Base.deliveries.clear issue = Issue.find(1) @@ -1816,7 +1853,7 @@ IssueRelation.delete_all project = Project.generate!(:name => "testproject") - + parentIssue = Issue.generate!(:project => project) childIssue1 = Issue.generate!(:project => project, :parent_issue_id => parentIssue.id) childIssue2 = Issue.generate!(:project => project, :parent_issue_id => parentIssue.id) @@ -1955,7 +1992,7 @@ :issue_to => Issue.find(7), :relation_type => IssueRelation::TYPE_PRECEDES) IssueRelation.update_all("issue_to_id = 1", ["id = ?", r.id]) - + assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort end @@ -1975,7 +2012,7 @@ :issue_to => Issue.find(7), :relation_type => IssueRelation::TYPE_RELATES) IssueRelation.update_all("issue_to_id = 2", ["id = ?", r.id]) - + r = IssueRelation.create!(:issue_from => Issue.find(3), :issue_to => Issue.find(7), :relation_type => IssueRelation::TYPE_RELATES) @@ -2031,42 +2068,42 @@ test "#by_tracker" do User.current = User.anonymous groups = Issue.by_tracker(Project.find(1)) - assert_equal 3, groups.size + assert_equal 3, groups.count assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_version" do User.current = User.anonymous groups = Issue.by_version(Project.find(1)) - assert_equal 3, groups.size + assert_equal 3, groups.count assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_priority" do User.current = User.anonymous groups = Issue.by_priority(Project.find(1)) - assert_equal 4, groups.size + assert_equal 4, groups.count assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_category" do User.current = User.anonymous groups = Issue.by_category(Project.find(1)) - assert_equal 2, groups.size + assert_equal 2, groups.count assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_assigned_to" do User.current = User.anonymous groups = Issue.by_assigned_to(Project.find(1)) - assert_equal 2, groups.size + assert_equal 2, groups.count assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_author" do User.current = User.anonymous groups = Issue.by_author(Project.find(1)) - assert_equal 4, groups.size + assert_equal 4, groups.count assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} end @@ -2074,7 +2111,7 @@ User.current = User.anonymous groups = Issue.by_subproject(Project.find(1)) # Private descendant not visible - assert_equal 1, groups.size + assert_equal 1, groups.count assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i} end @@ -2165,6 +2202,18 @@ assert_include 'priority-highest', classes end + def test_css_classes_should_include_user_assignment + issue = Issue.generate(:assigned_to_id => 2) + assert_include 'assigned-to-me', issue.css_classes(User.find(2)) + assert_not_include 'assigned-to-me', issue.css_classes(User.find(3)) + end + + def test_css_classes_should_include_user_group_assignment + issue = Issue.generate(:assigned_to_id => 10) + assert_include 'assigned-to-my-group', issue.css_classes(Group.find(10).users.first) + assert_not_include 'assigned-to-my-group', issue.css_classes(User.find(3)) + end + def test_save_attachments_with_hash_should_save_attachments_in_keys_order set_tmp_attachments_directory issue = Issue.generate! diff -Nru redmine-2.3.3/test/unit/journal_test.rb redmine-2.4.2/test/unit/journal_test.rb --- redmine-2.3.3/test/unit/journal_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/journal_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -137,7 +137,7 @@ user.reload journals = Journal.visible(user).all assert journals.empty? - # User should see issues of projects for which he has view_issues permissions only + # User should see issues of projects for which user has view_issues permissions only Member.create!(:principal => user, :project_id => 1, :role_ids => [1]) user.reload journals = Journal.visible(user).all @@ -151,10 +151,24 @@ assert user.projects.empty? journals = Journal.visible(user).all assert journals.any? - # Admin should see issues on private projects that he does not belong to + # Admin should see issues on private projects that admin does not belong to assert journals.detect {|journal| !journal.issue.project.is_public?} end + def test_preload_journals_details_custom_fields_should_set_custom_field_instance_variable + d = JournalDetail.new(:property => 'cf', :prop_key => '2') + journals = [Journal.new(:details => [d])] + + d.expects(:instance_variable_set).with("@custom_field", CustomField.find(2)).once + Journal.preload_journals_details_custom_fields(journals) + end + + def test_preload_journals_details_custom_fields_with_empty_set + assert_nothing_raised do + Journal.preload_journals_details_custom_fields([]) + end + end + def test_details_should_normalize_dates j = JournalDetail.create!(:old_value => Date.parse('2012-11-03'), :value => Date.parse('2013-01-02')) j.reload @@ -175,4 +189,33 @@ assert_equal '0', j.old_value assert_equal '0', j.value end + + def test_custom_field_should_return_custom_field_for_cf_detail + d = JournalDetail.new(:property => 'cf', :prop_key => '2') + assert_equal CustomField.find(2), d.custom_field + end + + def test_custom_field_should_return_nil_for_non_cf_detail + d = JournalDetail.new(:property => 'subject') + assert_equal nil, d.custom_field + end + + def test_visible_details_should_include_relations_to_visible_issues_only + issue = Issue.generate! + visible_issue = Issue.generate! + IssueRelation.create!(:issue_from => issue, :issue_to => visible_issue, :relation_type => 'relates') + hidden_issue = Issue.generate!(:is_private => true) + IssueRelation.create!(:issue_from => issue, :issue_to => hidden_issue, :relation_type => 'relates') + issue.reload + assert_equal 1, issue.journals.size + journal = issue.journals.first + assert_equal 2, journal.details.size + + visible_details = journal.visible_details(User.anonymous) + assert_equal 1, visible_details.size + assert_equal visible_issue.id.to_s, visible_details.first.value + + visible_details = journal.visible_details(User.find(2)) + assert_equal 2, visible_details.size + end end diff -Nru redmine-2.3.3/test/unit/lib/redmine/helpers/diff_test.rb redmine-2.4.2/test/unit/lib/redmine/helpers/diff_test.rb --- redmine-2.3.3/test/unit/lib/redmine/helpers/diff_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/helpers/diff_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,25 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../../../../test_helper', __FILE__) + +class DiffTest < ActiveSupport::TestCase + def test_diff + diff = Redmine::Helpers::Diff.new("foo", "bar") + assert_not_nil diff + end +end diff -Nru redmine-2.3.3/test/unit/lib/redmine/helpers/gantt_test.rb redmine-2.4.2/test/unit/lib/redmine/helpers/gantt_test.rb --- redmine-2.3.3/test/unit/lib/redmine/helpers/gantt_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/helpers/gantt_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -57,11 +57,26 @@ context "#number_of_rows" do context "with one project" do - should "return the number of rows just for that project" + should "return the number of rows just for that project" do + p1, p2 = Project.generate!, Project.generate! + i1, i2 = Issue.generate!(:project => p1), Issue.generate!(:project => p2) + create_gantt(p1) + assert_equal 2, @gantt.number_of_rows + end end context "with no project" do - should "return the total number of rows for all the projects, resursively" + should "return the total number of rows for all the projects, resursively" do + p1, p2 = Project.generate!, Project.generate! + create_gantt(nil) + #fix the return value of #number_of_rows_on_project() to an arbitrary value + #so that we really only test #number_of_rows + @gantt.stubs(:number_of_rows_on_project).returns(7) + #also fix #projects because we want to test #number_of_rows in isolation + @gantt.stubs(:projects).returns(Project.all) + #actual test + assert_equal Project.count*7, @gantt.number_of_rows + end end should "not exceed max_rows option" do @@ -746,4 +761,81 @@ context "#to_pdf" do should "be tested" end + + def test_sort_issues_no_date + project = Project.generate! + issue1 = Issue.generate!(:subject => "test", :project => project) + issue2 = Issue.generate!(:subject => "test", :project => project) + assert issue1.root_id < issue2.root_id + child1 = Issue.generate!(:parent_issue_id => issue1.id, :subject => 'child', + :project => project) + child2 = Issue.generate!(:parent_issue_id => issue1.id, :subject => 'child', + :project => project) + child3 = Issue.generate!(:parent_issue_id => child1.id, :subject => 'child', + :project => project) + assert_equal child1.root_id, child2.root_id + assert child1.lft < child2.lft + assert child3.lft < child2.lft + issues = [child3, child2, child1, issue2, issue1] + Redmine::Helpers::Gantt.sort_issues!(issues) + assert_equal [issue1.id, child1.id, child3.id, child2.id, issue2.id], + issues.map{|v| v.id} + end + + def test_sort_issues_root_only + project = Project.generate! + issue1 = Issue.generate!(:subject => "test", :project => project) + issue2 = Issue.generate!(:subject => "test", :project => project) + issue3 = Issue.generate!(:subject => "test", :project => project, + :start_date => (today - 1)) + issue4 = Issue.generate!(:subject => "test", :project => project, + :start_date => (today - 2)) + issues = [issue4, issue3, issue2, issue1] + Redmine::Helpers::Gantt.sort_issues!(issues) + assert_equal [issue1.id, issue2.id, issue4.id, issue3.id], + issues.map{|v| v.id} + end + + def test_sort_issues_tree + project = Project.generate! + issue1 = Issue.generate!(:subject => "test", :project => project) + issue2 = Issue.generate!(:subject => "test", :project => project, + :start_date => (today - 2)) + issue1_child1 = + Issue.generate!(:parent_issue_id => issue1.id, :subject => 'child', + :project => project) + issue1_child2 = + Issue.generate!(:parent_issue_id => issue1.id, :subject => 'child', + :project => project, :start_date => (today - 10)) + issue1_child1_child1 = + Issue.generate!(:parent_issue_id => issue1_child1.id, :subject => 'child', + :project => project, :start_date => (today - 8)) + issue1_child1_child2 = + Issue.generate!(:parent_issue_id => issue1_child1.id, :subject => 'child', + :project => project, :start_date => (today - 9)) + issue1_child1_child1_logic = Redmine::Helpers::Gantt.sort_issue_logic(issue1_child1_child1) + assert_equal [[today - 10, issue1.id], [today - 9, issue1_child1.id], + [today - 8, issue1_child1_child1.id]], + issue1_child1_child1_logic + issue1_child1_child2_logic = Redmine::Helpers::Gantt.sort_issue_logic(issue1_child1_child2) + assert_equal [[today - 10, issue1.id], [today - 9, issue1_child1.id], + [today - 9, issue1_child1_child2.id]], + issue1_child1_child2_logic + issues = [issue1_child1_child2, issue1_child1_child1, issue1_child2, + issue1_child1, issue2, issue1] + Redmine::Helpers::Gantt.sort_issues!(issues) + assert_equal [issue1.id, issue1_child1.id, issue1_child2.id, + issue1_child1_child2.id, issue1_child1_child1.id, issue2.id], + issues.map{|v| v.id} + end + + def test_sort_versions + project = Project.generate! + version1 = Version.create!(:project => project, :name => 'test1') + version2 = Version.create!(:project => project, :name => 'test2', :effective_date => '2013-10-25') + version3 = Version.create!(:project => project, :name => 'test3') + version4 = Version.create!(:project => project, :name => 'test4', :effective_date => '2013-10-02') + + assert_equal versions.sort, Redmine::Helpers::Gantt.sort_versions!(versions) + end end diff -Nru redmine-2.3.3/test/unit/lib/redmine/hook_test.rb redmine-2.4.2/test/unit/lib/redmine/hook_test.rb --- redmine-2.3.3/test/unit/lib/redmine/hook_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/hook_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -154,14 +154,14 @@ issue = Issue.find(1) ActionMailer::Base.deliveries.clear - Mailer.issue_add(issue).deliver + Mailer.deliver_issue_add(issue) mail = ActionMailer::Base.deliveries.last @hook_module.add_listener(TestLinkToHook) hook_helper.call_hook(:view_layouts_base_html_head) ActionMailer::Base.deliveries.clear - Mailer.issue_add(issue).deliver + Mailer.deliver_issue_add(issue) mail2 = ActionMailer::Base.deliveries.last assert_equal mail_body(mail), mail_body(mail2) diff -Nru redmine-2.3.3/test/unit/lib/redmine/i18n_test.rb redmine-2.4.2/test/unit/lib/redmine/i18n_test.rb --- redmine-2.3.3/test/unit/lib/redmine/i18n_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/i18n_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -105,12 +105,12 @@ now = Time.parse('2011-02-20 15:45:22') with_settings :time_format => '' do with_settings :date_format => '' do - assert_equal '02/20/2011 03:45 pm', format_time(now) - assert_equal '03:45 pm', format_time(now, false) + assert_equal '02/20/2011 03:45 PM', format_time(now) + assert_equal '03:45 PM', format_time(now, false) end with_settings :date_format => '%Y-%m-%d' do - assert_equal '2011-02-20 03:45 pm', format_time(now) - assert_equal '03:45 pm', format_time(now, false) + assert_equal '2011-02-20 03:45 PM', format_time(now) + assert_equal '03:45 PM', format_time(now, false) end end end @@ -131,15 +131,6 @@ end end - def test_time_format - set_language_if_valid 'en' - now = Time.now - Setting.date_format = '%d %m %Y' - Setting.time_format = '%H %M' - assert_equal now.strftime('%d %m %Y %H %M'), format_time(now) - assert_equal now.strftime('%H %M'), format_time(now, false) - end - def test_utc_time_format set_language_if_valid 'en' now = Time.now @@ -196,13 +187,15 @@ def test_languages_options options = languages_options - assert options.is_a?(Array) assert_equal valid_languages.size, options.size assert_nil options.detect {|option| !option.is_a?(Array)} assert_nil options.detect {|option| option.size != 2} assert_nil options.detect {|option| !option.first.is_a?(String) || !option.last.is_a?(String)} assert_include ["English", "en"], options + ja = "Japanese (\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e)" + ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding) + assert_include [ja, "ja"], options end def test_locales_validness diff -Nru redmine-2.3.3/test/unit/lib/redmine/menu_manager/mapper_test.rb redmine-2.4.2/test/unit/lib/redmine/menu_manager/mapper_test.rb --- redmine-2.3.3/test/unit/lib/redmine/menu_manager/mapper_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/menu_manager/mapper_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,8 +18,17 @@ require File.expand_path('../../../../../test_helper', __FILE__) class Redmine::MenuManager::MapperTest < ActiveSupport::TestCase - context "Mapper#initialize" do - should "be tested" + test "Mapper#initialize should define a root MenuNode if menu is not present in items" do + menu_mapper = Redmine::MenuManager::Mapper.new(:test_menu, {}) + node = menu_mapper.menu_items + assert_not_nil node + assert_equal :root, node.name + end + + test "Mapper#initialize should use existing MenuNode if present" do + node = "foo" # just an arbitrary reference + menu_mapper = Redmine::MenuManager::Mapper.new(:test_menu, {:test_menu => node}) + assert_equal node, menu_mapper.menu_items end def test_push_onto_root diff -Nru redmine-2.3.3/test/unit/lib/redmine/plugin_test.rb redmine-2.4.2/test/unit/lib/redmine/plugin_test.rb --- redmine-2.3.3/test/unit/lib/redmine/plugin_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/plugin_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,6 @@ require File.expand_path('../../../../test_helper', __FILE__) class Redmine::PluginTest < ActiveSupport::TestCase - def setup @klass = Redmine::Plugin # In case some real plugins are installed @@ -55,7 +54,6 @@ def test_installed @klass.register(:foo) {} - assert_equal true, @klass.installed?(:foo) assert_equal false, @klass.installed?(:bar) end @@ -74,7 +72,6 @@ def test_delete_menu_item Redmine::MenuManager.map(:project_menu).push(:foo_menu_item, '/foo', :caption => 'Foo') - assert_difference 'Redmine::MenuManager.items(:project_menu).size', -1 do @klass.register :foo do delete_menu_item :project_menu, :foo_menu_item @@ -83,10 +80,21 @@ assert_nil Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item} end + def test_directory_with_override + @klass.register(:foo) do + directory '/path/to/foo' + end + assert_equal '/path/to/foo', @klass.find('foo').directory + end + + def test_directory_without_override + @klass.register(:foo) {} + assert_equal File.join(@klass.directory, 'foo'), @klass.find('foo').directory + end + def test_requires_redmine plugin = Redmine::Plugin.register(:foo) {} Redmine::VERSION.stubs(:to_a).returns([2, 1, 3, "stable", 10817]) - # Specific version without hash assert plugin.requires_redmine('2.1.3') assert plugin.requires_redmine('2.1') @@ -96,7 +104,6 @@ assert_raise Redmine::PluginRequirementError do plugin.requires_redmine('2.2') end - # Specific version assert plugin.requires_redmine(:version => '2.1.3') assert plugin.requires_redmine(:version => ['2.1.3', '2.2.0']) @@ -110,7 +117,6 @@ assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => '2.2') end - # Version range assert plugin.requires_redmine(:version => '2.0.0'..'2.2.4') assert plugin.requires_redmine(:version => '2.1.3'..'2.2.4') @@ -121,8 +127,6 @@ assert_raise Redmine::PluginRequirementError do plugin.requires_redmine(:version => '2.1.4'..'2.2.4') end - - # Version or higher assert plugin.requires_redmine(:version_or_higher => '0.1.0') assert plugin.requires_redmine(:version_or_higher => '2.1.3') @@ -138,12 +142,10 @@ def test_requires_redmine_plugin test = self other_version = '0.5.0' - @klass.register :other do name 'Other' version other_version end - @klass.register :foo do test.assert requires_redmine_plugin(:other, :version_or_higher => '0.1.0') test.assert requires_redmine_plugin(:other, :version_or_higher => other_version) @@ -151,7 +153,6 @@ test.assert_raise Redmine::PluginRequirementError do requires_redmine_plugin(:other, :version_or_higher => '99.0.0') end - test.assert requires_redmine_plugin(:other, :version => other_version) test.assert requires_redmine_plugin(:other, :version => [other_version, '99.0.0']) test.assert_raise Redmine::PluginRequirementError do @@ -170,7 +171,6 @@ test.assert_raise Redmine::PluginNotFound do requires_redmine_plugin(:missing, :version => '0.1.0') end - end end end diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,7 +17,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class BazaarAdapterTest < ActiveSupport::TestCase REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,7 +17,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class CvsAdapterTest < ActiveSupport::TestCase REPOSITORY_PATH = Rails.root.join('tmp/test/cvs_repository').to_s diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/darcs_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/darcs_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/darcs_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/darcs_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,7 +17,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class DarcsAdapterTest < ActiveSupport::TestCase REPOSITORY_PATH = Rails.root.join('tmp/test/darcs_repository').to_s diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,7 +17,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class GitAdapterTest < ActiveSupport::TestCase REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s @@ -61,8 +61,10 @@ ) assert @adapter @char_1 = CHAR_1_HEX.dup + @str_felix_hex = FELIX_HEX.dup if @char_1.respond_to?(:force_encoding) @char_1.force_encoding('UTF-8') + @str_felix_hex.force_encoding('ASCII-8BIT') end end @@ -396,14 +398,10 @@ def test_last_rev_with_spaces_in_filename last_rev = @adapter.lastrev("filemane with spaces.txt", "ed5bb786bbda2dee66a2d50faf51429dbc043a7b") - str_felix_hex = FELIX_HEX.dup last_rev_author = last_rev.author - if last_rev_author.respond_to?(:force_encoding) - str_felix_hex.force_encoding('ASCII-8BIT') - end assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier - assert_equal "#{str_felix_hex} ", + assert_equal "#{@str_felix_hex} ", last_rev.author assert_equal "2010-09-18 19:59:46".to_time, last_rev.time end @@ -426,6 +424,19 @@ end end + def test_latin_1_user_annotate + ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', '83ca5fd546063a'].each do |r1| + annotate = @adapter.annotate(" filename with a leading space.txt ", r1) + assert_kind_of Redmine::Scm::Adapters::Annotate, annotate + assert_equal 1, annotate.lines.size + assert_equal "And this is a file with a leading and trailing space...", + annotate.lines[0].strip + assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", + annotate.revisions[0].identifier + assert_equal @str_felix_hex, annotate.revisions[0].author + end + end + def test_entries_tag entries1 = @adapter.entries(nil, 'tag01.annotated', options = {:report_last_commit => true}) diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -17,7 +17,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class MercurialAdapterTest < ActiveSupport::TestCase HELPERS_DIR = Redmine::Scm::Adapters::MercurialAdapter::HELPERS_DIR diff -Nru redmine-2.3.3/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb redmine-2.4.2/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,7 +18,7 @@ require File.expand_path('../../../../../../test_helper', __FILE__) begin - require 'mocha' + require 'mocha/setup' class SubversionAdapterTest < ActiveSupport::TestCase diff -Nru redmine-2.3.3/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb redmine-2.4.2/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb --- redmine-2.3.3/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb 2013-09-14 06:47:56.000000000 +0000 +++ redmine-2.4.2/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -159,11 +159,11 @@ ) end - def test_acronyms + def test_abbreviations assert_html_output( - 'this is an acronym: GPL(General Public License)' => 'this is an acronym: GPL', - '2 letters JP(Jean-Philippe) acronym' => '2 letters JP acronym', - 'GPL(This is a double-quoted "title")' => 'GPL' + 'this is an abbreviation: GPL(General Public License)' => 'this is an abbreviation: GPL', + '2 letters JP(Jean-Philippe) abbreviation' => '2 letters JP abbreviation', + 'GPL(This is a double-quoted "title")' => 'GPL' ) end @@ -268,6 +268,42 @@ assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '') end + def test_tables_with_lists + raw = <<-RAW +This is a table with lists: + +|cell11|cell12| +|cell21|ordered list +# item +# item 2| +|cell31|unordered list +* item +* item 2| + +RAW + + expected = <<-EXPECTED +

    This is a table with lists:

    + + + + + + + + + + + + + + +
    cell11cell12
    cell21ordered list
    # item
    # item 2
    cell31unordered list
    * item
    * item 2
    +EXPECTED + + assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '') + end + def test_textile_should_not_mangle_brackets assert_equal '

    [msg1][msg2]

    ', to_html('[msg1][msg2]') end diff -Nru redmine-2.3.3/test/unit/mail_handler_test.rb redmine-2.4.2/test/unit/mail_handler_test.rb --- redmine-2.3.3/test/unit/mail_handler_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/mail_handler_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -370,6 +370,15 @@ assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') end + def test_add_issue_with_invalid_project_should_be_assigned_to_default_project + issue = submit_email('ticket_on_given_project.eml', :issue => {:project => 'ecookbook'}, :allow_override => 'project') do |email| + email.gsub!(/^Project:.+$/, 'Project: invalid') + end + assert issue.is_a?(Issue) + assert !issue.new_record? + assert_equal 'ecookbook', issue.project.identifier + end + def test_add_issue_with_localized_attributes User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'fr' issue = submit_email( @@ -492,6 +501,21 @@ assert_equal 'd8e8fca2dc0f896fd7cb4cb0031ba249', attachment.digest end + def test_multiple_inline_text_parts_should_be_appended_to_issue_description + issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'}) + assert_include 'first', issue.description + assert_include 'second', issue.description + assert_include 'third', issue.description + end + + def test_attachment_text_part_should_be_added_as_issue_attachment + issue = submit_email('multiple_text_parts.eml', :issue => {:project => 'ecookbook'}) + assert_not_include 'Plain text attachment', issue.description + attachment = issue.attachments.detect {|a| a.filename == 'textfile.txt'} + assert_not_nil attachment + assert_include 'Plain text attachment', File.read(attachment.diskfile) + end + def test_add_issue_with_iso_8859_1_subject issue = submit_email( 'subject_as_iso-8859-1.eml', @@ -743,6 +767,24 @@ end end + def test_attachments_that_match_mail_handler_excluded_filenames_should_be_ignored + with_settings :mail_handler_excluded_filenames => '*.vcf, *.jpg' do + issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'}) + assert issue.is_a?(Issue) + assert !issue.new_record? + assert_equal 0, issue.reload.attachments.size + end + end + + def test_attachments_that_do_not_match_mail_handler_excluded_filenames_should_be_attached + with_settings :mail_handler_excluded_filenames => '*.vcf, *.gif' do + issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'}) + assert issue.is_a?(Issue) + assert !issue.new_record? + assert_equal 1, issue.reload.attachments.size + end + end + def test_email_with_long_subject_line issue = submit_email('ticket_with_long_subject.eml') assert issue.is_a?(Issue) @@ -772,14 +814,6 @@ end end - def test_new_user_from_attributes_should_respect_minimum_password_length - with_settings :password_min_length => 15 do - user = MailHandler.new_user_from_attributes('jsmith@example.net') - assert user.valid? - assert user.password.length >= 15 - end - end - def test_new_user_from_attributes_should_use_default_login_if_invalid user = MailHandler.new_user_from_attributes('foo+bar@example.net') assert user.valid? @@ -806,6 +840,19 @@ assert_equal str2, user.lastname end + def test_extract_options_from_env_should_return_options + options = MailHandler.extract_options_from_env({ + 'tracker' => 'defect', + 'project' => 'foo', + 'unknown_user' => 'create' + }) + + assert_equal({ + :issue => {:tracker => 'defect', :project => 'foo'}, + :unknown_user => 'create' + }, options) + end + private def submit_email(filename, options={}) diff -Nru redmine-2.3.3/test/unit/mailer_test.rb redmine-2.4.2/test/unit/mailer_test.rb --- redmine-2.3.3/test/unit/mailer_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/mailer_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -42,7 +42,7 @@ Setting.protocol = 'https' journal = Journal.find(3) - assert Mailer.issue_edit(journal).deliver + assert Mailer.deliver_issue_edit(journal) mail = last_email assert_not_nil mail @@ -81,7 +81,7 @@ Setting.protocol = 'http' journal = Journal.find(3) - assert Mailer.issue_edit(journal).deliver + assert Mailer.deliver_issue_edit(journal) mail = last_email assert_not_nil mail @@ -113,6 +113,16 @@ end end + def test_issue_edit_should_generate_url_with_hostname_for_relations + journal = Journal.new(:journalized => Issue.find(1), :user => User.find(1), :created_on => Time.now) + journal.details << JournalDetail.new(:property => 'relation', :prop_key => 'label_relates_to', :value => 2) + Mailer.deliver_issue_edit(journal) + assert_not_nil last_email + assert_select_email do + assert_select 'a[href=?]', 'http://mydomain.foo/issues/2', :text => 'Feature request #2' + end + end + def test_generated_links_with_prefix_and_no_relative_url_root Setting.default_language = 'en' relative_url_root = Redmine::Utils.relative_url_root @@ -121,7 +131,7 @@ Redmine::Utils.relative_url_root = nil journal = Journal.find(3) - assert Mailer.issue_edit(journal).deliver + assert Mailer.deliver_issue_edit(journal) mail = last_email assert_not_nil mail @@ -158,7 +168,7 @@ def test_email_headers issue = Issue.find(1) - Mailer.issue_add(issue).deliver + Mailer.deliver_issue_add(issue) mail = last_email assert_not_nil mail assert_equal 'OOF', mail.header['X-Auto-Response-Suppress'].to_s @@ -168,7 +178,7 @@ def test_email_headers_should_include_sender issue = Issue.find(1) - Mailer.issue_add(issue).deliver + Mailer.deliver_issue_add(issue) mail = last_email assert_equal issue.author.login, mail.header['X-Redmine-Sender'].to_s end @@ -176,7 +186,7 @@ def test_plain_text_mail Setting.plain_text_mail = 1 journal = Journal.find(2) - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) mail = last_email assert_equal "text/plain; charset=UTF-8", mail.content_type assert_equal 0, mail.parts.size @@ -186,7 +196,7 @@ def test_html_mail Setting.plain_text_mail = 0 journal = Journal.find(2) - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) mail = last_email assert_equal 2, mail.parts.size assert mail.encoded.include?('href') @@ -231,19 +241,21 @@ end def test_issue_add_message_id - issue = Issue.find(1) - Mailer.issue_add(issue).deliver + issue = Issue.find(2) + Mailer.deliver_issue_add(issue) mail = last_email - assert_equal Mailer.message_id_for(issue), mail.message_id - assert_nil mail.references + assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.issue-2.20060719190421@example.net", mail.references end def test_issue_edit_message_id - journal = Journal.find(1) - Mailer.issue_edit(journal).deliver + journal = Journal.find(3) + journal.issue = Issue.find(2) + + Mailer.deliver_issue_edit(journal) mail = last_email - assert_equal Mailer.message_id_for(journal), mail.message_id - assert_include Mailer.message_id_for(journal.issue), mail.references + assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.issue-2.20060719190421@example.net", mail.references assert_select_email do # link to the update assert_select "a[href=?]", @@ -255,8 +267,8 @@ message = Message.find(1) Mailer.message_posted(message).deliver mail = last_email - assert_equal Mailer.message_id_for(message), mail.message_id - assert_nil mail.references + assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.message-1.20070512151532@example.net", mail.references assert_select_email do # link to the message assert_select "a[href=?]", @@ -269,8 +281,8 @@ message = Message.find(3) Mailer.message_posted(message).deliver mail = last_email - assert_equal Mailer.message_id_for(message), mail.message_id - assert_include Mailer.message_id_for(message.parent), mail.references + assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.message-1.20070512151532@example.net", mail.references assert_select_email do # link to the reply assert_select "a[href=?]", @@ -281,14 +293,14 @@ test "#issue_add should notify project members" do issue = Issue.find(1) - assert Mailer.issue_add(issue).deliver + assert Mailer.deliver_issue_add(issue) assert last_email.bcc.include?('dlopper@somenet.foo') end test "#issue_add should not notify project members that are not allow to view the issue" do issue = Issue.find(1) Role.find(2).remove_permission!(:view_issues) - assert Mailer.issue_add(issue).deliver + assert Mailer.deliver_issue_add(issue) assert !last_email.bcc.include?('dlopper@somenet.foo') end @@ -302,7 +314,7 @@ user.save Watcher.create!(:watchable => issue, :user => user) - assert Mailer.issue_add(issue).deliver + assert Mailer.deliver_issue_add(issue) assert last_email.bcc.include?(user.mail) end @@ -311,7 +323,7 @@ user = User.find(9) Watcher.create!(:watchable => issue, :user => user) Role.non_member.remove_permission!(:view_issues) - assert Mailer.issue_add(issue).deliver + assert Mailer.deliver_issue_add(issue) assert !last_email.bcc.include?(user.mail) end @@ -343,7 +355,7 @@ issue = Issue.find(1) valid_languages.each do |lang| Setting.default_language = lang.to_s - assert Mailer.issue_add(issue).deliver + assert Mailer.deliver_issue_add(issue) end end @@ -351,7 +363,7 @@ journal = Journal.find(1) valid_languages.each do |lang| Setting.default_language = lang.to_s - assert Mailer.issue_edit(journal).deliver + assert Mailer.deliver_issue_edit(journal) end end @@ -361,11 +373,11 @@ journal.save! Role.find(2).add_permission! :view_private_notes - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) assert_equal %w(dlopper@somenet.foo jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort Role.find(2).remove_permission! :view_private_notes - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) assert_equal %w(jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort end @@ -376,11 +388,11 @@ journal.save! Role.non_member.add_permission! :view_private_notes - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) assert_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort Role.non_member.remove_permission! :view_private_notes - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) assert_not_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort end @@ -390,11 +402,27 @@ journal.save! with_settings :default_language => 'en' do - Mailer.issue_edit(journal).deliver + Mailer.deliver_issue_edit(journal) end assert_mail_body_match '(Private notes)', last_email end + def test_issue_edit_with_relation_should_notify_users_who_can_see_the_related_issue + issue = Issue.generate! + private_issue = Issue.generate!(:is_private => true) + IssueRelation.create!(:issue_from => issue, :issue_to => private_issue, :relation_type => 'relates') + issue.reload + assert_equal 1, issue.journals.size + journal = issue.journals.first + ActionMailer::Base.deliveries.clear + + Mailer.deliver_issue_edit(journal) + last_email.bcc.each do |email| + user = User.find_by_mail(email) + assert private_issue.visible?(user), "Issue was not visible to #{user}" + end + end + def test_document_added document = Document.find(1) valid_languages.each do |lang| @@ -613,12 +641,66 @@ def test_layout_should_include_the_emails_header with_settings :emails_header => "*Header content*" do + with_settings :plain_text_mail => 0 do + assert Mailer.test_email(User.find(1)).deliver + assert_select_email do + assert_select ".header" do + assert_select "strong", :text => "Header content" + end + end + end + with_settings :plain_text_mail => 1 do + assert Mailer.test_email(User.find(1)).deliver + mail = last_email + assert_not_nil mail + assert_include "*Header content*", mail.body.decoded + end + end + end + + def test_layout_should_not_include_empty_emails_header + with_settings :emails_header => "", :plain_text_mail => 0 do assert Mailer.test_email(User.find(1)).deliver assert_select_email do - assert_select ".header" do - assert_select "strong", :text => "Header content" + assert_select ".header", false + end + end + end + + def test_layout_should_include_the_emails_footer + with_settings :emails_footer => "*Footer content*" do + with_settings :plain_text_mail => 0 do + assert Mailer.test_email(User.find(1)).deliver + assert_select_email do + assert_select ".footer" do + assert_select "strong", :text => "Footer content" + end + end + end + with_settings :plain_text_mail => 1 do + assert Mailer.test_email(User.find(1)).deliver + mail = last_email + assert_not_nil mail + assert_include "\n-- \n", mail.body.decoded + assert_include "*Footer content*", mail.body.decoded + end + end + end + + def test_layout_should_not_include_empty_emails_footer + with_settings :emails_footer => "" do + with_settings :plain_text_mail => 0 do + assert Mailer.test_email(User.find(1)).deliver + assert_select_email do + assert_select ".footer", false end end + with_settings :plain_text_mail => 1 do + assert Mailer.test_email(User.find(1)).deliver + mail = last_email + assert_not_nil mail + assert_not_include "\n-- \n", mail.body.decoded + end end end @@ -630,6 +712,33 @@ assert_include '<tag>', html_part.body.encoded end + def test_should_raise_delivery_errors_when_raise_delivery_errors_is_true + mail = Mailer.test_email(User.find(1)) + mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error")) + + ActionMailer::Base.raise_delivery_errors = true + assert_raise Exception, "delivery error" do + mail.deliver + end + ensure + ActionMailer::Base.raise_delivery_errors = false + end + + def test_should_log_delivery_errors_when_raise_delivery_errors_is_false + mail = Mailer.test_email(User.find(1)) + mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error")) + + Rails.logger.expects(:error).with("Email delivery error: delivery error") + ActionMailer::Base.raise_delivery_errors = false + assert_nothing_raised do + mail.deliver + end + end + + def test_mail_should_return_a_mail_message + assert_kind_of ::Mail::Message, Mailer.test_email(User.find(1)) + end + private def last_email diff -Nru redmine-2.3.3/test/unit/project_copy_test.rb redmine-2.4.2/test/unit/project_copy_test.rb --- redmine-2.3.3/test/unit/project_copy_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/project_copy_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -63,7 +63,7 @@ assert_equal @project, issue.project end - copied_issue = @project.issues.first(:conditions => {:subject => "copy issue status"}) + copied_issue = @project.issues.where(:subject => "copy issue status").first assert copied_issue assert copied_issue.status assert_equal "Closed", copied_issue.status.name @@ -93,7 +93,7 @@ assert @project.copy(@source_project) @project.reload - copied_issue = @project.issues.first(:conditions => {:subject => "copy issues assigned to a locked version"}) + copied_issue = @project.issues.where(:subject => "copy issues assigned to a locked version").first assert copied_issue assert copied_issue.fixed_version @@ -112,7 +112,7 @@ assert @project.copy(@source_project) @project.reload - copied_issue = @project.issues.first(:conditions => {:subject => "change the new issues to use the copied version"}) + copied_issue = @project.issues.where(:subject => "change the new issues to use the copied version").first assert copied_issue assert copied_issue.fixed_version @@ -128,7 +128,7 @@ assert @project.copy(@source_project) @project.reload - copied_issue = @project.issues.first(:conditions => {:subject => "keep target shared versions"}) + copied_issue = @project.issues.where(:subject => "keep target shared versions").first assert copied_issue assert_equal assigned_version, copied_issue.fixed_version @@ -175,7 +175,7 @@ @source_project.issues << issue assert @project.copy(@source_project) - copied_issue = @project.issues.first(:conditions => {:subject => "copy with attachment"}) + copied_issue = @project.issues.where(:subject => "copy with attachment").first assert_not_nil copied_issue assert_equal 1, copied_issue.attachments.count, "Attachment not copied" assert_equal "testfile.txt", copied_issue.attachments.first.filename diff -Nru redmine-2.3.3/test/unit/project_members_inheritance_test.rb redmine-2.4.2/test/unit/project_members_inheritance_test.rb --- redmine-2.3.3/test/unit/project_members_inheritance_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/project_members_inheritance_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -105,6 +105,7 @@ def test_moving_a_subproject_to_another_parent_should_change_inherited_members other_parent = Project.generate! other_member = Member.create!(:principal => User.find(4), :project => other_parent, :role_ids => [3]) + other_member.reload Project.generate_with_parent!(@parent, :inherit_members => true) project = Project.order('id desc').first @@ -157,6 +158,7 @@ assert_difference 'Member.count', 2 do member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3]) + member.reload inherited_member = project.memberships.order('id desc').first assert_equal member.principal, inherited_member.principal @@ -195,11 +197,12 @@ assert_difference 'MemberRole.count', 8 do member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3]) project.reload - + member.reload + inherited_group_member = project.memberships.detect {|m| m.principal == group} assert_not_nil inherited_group_member assert_equal member.roles.sort, inherited_group_member.roles.sort - + inherited_user_member = project.memberships.detect {|m| m.principal == user} assert_not_nil inherited_user_member assert_equal member.roles.sort, inherited_user_member.roles.sort @@ -218,10 +221,10 @@ assert_difference 'MemberRole.count', -8 do member.destroy project.reload - + inherited_group_member = project.memberships.detect {|m| m.principal == group} assert_nil inherited_group_member - + inherited_user_member = project.memberships.detect {|m| m.principal == user} assert_nil inherited_user_member end diff -Nru redmine-2.3.3/test/unit/project_test.rb redmine-2.4.2/test/unit/project_test.rb --- redmine-2.3.3/test/unit/project_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/project_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -175,7 +175,7 @@ # Assign an issue of a project to a version of a child project Issue.find(4).update_attribute :fixed_version_id, 4 - assert_no_difference "Project.count(:all, :conditions => 'status = #{Project::STATUS_ARCHIVED}')" do + assert_no_difference "Project.where(:status => Project::STATUS_ARCHIVED).count" do assert_equal false, @ecookbook.archive end @ecookbook.reload @@ -211,9 +211,9 @@ # make sure that the project non longer exists assert_raise(ActiveRecord::RecordNotFound) { Project.find(@ecookbook.id) } # make sure related data was removed - assert_nil Member.first(:conditions => {:project_id => @ecookbook.id}) - assert_nil Board.first(:conditions => {:project_id => @ecookbook.id}) - assert_nil Issue.first(:conditions => {:project_id => @ecookbook.id}) + assert_nil Member.where(:project_id => @ecookbook.id).first + assert_nil Board.where(:project_id => @ecookbook.id).first + assert_nil Issue.where(:project_id => @ecookbook.id).first end def test_destroy_should_destroy_subtasks @@ -246,7 +246,7 @@ assert_equal 0, Board.count assert_equal 0, Message.count assert_equal 0, News.count - assert_equal 0, Query.count(:conditions => "project_id IS NOT NULL") + assert_equal 0, Query.where("project_id IS NOT NULL").count assert_equal 0, Repository.count assert_equal 0, Changeset.count assert_equal 0, Change.count @@ -260,7 +260,7 @@ assert_equal 0, WikiContent::Version.count assert_equal 0, Project.connection.select_all("SELECT * FROM projects_trackers").size assert_equal 0, Project.connection.select_all("SELECT * FROM custom_fields_projects").size - assert_equal 0, CustomValue.count(:conditions => {:customized_type => ['Project', 'Issue', 'TimeEntry', 'Version']}) + assert_equal 0, CustomValue.where(:customized_type => ['Project', 'Issue', 'TimeEntry', 'Version']).count end def test_move_an_orphan_project_to_a_root_project diff -Nru redmine-2.3.3/test/unit/query_test.rb redmine-2.4.2/test/unit/query_test.rb --- redmine-2.3.3/test/unit/query_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/query_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -28,9 +28,54 @@ :projects_trackers, :custom_fields_trackers + def test_query_with_roles_visibility_should_validate_roles + set_language_if_valid 'en' + query = IssueQuery.new(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES) + assert !query.save + assert_include "Roles can't be blank", query.errors.full_messages + query.role_ids = [1, 2] + assert query.save + end + + def test_changing_roles_visibility_should_clear_roles + query = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES, :role_ids => [1, 2]) + assert_equal 2, query.roles.count + + query.visibility = IssueQuery::VISIBILITY_PUBLIC + query.save! + assert_equal 0, query.roles.count + end + def test_available_filters_should_be_ordered + set_language_if_valid 'en' query = IssueQuery.new assert_equal 0, query.available_filters.keys.index('status_id') + expected_order = [ + "Status", + "Project", + "Tracker", + "Priority" + ] + assert_equal expected_order, + (query.available_filters.values.map{|v| v[:name]} & expected_order) + end + + def test_available_filters_with_custom_fields_should_be_ordered + set_language_if_valid 'en' + UserCustomField.create!( + :name => 'order test', :field_format => 'string', + :is_for_all => true, :is_filter => true + ) + query = IssueQuery.new + expected_order = [ + "Searchable field", + "Database", + "Project's Development status", + "Author's order test", + "Assignee's order test" + ] + assert_equal expected_order, + (query.available_filters.values.map{|v| v[:name]} & expected_order) end def test_custom_fields_for_all_projects_should_be_available_in_global_queries @@ -70,7 +115,7 @@ def assert_query_statement_includes(query, condition) assert_include condition, query.statement end - + def assert_query_result(expected, query) assert_nothing_raised do assert_equal expected.map(&:id).sort, query.issues.map(&:id).sort @@ -174,7 +219,7 @@ end def test_operator_is_on_integer_custom_field - f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -187,7 +232,7 @@ end def test_operator_is_on_integer_custom_field_should_accept_negative_value - f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_for_all => true, :is_filter => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '-12') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -201,7 +246,7 @@ end def test_operator_is_on_float_custom_field - f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12.7') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -214,7 +259,7 @@ end def test_operator_is_on_float_custom_field_should_accept_negative_value - f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'float', :is_filter => true, :is_for_all => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7.3') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '-12.7') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -229,7 +274,7 @@ def test_operator_is_on_multi_list_custom_field f = IssueCustomField.create!(:name => 'filter', :field_format => 'list', :is_filter => true, :is_for_all => true, - :possible_values => ['value1', 'value2', 'value3'], :multiple => true) + :possible_values => ['value1', 'value2', 'value3'], :multiple => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => 'value1') CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => 'value2') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => 'value1') @@ -247,7 +292,7 @@ def test_operator_is_not_on_multi_list_custom_field f = IssueCustomField.create!(:name => 'filter', :field_format => 'list', :is_filter => true, :is_for_all => true, - :possible_values => ['value1', 'value2', 'value3'], :multiple => true) + :possible_values => ['value1', 'value2', 'value3'], :multiple => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => 'value1') CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => 'value2') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => 'value1') @@ -310,7 +355,7 @@ end def test_operator_greater_than_on_int_custom_field - f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'int', :is_filter => true, :is_for_all => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '7') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '12') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -338,7 +383,7 @@ end def test_operator_lesser_than_on_date_custom_field - f = IssueCustomField.create!(:name => 'filter', :field_format => 'date', :is_filter => true, :is_for_all => true) + f = IssueCustomField.create!(:name => 'filter', :field_format => 'date', :is_filter => true, :is_for_all => true, :trackers => Tracker.all) CustomValue.create!(:custom_field => f, :customized => Issue.find(1), :value => '2013-04-11') CustomValue.create!(:custom_field => f, :customized => Issue.find(2), :value => '2013-05-14') CustomValue.create!(:custom_field => f, :customized => Issue.find(3), :value => '') @@ -414,7 +459,7 @@ def test_operator_date_between query = IssueQuery.new(:name => '_') query.add_filter('due_date', '><', ['2011-06-23', '2011-07-10']) - assert_match /issues\.due_date > '2011-06-22 23:59:59(\.9+)?' AND issues\.due_date <= '2011-07-10 23:59:59(\.9+)?/, query.statement + assert_match /issues\.due_date > '2011-06-22 23:59:59(\.9+)?' AND issues\.due_date <= '2011-07-10 23:59:59(\.9+)?'/, query.statement find_issues_with_query(query) end @@ -559,7 +604,7 @@ query = IssueQuery.new(:name => '_', :filters => { 'assigned_to_id' => {:operator => '=', :values => ['me']}}) result = query.issues - assert_equal Issue.visible.all(:conditions => {:assigned_to_id => ([2] + user.reload.group_ids)}).sort_by(&:id), result.sort_by(&:id) + assert_equal Issue.visible.where(:assigned_to_id => ([2] + user.reload.group_ids)).sort_by(&:id), result.sort_by(&:id) assert result.include?(i1) assert result.include?(i2) @@ -615,6 +660,34 @@ User.current = nil end + def test_filter_on_custom_field_should_ignore_projects_with_field_disabled + field = IssueCustomField.generate!(:trackers => Tracker.all, :project_ids => [1, 3, 4], :is_filter => true) + Issue.generate!(:project_id => 3, :tracker_id => 2, :custom_field_values => {field.id.to_s => 'Foo'}) + Issue.generate!(:project_id => 4, :tracker_id => 2, :custom_field_values => {field.id.to_s => 'Foo'}) + + query = IssueQuery.new(:name => '_', :project => Project.find(1)) + query.filters = {"cf_#{field.id}" => {:operator => '=', :values => ['Foo']}} + assert_equal 2, find_issues_with_query(query).size + + field.project_ids = [1, 3] # Disable the field for project 4 + field.save! + assert_equal 1, find_issues_with_query(query).size + end + + def test_filter_on_custom_field_should_ignore_trackers_with_field_disabled + field = IssueCustomField.generate!(:tracker_ids => [1, 2], :is_for_all => true, :is_filter => true) + Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {field.id.to_s => 'Foo'}) + Issue.generate!(:project_id => 1, :tracker_id => 2, :custom_field_values => {field.id.to_s => 'Foo'}) + + query = IssueQuery.new(:name => '_', :project => Project.find(1)) + query.filters = {"cf_#{field.id}" => {:operator => '=', :values => ['Foo']}} + assert_equal 2, find_issues_with_query(query).size + + field.tracker_ids = [1] # Disable the field for tracker 2 + field.save! + assert_equal 1, find_issues_with_query(query).size + end + def test_filter_on_project_custom_field field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string') CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo') @@ -869,7 +942,7 @@ assert_nil q.group_by_column assert_nil q.group_by_statement end - + def test_sortable_columns_should_sort_assignees_according_to_user_format_setting with_settings :user_format => 'lastname_coma_firstname' do q = IssueQuery.new @@ -877,7 +950,7 @@ assert_equal %w(users.lastname users.firstname users.id), q.sortable_columns['assigned_to'] end end - + def test_sortable_columns_should_sort_authors_according_to_user_format_setting with_settings :user_format => 'lastname_coma_firstname' do q = IssueQuery.new @@ -1077,6 +1150,54 @@ assert !query_ids.include?(7), 'public query on private project was visible' end + def test_query_with_public_visibility_should_be_visible_to_anyone + q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_PUBLIC) + + assert q.visible?(User.anonymous) + assert IssueQuery.visible(User.anonymous).find_by_id(q.id) + + assert q.visible?(User.find(7)) + assert IssueQuery.visible(User.find(7)).find_by_id(q.id) + + assert q.visible?(User.find(2)) + assert IssueQuery.visible(User.find(2)).find_by_id(q.id) + + assert q.visible?(User.find(1)) + assert IssueQuery.visible(User.find(1)).find_by_id(q.id) + end + + def test_query_with_roles_visibility_should_be_visible_to_user_with_role + q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_ROLES, :role_ids => [1,2]) + + assert !q.visible?(User.anonymous) + assert_nil IssueQuery.visible(User.anonymous).find_by_id(q.id) + + assert !q.visible?(User.find(7)) + assert_nil IssueQuery.visible(User.find(7)).find_by_id(q.id) + + assert q.visible?(User.find(2)) + assert IssueQuery.visible(User.find(2)).find_by_id(q.id) + + assert q.visible?(User.find(1)) + assert IssueQuery.visible(User.find(1)).find_by_id(q.id) + end + + def test_query_with_private_visibility_should_be_visible_to_owner + q = IssueQuery.create!(:name => 'Query', :visibility => IssueQuery::VISIBILITY_PRIVATE, :user => User.find(7)) + + assert !q.visible?(User.anonymous) + assert_nil IssueQuery.visible(User.anonymous).find_by_id(q.id) + + assert q.visible?(User.find(7)) + assert IssueQuery.visible(User.find(7)).find_by_id(q.id) + + assert !q.visible?(User.find(2)) + assert_nil IssueQuery.visible(User.find(2)).find_by_id(q.id) + + assert q.visible?(User.find(1)) + assert_nil IssueQuery.visible(User.find(1)).find_by_id(q.id) + end + test "#available_filters should include users of visible projects in cross-project view" do users = IssueQuery.new.available_filters["assigned_to_id"] assert_not_nil users @@ -1123,6 +1244,28 @@ assert ! query.available_filters["assigned_to_role"][:values].include?(['Anonymous','5']) end + def test_available_filters_should_include_custom_field_according_to_user_visibility + visible_field = IssueCustomField.generate!(:is_for_all => true, :is_filter => true, :visible => true) + hidden_field = IssueCustomField.generate!(:is_for_all => true, :is_filter => true, :visible => false, :role_ids => [1]) + + with_current_user User.find(3) do + query = IssueQuery.new + assert_include "cf_#{visible_field.id}", query.available_filters.keys + assert_not_include "cf_#{hidden_field.id}", query.available_filters.keys + end + end + + def test_available_columns_should_include_custom_field_according_to_user_visibility + visible_field = IssueCustomField.generate!(:is_for_all => true, :is_filter => true, :visible => true) + hidden_field = IssueCustomField.generate!(:is_for_all => true, :is_filter => true, :visible => false, :role_ids => [1]) + + with_current_user User.find(3) do + query = IssueQuery.new + assert_include :"cf_#{visible_field.id}", query.available_columns.map(&:name) + assert_not_include :"cf_#{hidden_field.id}", query.available_columns.map(&:name) + end + end + context "#statement" do context "with 'member_of_group' filter" do setup do @@ -1197,7 +1340,7 @@ User.add_to_project(@manager, @project, @manager_role) User.add_to_project(@developer, @project, @developer_role) User.add_to_project(@boss, @project, [@manager_role, @developer_role]) - + @issue1 = Issue.generate!(:project => @project, :assigned_to_id => @manager.id) @issue2 = Issue.generate!(:project => @project, :assigned_to_id => @developer.id) @issue3 = Issue.generate!(:project => @project, :assigned_to_id => @boss.id) @@ -1215,7 +1358,7 @@ should "search assigned to for users with the Role on the issue project" do other_project = Project.generate! User.add_to_project(@developer, other_project, @manager_role) - + @query = IssueQuery.new(:name => '_', :project => @project) @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s]) diff -Nru redmine-2.3.3/test/unit/repository_subversion_test.rb redmine-2.4.2/test/unit/repository_subversion_test.rb --- redmine-2.3.3/test/unit/repository_subversion_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/repository_subversion_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -20,15 +20,43 @@ class RepositorySubversionTest < ActiveSupport::TestCase fixtures :projects, :repositories, :enabled_modules, :users, :roles + include Redmine::I18n + NUM_REV = 11 def setup @project = Project.find(3) @repository = Repository::Subversion.create(:project => @project, - :url => self.class.subversion_repository_url) + :url => self.class.subversion_repository_url) assert @repository end + def test_invalid_url + set_language_if_valid 'en' + ['invalid', 'http://', 'svn://', 'svn+ssh://', 'file://'].each do |url| + repo = Repository::Subversion.new( + :project => @project, + :identifier => 'test', + :url => url + ) + assert !repo.save + assert_equal ["is invalid"], repo.errors[:url] + end + end + + def test_valid_url + ['http://valid', 'svn://valid', 'svn+ssh://valid', 'file://valid'].each do |url| + repo = Repository::Subversion.new( + :project => @project, + :identifier => 'test', + :url => url + ) + assert repo.save + assert_equal [], repo.errors[:url] + assert repo.destroy + end + end + if repository_configured?('subversion') def test_fetch_changesets_from_scratch assert_equal 0, @repository.changesets.count diff -Nru redmine-2.3.3/test/unit/repository_test.rb redmine-2.4.2/test/unit/repository_test.rb --- redmine-2.3.3/test/unit/repository_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/repository_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -182,13 +182,10 @@ def test_scan_changesets_for_issue_ids Setting.default_language = 'en' - # choosing a status to apply to fix issues - Setting.commit_fix_status_id = IssueStatus.find( - :first, - :conditions => ["is_closed = ?", true]).id - Setting.commit_fix_done_ratio = "90" Setting.commit_ref_keywords = 'refs , references, IssueID' - Setting.commit_fix_keywords = 'fixes , closes' + Setting.commit_update_keywords = [ + {'keywords' => 'fixes , closes', 'status_id' => IssueStatus.where(:is_closed => true).first.id, 'done_ratio' => '90'} + ] Setting.default_language = 'en' ActionMailer::Base.deliveries.clear @@ -278,7 +275,7 @@ end def test_manual_user_mapping - assert_no_difference "Changeset.count(:conditions => 'user_id <> 2')" do + assert_no_difference "Changeset.where('user_id <> 2').count" do c = Changeset.create!( :repository => @repository, :committer => 'foo', diff -Nru redmine-2.3.3/test/unit/role_test.rb redmine-2.4.2/test/unit/role_test.rb --- redmine-2.3.3/test/unit/role_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/role_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -91,55 +91,39 @@ assert_equal Role.all.reject(&:builtin?).sort, Role.find_all_givable end - context "#anonymous" do - should "return the anonymous role" do + def test_anonymous_should_return_the_anonymous_role + assert_no_difference('Role.count') do role = Role.anonymous assert role.builtin? assert_equal Role::BUILTIN_ANONYMOUS, role.builtin end + end + + def test_anonymous_with_a_missing_anonymous_role_should_return_the_anonymous_role + Role.where(:builtin => Role::BUILTIN_ANONYMOUS).delete_all - context "with a missing anonymous role" do - setup do - Role.delete_all("builtin = #{Role::BUILTIN_ANONYMOUS}") - end - - should "create a new anonymous role" do - assert_difference('Role.count') do - Role.anonymous - end - end - - should "return the anonymous role" do - role = Role.anonymous - assert role.builtin? - assert_equal Role::BUILTIN_ANONYMOUS, role.builtin - end + assert_difference('Role.count') do + role = Role.anonymous + assert role.builtin? + assert_equal Role::BUILTIN_ANONYMOUS, role.builtin end end - context "#non_member" do - should "return the non-member role" do + def test_non_member_should_return_the_non_member_role + assert_no_difference('Role.count') do role = Role.non_member assert role.builtin? assert_equal Role::BUILTIN_NON_MEMBER, role.builtin end + end + + def test_non_member_with_a_missing_non_member_role_should_return_the_non_member_role + Role.where(:builtin => Role::BUILTIN_NON_MEMBER).delete_all - context "with a missing non-member role" do - setup do - Role.delete_all("builtin = #{Role::BUILTIN_NON_MEMBER}") - end - - should "create a new non-member role" do - assert_difference('Role.count') do - Role.non_member - end - end - - should "return the non-member role" do - role = Role.non_member - assert role.builtin? - assert_equal Role::BUILTIN_NON_MEMBER, role.builtin - end + assert_difference('Role.count') do + role = Role.non_member + assert role.builtin? + assert_equal Role::BUILTIN_NON_MEMBER, role.builtin end end end diff -Nru redmine-2.3.3/test/unit/search_test.rb redmine-2.4.2/test/unit/search_test.rb --- redmine-2.3.3/test/unit/search_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/search_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -49,6 +49,7 @@ # Removes the :view_changesets permission from Anonymous role remove_permission Role.anonymous, :view_changesets + User.current = nil r = Issue.search(@issue_keyword).first assert r.include?(@issue) @@ -74,6 +75,7 @@ # Removes the :view_changesets permission from Non member role remove_permission Role.non_member, :view_changesets + User.current = User.find_by_login('rhill') r = Issue.search(@issue_keyword).first assert r.include?(@issue) @@ -128,7 +130,7 @@ def test_search_issue_with_multiple_hits_in_journals i = Issue.find(1) - assert_equal 2, i.journals.count(:all, :conditions => "notes LIKE '%notes%'") + assert_equal 2, i.journals.where("notes LIKE '%notes%'").count r = Issue.search('%notes%').first assert_equal 1, r.size diff -Nru redmine-2.3.3/test/unit/setting_test.rb redmine-2.4.2/test/unit/setting_test.rb --- redmine-2.3.3/test/unit/setting_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/setting_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -46,16 +46,16 @@ assert_equal ['issue_added', 'issue_updated', 'news_added'], Setting.notified_events assert_equal ['issue_added', 'issue_updated', 'news_added'], Setting.find_by_name('notified_events').value end - + def test_setting_should_be_reloaded_after_clear_cache Setting.app_title = "My title" assert_equal "My title", Setting.app_title - + s = Setting.find_by_name("app_title") s.value = 'New title' s.save! assert_equal "My title", Setting.app_title - + Setting.clear_cache assert_equal "New title", Setting.app_title end diff -Nru redmine-2.3.3/test/unit/time_entry_query_test.rb redmine-2.4.2/test/unit/time_entry_query_test.rb --- redmine-2.3.3/test/unit/time_entry_query_test.rb 1970-01-01 00:00:00.000000000 +0000 +++ redmine-2.4.2/test/unit/time_entry_query_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -0,0 +1,40 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class TimeEntryQueryTest < ActiveSupport::TestCase + fixtures :projects, :users, :enumerations + + def test_activity_filter_should_consider_system_and_project_activities + TimeEntry.delete_all + system = TimeEntryActivity.create!(:name => 'Foo') + override = TimeEntryActivity.create!(:name => 'Foo', :parent_id => system.id, :project_id => 1) + other = TimeEntryActivity.create!(:name => 'Bar') + TimeEntry.generate!(:activity => system, :hours => 1.0) + TimeEntry.generate!(:activity => override, :hours => 2.0) + TimeEntry.generate!(:activity => other, :hours => 4.0) + + query = TimeEntryQuery.new(:name => '_') + query.add_filter('activity_id', '=', [system.id.to_s]) + assert_equal 3.0, query.results_scope.sum(:hours) + + query = TimeEntryQuery.new(:name => '_') + query.add_filter('activity_id', '!', [system.id.to_s]) + assert_equal 4.0, query.results_scope.sum(:hours) + end +end diff -Nru redmine-2.3.3/test/unit/token_test.rb redmine-2.4.2/test/unit/token_test.rb --- redmine-2.3.3/test/unit/token_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/token_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -96,11 +96,6 @@ assert_nil Token.find_token('api', token.value) end - def test_find_token_should_return_nil_with_wrong_action - token = Token.create!(:user_id => 1, :action => 'feeds') - assert_nil Token.find_token('api', Token.generate_token_value) - end - def test_find_token_should_return_nil_without_user token = Token.create!(:user_id => 999, :action => 'api') assert_nil Token.find_token('api', token.value) diff -Nru redmine-2.3.3/test/unit/user_test.rb redmine-2.4.2/test/unit/user_test.rb --- redmine-2.3.3/test/unit/user_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/user_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -40,7 +40,7 @@ def test_generate User.generate!(:firstname => 'Testing connection') User.generate!(:firstname => 'Testing connection') - assert_equal 2, User.count(:all, :conditions => {:firstname => 'Testing connection'}) + assert_equal 2, User.where(:firstname => 'Testing connection').count end def test_truth @@ -70,6 +70,41 @@ assert user.save end + def test_generate_password_should_respect_minimum_password_length + with_settings :password_min_length => 15 do + user = User.generate!(:generate_password => true) + assert user.password.length >= 15 + end + end + + def test_generate_password_should_not_generate_password_with_less_than_10_characters + with_settings :password_min_length => 4 do + user = User.generate!(:generate_password => true) + assert user.password.length >= 10 + end + end + + def test_generate_password_on_create_should_set_password + user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo") + user.login = "newuser" + user.generate_password = true + assert user.save + + password = user.password + assert user.check_password?(password) + end + + def test_generate_password_on_update_should_update_password + user = User.find(2) + hash = user.hashed_password + user.generate_password = true + assert user.save + + password = user.password + assert user.check_password?(password) + assert_not_equal hash, user.reload.hashed_password + end + def test_create user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo") @@ -256,7 +291,7 @@ end def test_destroy_should_delete_private_queries - query = Query.new(:name => 'foo', :is_public => false) + query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PRIVATE) query.project_id = 1 query.user_id = 2 query.save! @@ -267,7 +302,7 @@ end def test_destroy_should_update_public_queries - query = Query.new(:name => 'foo', :is_public => true) + query = Query.new(:name => 'foo', :visibility => Query::VISIBILITY_PUBLIC) query.project_id = 1 query.user_id = 2 query.save! @@ -369,27 +404,6 @@ assert_not_equal [], u.errors[:mail_notification] end - context "User#try_to_login" do - should "fall-back to case-insensitive if user login is not found as-typed." do - user = User.try_to_login("AdMin", "admin") - assert_kind_of User, user - assert_equal "admin", user.login - end - - should "select the exact matching user first" do - case_sensitive_user = User.generate! do |user| - user.password = "admin123" - end - # bypass validations to make it appear like existing data - case_sensitive_user.update_attribute(:login, 'ADMIN') - - user = User.try_to_login("ADMIN", "admin123") - assert_kind_of User, user - assert_equal "ADMIN", user.login - - end - end - def test_password user = User.try_to_login("admin", "admin") assert_kind_of User, user @@ -462,50 +476,67 @@ assert_equal ['users.lastname', 'users.firstname', 'users.id'], User.fields_for_order_statement end end - + def test_fields_for_order_statement_width_table_name_should_prepend_table_name with_settings :user_format => 'lastname_firstname' do assert_equal ['authors.lastname', 'authors.firstname', 'authors.id'], User.fields_for_order_statement('authors') end end - + def test_fields_for_order_statement_with_blank_format_should_return_default with_settings :user_format => '' do assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement end end - + def test_fields_for_order_statement_with_invalid_format_should_return_default with_settings :user_format => 'foo' do assert_equal ['users.firstname', 'users.lastname', 'users.id'], User.fields_for_order_statement end end - def test_lock - user = User.try_to_login("jsmith", "jsmith") - assert_equal @jsmith, user + test ".try_to_login with good credentials should return the user" do + user = User.try_to_login("admin", "admin") + assert_kind_of User, user + assert_equal "admin", user.login + end + test ".try_to_login with wrong credentials should return nil" do + assert_nil User.try_to_login("admin", "foo") + end + + def test_try_to_login_with_locked_user_should_return_nil @jsmith.status = User::STATUS_LOCKED - assert @jsmith.save + @jsmith.save! user = User.try_to_login("jsmith", "jsmith") assert_equal nil, user end - context ".try_to_login" do - context "with good credentials" do - should "return the user" do - user = User.try_to_login("admin", "admin") - assert_kind_of User, user - assert_equal "admin", user.login - end - end + def test_try_to_login_with_locked_user_and_not_active_only_should_return_user + @jsmith.status = User::STATUS_LOCKED + @jsmith.save! - context "with wrong credentials" do - should "return nil" do - assert_nil User.try_to_login("admin", "foo") - end + user = User.try_to_login("jsmith", "jsmith", false) + assert_equal @jsmith, user + end + + test ".try_to_login should fall-back to case-insensitive if user login is not found as-typed" do + user = User.try_to_login("AdMin", "admin") + assert_kind_of User, user + assert_equal "admin", user.login + end + + test ".try_to_login should select the exact matching user first" do + case_sensitive_user = User.generate! do |user| + user.password = "admin123" end + # bypass validations to make it appear like existing data + case_sensitive_user.update_attribute(:login, 'ADMIN') + + user = User.try_to_login("ADMIN", "admin123") + assert_kind_of User, user + assert_equal "ADMIN", user.login end if ldap_configured? @@ -583,7 +614,7 @@ @auth_source.account_password = '' @auth_source.save! end - + context "with a successful authentication" do should "create a new user account if it doesn't exist" do assert_difference('User.count') do @@ -592,7 +623,7 @@ end end end - + context "with an unsuccessful authentication" do should "return nil" do assert_nil User.try_to_login('example1', '11111') @@ -649,50 +680,46 @@ end end - context "User#api_key" do - should "generate a new one if the user doesn't have one" do - user = User.generate!(:api_token => nil) - assert_nil user.api_token + test "#api_key should generate a new one if the user doesn't have one" do + user = User.generate!(:api_token => nil) + assert_nil user.api_token - key = user.api_key - assert_equal 40, key.length - user.reload - assert_equal key, user.api_key - end + key = user.api_key + assert_equal 40, key.length + user.reload + assert_equal key, user.api_key + end - should "return the existing api token value" do - user = User.generate! - token = Token.create!(:action => 'api') - user.api_token = token - assert user.save + test "#api_key should return the existing api token value" do + user = User.generate! + token = Token.create!(:action => 'api') + user.api_token = token + assert user.save - assert_equal token.value, user.api_key - end + assert_equal token.value, user.api_key end - context "User#find_by_api_key" do - should "return nil if no matching key is found" do - assert_nil User.find_by_api_key('zzzzzzzzz') - end + test "#find_by_api_key should return nil if no matching key is found" do + assert_nil User.find_by_api_key('zzzzzzzzz') + end - should "return nil if the key is found for an inactive user" do - user = User.generate! - user.status = User::STATUS_LOCKED - token = Token.create!(:action => 'api') - user.api_token = token - user.save + test "#find_by_api_key should return nil if the key is found for an inactive user" do + user = User.generate! + user.status = User::STATUS_LOCKED + token = Token.create!(:action => 'api') + user.api_token = token + user.save - assert_nil User.find_by_api_key(token.value) - end + assert_nil User.find_by_api_key(token.value) + end - should "return the user if the key is found for an active user" do - user = User.generate! - token = Token.create!(:action => 'api') - user.api_token = token - user.save + test "#find_by_api_key should return the user if the key is found for an active user" do + user = User.generate! + token = Token.create!(:action => 'api') + user.api_token = token + user.save - assert_equal user, User.find_by_api_key(token.value) - end + assert_equal user, User.find_by_api_key(token.value) end def test_default_admin_account_changed_should_return_false_if_account_was_not_changed @@ -845,29 +872,27 @@ assert !u.password_confirmation.blank? end - context "#change_password_allowed?" do - should "be allowed if no auth source is set" do - user = User.generate! - assert user.change_password_allowed? - end + test "#change_password_allowed? should be allowed if no auth source is set" do + user = User.generate! + assert user.change_password_allowed? + end - should "delegate to the auth source" do - user = User.generate! + test "#change_password_allowed? should delegate to the auth source" do + user = User.generate! - allowed_auth_source = AuthSource.generate! - def allowed_auth_source.allow_password_changes?; true; end + allowed_auth_source = AuthSource.generate! + def allowed_auth_source.allow_password_changes?; true; end - denied_auth_source = AuthSource.generate! - def denied_auth_source.allow_password_changes?; false; end + denied_auth_source = AuthSource.generate! + def denied_auth_source.allow_password_changes?; false; end - assert user.change_password_allowed? + assert user.change_password_allowed? - user.auth_source = allowed_auth_source - assert user.change_password_allowed?, "User not allowed to change password, though auth source does" + user.auth_source = allowed_auth_source + assert user.change_password_allowed?, "User not allowed to change password, though auth source does" - user.auth_source = denied_auth_source - assert !user.change_password_allowed?, "User allowed to change password, though auth source does not" - end + user.auth_source = denied_auth_source + assert !user.change_password_allowed?, "User allowed to change password, though auth source does not" end def test_own_account_deletable_should_be_true_with_unsubscrive_enabled diff -Nru redmine-2.3.3/test/unit/version_test.rb redmine-2.4.2/test/unit/version_test.rb --- redmine-2.3.3/test/unit/version_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/version_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -18,20 +18,20 @@ require File.expand_path('../../test_helper', __FILE__) class VersionTest < ActiveSupport::TestCase - fixtures :projects, :users, :issues, :issue_statuses, :trackers, :enumerations, :versions, :projects_trackers - - def setup - end + fixtures :projects, :users, :issues, :issue_statuses, :trackers, + :enumerations, :versions, :projects_trackers def test_create - v = Version.new(:project => Project.find(1), :name => '1.1', :effective_date => '2011-03-25') + v = Version.new(:project => Project.find(1), :name => '1.1', + :effective_date => '2011-03-25') assert v.save assert_equal 'open', v.status assert_equal 'none', v.sharing end def test_invalid_effective_date_validation - v = Version.new(:project => Project.find(1), :name => '1.1', :effective_date => '99999-01-01') + v = Version.new(:project => Project.find(1), :name => '1.1', + :effective_date => '99999-01-01') assert !v.valid? v.effective_date = '2012-11-33' assert !v.valid? @@ -132,75 +132,64 @@ assert_equal false, version.completed? end - context "#behind_schedule?" do - setup do - ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests - @project = Project.create!(:name => 'test0', :identifier => 'test0') - @project.trackers << Tracker.create!(:name => 'track') - - @version = Version.create!(:project => @project, :effective_date => nil, :name => 'version') - end - - should "be false if there are no issues assigned" do - @version.update_attribute(:effective_date, Date.yesterday) - assert_equal false, @version.behind_schedule? - end - - should "be false if there is no effective_date" do - assert_equal false, @version.behind_schedule? - end - - should "be false if all of the issues are ahead of schedule" do - @version.update_attribute(:effective_date, 7.days.from_now.to_date) - add_issue(@version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left - add_issue(@version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left - assert_equal 60, @version.completed_percent - assert_equal false, @version.behind_schedule? - end - - should "be true if any of the issues are behind schedule" do - @version.update_attribute(:effective_date, 7.days.from_now.to_date) - add_issue(@version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left - add_issue(@version, :start_date => 7.days.ago, :done_ratio => 20) # 14 day span, 20% done, 50% time left - assert_equal 40, @version.completed_percent - assert_equal true, @version.behind_schedule? - end - - should "be false if all of the issues are complete" do - @version.update_attribute(:effective_date, 7.days.from_now.to_date) - add_issue(@version, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)) # 7 day span - add_issue(@version, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)) # 7 day span - assert_equal 100, @version.completed_percent - assert_equal false, @version.behind_schedule? - end - end - - context "#estimated_hours" do - setup do - @version = Version.create!(:project_id => 1, :name => '#estimated_hours') - end - - should "return 0 with no assigned issues" do - assert_equal 0, @version.estimated_hours - end - - should "return 0 with no estimated hours" do - add_issue(@version) - assert_equal 0, @version.estimated_hours - end - - should "return the sum of estimated hours" do - add_issue(@version, :estimated_hours => 2.5) - add_issue(@version, :estimated_hours => 5) - assert_equal 7.5, @version.estimated_hours - end - - should "return the sum of leaves estimated hours" do - parent = add_issue(@version) - add_issue(@version, :estimated_hours => 2.5, :parent_issue_id => parent.id) - add_issue(@version, :estimated_hours => 5, :parent_issue_id => parent.id) - assert_equal 7.5, @version.estimated_hours - end + test "#behind_schedule? should be false if there are no issues assigned" do + version = Version.generate!(:effective_date => Date.yesterday) + assert_equal false, version.behind_schedule? + end + + test "#behind_schedule? should be false if there is no effective_date" do + version = Version.generate!(:effective_date => nil) + assert_equal false, version.behind_schedule? + end + + test "#behind_schedule? should be false if all of the issues are ahead of schedule" do + version = Version.create!(:project_id => 1, :name => 'test', :effective_date => 7.days.from_now.to_date) + add_issue(version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left + add_issue(version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left + assert_equal 60, version.completed_percent + assert_equal false, version.behind_schedule? + end + + test "#behind_schedule? should be true if any of the issues are behind schedule" do + version = Version.create!(:project_id => 1, :name => 'test', :effective_date => 7.days.from_now.to_date) + add_issue(version, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left + add_issue(version, :start_date => 7.days.ago, :done_ratio => 20) # 14 day span, 20% done, 50% time left + assert_equal 40, version.completed_percent + assert_equal true, version.behind_schedule? + end + + test "#behind_schedule? should be false if all of the issues are complete" do + version = Version.create!(:project_id => 1, :name => 'test', :effective_date => 7.days.from_now.to_date) + add_issue(version, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)) # 7 day span + add_issue(version, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)) # 7 day span + assert_equal 100, version.completed_percent + assert_equal false, version.behind_schedule? + end + + test "#estimated_hours should return 0 with no assigned issues" do + version = Version.generate! + assert_equal 0, version.estimated_hours + end + + test "#estimated_hours should return 0 with no estimated hours" do + version = Version.create!(:project_id => 1, :name => 'test') + add_issue(version) + assert_equal 0, version.estimated_hours + end + + test "#estimated_hours should return return the sum of estimated hours" do + version = Version.create!(:project_id => 1, :name => 'test') + add_issue(version, :estimated_hours => 2.5) + add_issue(version, :estimated_hours => 5) + assert_equal 7.5, version.estimated_hours + end + + test "#estimated_hours should return the sum of leaves estimated hours" do + version = Version.create!(:project_id => 1, :name => 'test') + parent = add_issue(version) + add_issue(version, :estimated_hours => 2.5, :parent_issue_id => parent.id) + add_issue(version, :estimated_hours => 5, :parent_issue_id => parent.id) + assert_equal 7.5, version.estimated_hours end test "should update all issue's fixed_version associations in case the hierarchy changed XXX" do @@ -227,11 +216,13 @@ # Project 1 now out of the shared scope project_1_issue.reload - assert_equal nil, project_1_issue.fixed_version, "Fixed version is still set after changing the Version's sharing" + assert_equal nil, project_1_issue.fixed_version, + "Fixed version is still set after changing the Version's sharing" # Project 5 now out of the shared scope project_5_issue.reload - assert_equal nil, project_5_issue.fixed_version, "Fixed version is still set after changing the Version's sharing" + assert_equal nil, project_5_issue.fixed_version, + "Fixed version is still set after changing the Version's sharing" # Project 2 issue remains project_2_issue.reload diff -Nru redmine-2.3.3/test/unit/watcher_test.rb redmine-2.4.2/test/unit/watcher_test.rb --- redmine-2.3.3/test/unit/watcher_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/watcher_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -99,6 +99,23 @@ assert_nil issue.addable_watcher_users.detect {|user| !issue.visible?(user)} end + def test_any_watched_should_return_false_if_no_object_is_watched + objects = (0..2).map {Issue.generate!} + + assert_equal false, Watcher.any_watched?(objects, @user) + end + + def test_any_watched_should_return_true_if_one_object_is_watched + objects = (0..2).map {Issue.generate!} + objects.last.add_watcher(@user) + + assert_equal true, Watcher.any_watched?(objects, @user) + end + + def test_any_watched_should_return_false_with_no_object + assert_equal false, Watcher.any_watched?([], @user) + end + def test_recipients @issue.watchers.delete_all @issue.reload diff -Nru redmine-2.3.3/test/unit/wiki_content_test.rb redmine-2.4.2/test/unit/wiki_content_test.rb --- redmine-2.3.3/test/unit/wiki_content_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/wiki_content_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -48,11 +48,12 @@ page = WikiPage.new(:wiki => @wiki, :title => "A new page") page.content = WikiContent.new(:text => "Content text", :author => User.find(1), :comments => "My comment") - with_settings :notified_events => %w(wiki_content_added) do + with_settings :default_language => 'en', :notified_events => %w(wiki_content_added) do assert page.save end assert_equal 1, ActionMailer::Base.deliveries.size + assert_include 'wiki page has been added', mail_body(ActionMailer::Base.deliveries.last) end def test_update_should_be_versioned @@ -99,6 +100,7 @@ end assert_equal 1, ActionMailer::Base.deliveries.size + assert_include 'wiki page has been updated', mail_body(ActionMailer::Base.deliveries.last) end def test_fetch_history @@ -115,7 +117,7 @@ page.reload assert_equal 500.kilobyte, page.content.text.size end - + def test_current_version content = WikiContent.find(11) assert_equal true, content.current_version? diff -Nru redmine-2.3.3/test/unit/wiki_test.rb redmine-2.4.2/test/unit/wiki_test.rb --- redmine-2.3.3/test/unit/wiki_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/wiki_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -84,22 +84,18 @@ assert_equal ja_test, Wiki.titleize(ja_test) end - context "#sidebar" do - setup do - @wiki = Wiki.find(1) - end - - should "return nil if undefined" do - assert_nil @wiki.sidebar - end + def test_sidebar_should_return_nil_if_undefined + @wiki = Wiki.find(1) + assert_nil @wiki.sidebar + end - should "return a WikiPage if defined" do - page = @wiki.pages.new(:title => 'Sidebar') - page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar') - page.save! + def test_sidebar_should_return_a_wiki_page_if_defined + @wiki = Wiki.find(1) + page = @wiki.pages.new(:title => 'Sidebar') + page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar') + page.save! - assert_kind_of WikiPage, @wiki.sidebar - assert_equal 'Sidebar', @wiki.sidebar.title - end + assert_kind_of WikiPage, @wiki.sidebar + assert_equal 'Sidebar', @wiki.sidebar.title end end diff -Nru redmine-2.3.3/test/unit/workflow_test.rb redmine-2.4.2/test/unit/workflow_test.rb --- redmine-2.3.3/test/unit/workflow_test.rb 2013-09-14 06:47:57.000000000 +0000 +++ redmine-2.4.2/test/unit/workflow_test.rb 2013-12-23 08:48:37.000000000 +0000 @@ -30,9 +30,9 @@ WorkflowTransition.copy(Tracker.find(2), Role.find(1), Tracker.find(3), Role.find(2)) end - assert WorkflowTransition.first(:conditions => {:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false}) - assert WorkflowTransition.first(:conditions => {:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 3, :author => false, :assignee => true}) - assert WorkflowTransition.first(:conditions => {:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 4, :author => true, :assignee => false}) + assert WorkflowTransition.where(:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false).first + assert WorkflowTransition.where(:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 3, :author => false, :assignee => true).first + assert WorkflowTransition.where(:role_id => 2, :tracker_id => 3, :old_status_id => 1, :new_status_id => 4, :author => true, :assignee => false).first end def test_workflow_permission_should_validate_rule