Compare commits

..

1 Commits
1.4.3 ... 1.4.1

Author SHA1 Message Date
Jean-Philippe Lang
797f777900 tagged version 1.4.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.4.1@9461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-04-20 10:00:58 +00:00
69 changed files with 402 additions and 1608 deletions

View File

@@ -31,6 +31,17 @@ class ApplicationController < ActionController::Base
super
cookies.delete(:autologin)
end
# Remove broken cookie after upgrade from 0.8.x (#4292)
# See https://rails.lighthouseapp.com/projects/8994/tickets/3360
# TODO: remove it when Rails is fixed
before_filter :delete_broken_cookies
def delete_broken_cookies
if cookies['_redmine_session'] && cookies['_redmine_session'] !~ /--/
cookies.delete '_redmine_session'
redirect_to home_path
return false
end
end
# FIXME: Remove this when all of Rack and Rails have learned how to
# properly use encodings

View File

@@ -67,7 +67,7 @@ class AttachmentsController < ApplicationController
return
end
@attachment = Attachment.new(:file => request.raw_post)
@attachment = Attachment.new(:file => request.body)
@attachment.author = User.current
@attachment.filename = Redmine::Utils.random_hex(16)

View File

@@ -18,13 +18,12 @@
class TimelogController < ApplicationController
menu_item :issues
before_filter :find_project_for_new_time_entry, :only => [:create]
before_filter :find_project, :only => [:create]
before_filter :find_time_entry, :only => [:show, :edit, :update]
before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy]
before_filter :authorize, :except => [:new, :index, :report]
before_filter :find_optional_project, :only => [:index, :report]
before_filter :find_optional_project_for_new_time_entry, :only => [:new]
before_filter :find_optional_project, :only => [:new, :index, :report]
before_filter :authorize_global, :only => [:new, :index, :report]
accept_rss_auth :index
@@ -134,13 +133,9 @@ class TimelogController < ApplicationController
flash[:notice] = l(:notice_successful_create)
if params[:continue]
if params[:project_id]
redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue,
:time_entry => {:issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue, :back_url => params[:back_url]
else
redirect_to :action => 'new',
:time_entry => {:project_id => @time_entry.project_id, :issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
redirect_to :action => 'new', :back_url => params[:back_url]
end
else
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
@@ -263,7 +258,7 @@ private
end
end
def find_optional_project_for_new_time_entry
def find_project
if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
@project = Project.find(project_id)
end
@@ -271,15 +266,12 @@ private
@issue = Issue.find(issue_id)
@project ||= @issue.project
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project_for_new_time_entry
find_optional_project_for_new_time_entry
if @project.nil?
render_404
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project

View File

@@ -176,11 +176,9 @@ class UsersController < ApplicationController
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to :back }
format.html { redirect_to(users_url) }
format.api { head :ok }
end
rescue ::ActionController::RedirectBackError
redirect_to(users_url)
end
def edit_membership

View File

@@ -110,15 +110,10 @@ class Attachment < ActiveRecord::Base
logger.info("Saving attachment '#{self.diskfile}' (#{@temp_file.size} bytes)")
md5 = Digest::MD5.new
File.open(diskfile, "wb") do |f|
if @temp_file.respond_to?(:read)
buffer = ""
while (buffer = @temp_file.read(8192))
f.write(buffer)
md5.update(buffer)
end
else
f.write(@temp_file)
md5.update(@temp_file)
buffer = ""
while (buffer = @temp_file.read(8192))
f.write(buffer)
md5.update(buffer)
end
end
self.digest = md5.hexdigest

View File

@@ -395,8 +395,7 @@ class Mailer < ActionMailer::Base
'X-Redmine-Host' => Setting.host_name,
'X-Redmine-Site' => Setting.app_title,
'X-Auto-Response-Suppress' => 'OOF',
'Auto-Submitted' => 'auto-generated',
'List-Id' => "<#{Setting.mail_from.to_s.gsub('@', '.')}>"
'Auto-Submitted' => 'auto-generated'
end
# Appends a Redmine header field (name is prepended with 'X-Redmine-')

View File

@@ -126,8 +126,8 @@ class Query < ActiveRecord::Base
:list_subprojects => [ "*", "!*", "=" ],
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "t+", "t", "w", ">t-", "<t-", "t-", "!*", "*" ],
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w", "!*", "*" ],
:string => [ "=", "~", "!", "!~", "!*", "*" ],
:text => [ "~", "!~", "!*", "*" ],
:string => [ "=", "~", "!", "!~" ],
:text => [ "~", "!~" ],
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
:float => [ "=", ">=", "<=", "><", "!*", "*" ] }

View File

@@ -141,7 +141,7 @@ class Repository < ActiveRecord::Base
elsif repository.is_default?
1
else
identifier.to_s <=> repository.identifier.to_s
identifier <=> repository.identifier
end
end

View File

@@ -1,7 +1,6 @@
<h2><%= l(:label_spent_time) %></h2>
<% labelled_form_for @time_entry, :url => time_entries_path do |f| %>
<%= hidden_field_tag 'project_id', params[:project_id] if params[:project_id] %>
<%= render :partial => 'form', :locals => {:f => f} %>
<%= submit_tag l(:button_create) %>
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>

View File

@@ -85,30 +85,4 @@ module ActionController
end
end
end
# CVE-2012-2660
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/f1203e3376acec0f
class Request
protected
# Remove nils from the params hash
def deep_munge(hash)
hash.each_value do |v|
case v
when Array
v.grep(Hash) { |x| deep_munge(x) }
when Hash
deep_munge(v)
end
end
keys = hash.keys.find_all { |k| hash[k] == [nil] }
keys.each { |k| hash[k] = nil }
hash
end
def parse_query(qs)
deep_munge(super)
end
end
end

View File

@@ -1026,7 +1026,7 @@ ar:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1040,7 +1040,7 @@ bs:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1028,7 +1028,7 @@ ca:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1029,7 +1029,7 @@ cs:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1043,7 +1043,7 @@ da:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1026,7 +1026,7 @@ el:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1028,7 +1028,7 @@ en-GB:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -384,7 +384,7 @@ en:
setting_issue_group_assignment: Allow issue assignment to groups
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
setting_unsubscribe: Allow users to delete their own account
setting_unsubscribe: Allow users to unsubscribe
permission_add_project: Create project
permission_add_subprojects: Create subprojects

View File

@@ -1063,7 +1063,7 @@ es:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1029,7 +1029,7 @@ eu:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1028,7 +1028,7 @@ fa:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1047,7 +1047,7 @@ fi:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -380,7 +380,7 @@ fr:
setting_issue_group_assignment: Permettre l'assignement des demandes aux groupes
setting_default_issue_start_date_to_creation_date: Donner à la date de début d'une nouvelle demande la valeur de la date du jour
setting_commit_cross_project_ref: Permettre le référencement et la résolution des demandes de tous les autres projets
setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
setting_unsubscribe: Permettre aux utilisateurs de se désinscrire
permission_add_project: Créer un projet
permission_add_subprojects: Créer des sous-projets

View File

@@ -1037,7 +1037,7 @@ gl:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1031,7 +1031,7 @@ he:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1,3 +1,6 @@
# Croatian translations for Ruby on Rails
# by Helix d.o.o. (info@helix.hr)
hr:
direction: ltr
date:
@@ -1029,7 +1032,7 @@ hr:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1045,7 +1045,7 @@
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1032,7 +1032,7 @@ id:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1027,7 +1027,7 @@ it:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -348,7 +348,7 @@ ja:
setting_welcome_text: ウェルカムメッセージ
setting_default_language: 既定の言語
setting_login_required: 認証が必要
setting_self_registration: ユーザによるアカウント登録
setting_self_registration: ユーザは自分で登録できる
setting_attachment_max_size: 添付ファイルサイズの上限
setting_issues_export_limit: エクスポートするチケット数の上限
setting_mail_from: 送信元メールアドレス
@@ -1055,9 +1055,9 @@ ja:
permission_manage_related_issues: 関連するチケットの管理
field_ldap_filter: LDAPフィルタ
label_search_for_watchers: ウォッチャーを検索して追加
notice_account_deleted: アカウントが削除されました。
setting_unsubscribe: ユーザによるアカウント削除を許可
button_delete_my_account: 自分のアカウントを削除
notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to unsubscribe
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.

View File

@@ -1076,7 +1076,7 @@ ko:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1086,7 +1086,7 @@ lt:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1020,7 +1020,7 @@ lv:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1026,7 +1026,7 @@ mk:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1026,7 +1026,7 @@ mn:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1008,7 +1008,7 @@ nl:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1016,7 +1016,7 @@
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1043,7 +1043,7 @@ pl:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1,4 +1,5 @@
pt-BR:
# formatos de data e hora
direction: ltr
date:
formats:
@@ -1048,7 +1049,7 @@ pt-BR:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1031,7 +1031,7 @@ pt:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1023,7 +1023,7 @@ ro:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1026,7 +1026,7 @@ sk:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1026,7 +1026,7 @@ sl:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

File diff suppressed because it is too large Load Diff

View File

@@ -1026,7 +1026,7 @@ sr-YU:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1027,7 +1027,7 @@ sr:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -203,8 +203,7 @@ sv:
notice_email_error: "Ett fel inträffade när mail skickades (%{value})"
notice_feeds_access_key_reseted: Din RSS-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}."
notice_failed_to_save_issues: "Misslyckades med att spara %{count} ärende(n) på %{total} valt: %{ids}."
notice_failed_to_save_members: "Misslyckades med att spara medlem(mar): %{errors}."
notice_no_issue_selected: "Inget ärende är markerat! Var vänlig, markera de ärenden du vill ändra."
notice_account_pending: "Ditt konto skapades och avvaktar nu administratörens godkännande."
@@ -214,14 +213,11 @@ sv:
notice_issue_done_ratios_updated: "% klart uppdaterade."
notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})"
notice_issue_successful_create: Ärende %{id} skapades.
notice_issue_update_conflict: Detta ärende har uppdaterats av en annan användare samtidigt som du redigerade det.
notice_account_deleted: Ditt konto har avslutats permanent.
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
error_scm_command_failed: "Ett fel inträffade vid försök att nå versionsarkivet: %{value}"
error_scm_annotate: "Inlägget existerar inte eller kan inte kommenteras."
error_scm_annotate_big_text_file: Inlägget kan inte annoteras eftersom det överskrider maximal storlek för textfiler.
error_issue_not_found_in_project: 'Ärendet hittades inte eller så tillhör det inte detta projekt'
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
@@ -235,7 +231,7 @@ sv:
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
error_unable_to_connect: "Kan inte ansluta (%{value})"
error_attachment_too_big: Denna fil kan inte laddas upp eftersom den överstiger maximalt tillåten filstorlek (%{max_size})
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
mail_subject_lost_password: "Ditt %{value} lösenord"
@@ -362,9 +358,6 @@ sv:
field_root_directory: Rotmapp
field_cvsroot: CVSROOT
field_cvs_module: Modul
field_repository_is_default: Huvudarkiv
field_multiple: Flera värden
field_ldap_filter: LDAP-filter
setting_app_title: Applikationsrubrik
setting_app_subtitle: Applikationsunderrubrik
@@ -391,7 +384,6 @@ sv:
setting_time_format: Tidsformat
setting_cross_project_issue_relations: Tillåt ärenderelationer mellan projekt
setting_issue_list_default_columns: Standardkolumner i ärendelistan
setting_repositories_encodings: Encoding för bilagor och versionsarkiv
setting_emails_header: Mail-header
setting_emails_footer: Signatur
setting_protocol: Protokoll
@@ -424,9 +416,6 @@ sv:
setting_commit_logtime_activity_id: Aktivitet för loggad tid
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
setting_issue_group_assignment: Tillåt att ärenden tilldelas till grupper
setting_default_issue_start_date_to_creation_date: Använd dagens datum som startdatum för nya ärenden
setting_commit_cross_project_ref: Tillåt ärende i alla de andra projekten att bli refererade och fixade
setting_unsubscribe: Tillåt användare att avsluta prenumereration
permission_add_project: Skapa projekt
permission_add_subprojects: Skapa underprojekt
@@ -485,7 +474,6 @@ sv:
permission_delete_own_messages: Ta bort egna meddelanden
permission_export_wiki_pages: Exportera wikisidor
permission_manage_subtasks: Hantera underaktiviteter
permission_manage_related_issues: Hantera relaterade ärenden
project_module_issue_tracking: Ärendeuppföljning
project_module_time_tracking: Tidsuppföljning
@@ -636,10 +624,6 @@ sv:
zero: 0 stängda
one: 1 stängd
other: "%{count} stängda"
label_x_issues:
zero: 0 ärenden
one: 1 ärende
other: "%{count} ärenden"
label_total: Total
label_permissions: Behörigheter
label_current_status: Nuvarande status
@@ -700,7 +684,6 @@ sv:
label_not_contains: innehåller inte
label_day_plural: dagar
label_repository: Versionsarkiv
label_repository_new: Nytt versionsarkiv
label_repository_plural: Versionsarkiv
label_browse: Bläddra
label_modification: "%{count} ändring"
@@ -753,7 +736,6 @@ sv:
label_statistics: Statistik
label_commits_per_month: Commits per månad
label_commits_per_author: Commits per författare
label_diff: diff
label_view_diff: Visa skillnader
label_diff_inline: i texten
label_diff_side_by_side: sida vid sida
@@ -882,13 +864,6 @@ sv:
label_issues_visibility_public: Alla icke-privata ärenden
label_issues_visibility_own: Ärenden skapade av eller tilldelade till användaren
label_git_report_last_commit: Rapportera senaste commit av filer och mappar
label_parent_revision: Förälder
label_child_revision: Barn
label_export_options: "%{export_format} exportalternativ"
label_copy_attachments: Kopiera bilagor
label_item_position: "%{position}/%{count}"
label_completed_versions: Klara versioner
label_search_for_watchers: Sök efter bevakare att lägga till
button_login: Logga in
button_submit: Skicka
@@ -936,9 +911,6 @@ sv:
button_quote: Citera
button_duplicate: Duplicera
button_show: Visa
button_edit_section: Redigera denna sektion
button_export: Exportera
button_delete_my_account: Ta bort mitt konto
status_active: aktiv
status_registered: registrerad
@@ -966,7 +938,6 @@ sv:
text_tip_issue_begin_day: ärende som börjar denna dag
text_tip_issue_end_day: ärende som slutar denna dag
text_tip_issue_begin_end_day: ärende som börjar och slutar denna dag
text_project_identifier_info: Ändast gemener (a-z), siffror, streck och understreck är tillåtna.<br />När identifieraren sparats kan den inte ändras.
text_caracters_maximum: "max %{count} tecken."
text_caracters_minimum: "Måste vara minst %{count} tecken lång."
text_length_between: "Längd mellan %{min} och %{max} tecken."
@@ -1014,16 +985,11 @@ sv:
text_zoom_in: Zooma in
text_warn_on_leaving_unsaved: Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan.
text_scm_path_encoding_note: "Standard: UTF-8"
text_git_repository_note: Versionsarkiv är tomt och lokalt (t.ex. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Lokalt versionsarkiv (t.ex. /hgrepo, c:\hgrepo)
text_scm_command: Kommando
text_scm_command_version: Version
text_scm_config: Du kan konfigurera dina scm-kommando i config/configuration.yml. Vänligen starta om applikationen när ändringar gjorts.
text_scm_command_not_available: Scm-kommando är inte tillgängligt. Vänligen kontrollera inställningarna i administratörspanelen.
text_issue_conflict_resolution_overwrite: Använd mina ändringar i alla fall (tidigare anteckningar kommer behållas men några ändringar kan bli överskrivna)
text_issue_conflict_resolution_add_notes: Lägg till mina anteckningar och kasta mina andra ändringar
text_issue_conflict_resolution_cancel: Kasta alla mina ändringar och visa igen %{link}
text_account_destroy_confirmation: "Är du säker på att du vill fortsätta?\nDitt konto kommer tas bort permanent, utan möjlighet att återaktivera det."
default_role_manager: Projektledare
default_role_developer: Utvecklare
@@ -1051,21 +1017,58 @@ sv:
enumeration_doc_categories: Dokumentkategorier
enumeration_activities: Aktiviteter (tidsuppföljning)
enumeration_system_activity: Systemaktivitet
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_search: Sökfält
description_choose_project: Projekt
description_project_scope: Sökomfång
description_notes: Anteckningar
description_message_content: Meddelandeinnehåll
description_query_sort_criteria_attribute: Sorteringsattribut
description_query_sort_criteria_direction: Sorteringsriktning
description_user_mail_notification: Mailnotifieringsinställningar
description_available_columns: Tillgängliga Kolumner
description_selected_columns: Valda Kolumner
description_all_columns: Alla kolumner
description_issue_category_reassign: Välj ärendekategori
description_wiki_subpages_reassign: Välj ny föräldersida
description_date_range_list: Välj intervall från listan
description_date_range_interval: Ange intervall genom att välja start- och slutdatum
description_date_from: Ange startdatum
description_date_to: Ange slutdatum
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_x_issues:
zero: 0 Ärende
one: 1 Ärende
other: "%{count} Ärenden"
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.<br />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_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 unsubscribe
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.

View File

@@ -1023,7 +1023,7 @@ th:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1045,7 +1045,7 @@ tr:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -1077,7 +1077,7 @@ vi:
field_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
setting_unsubscribe: Allow users to unsubscribe
button_delete_my_account: Delete my account
text_account_destroy_confirmation: |-
Are you sure you want to proceed?

View File

@@ -255,7 +255,6 @@
notice_gantt_chart_truncated: "由於項目數量超過可顯示數量的最大值 (%{max}),故此甘特圖尾部已被截斷"
notice_issue_successful_create: "問題 %{id} 已建立。"
notice_issue_update_conflict: "當您正在編輯這個問題的時候,它已經被其他人搶先一步更新過。"
notice_account_deleted: "您的帳戶已被永久刪除。"
error_can_t_load_default_data: "無法載入預設組態: %{value}"
error_scm_not_found: "在儲存機制中找不到這個項目或修訂版。"
@@ -466,7 +465,6 @@
setting_issue_group_assignment: 允許問題被指派至群組
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
permission_add_project: 建立專案
permission_add_subprojects: 建立子專案
@@ -928,7 +926,6 @@
label_copy_attachments: 複製附件
label_item_position: "%{position} / %{count}"
label_completed_versions: 已完成版本
label_search_for_watchers: 搜尋可供加入的監看者
button_login: 登入
button_submit: 送出
@@ -978,7 +975,6 @@
button_show: 顯示
button_edit_section: 編輯此區塊
button_export: 匯出
button_delete_my_account: 刪除我的帳戶
status_active: 活動中
status_registered: 註冊完成
@@ -1063,9 +1059,6 @@
text_issue_conflict_resolution_overwrite: "直接套用我的變更 (先前的筆記將會被保留,但是某些變更可能會被複寫)"
text_issue_conflict_resolution_add_notes: "新增我的筆記並捨棄我其他的變更"
text_issue_conflict_resolution_cancel: "捨棄我全部的變更並重新顯示 %{link}"
text_account_destroy_confirmation: |-
您確定要繼續這個動作嗎?
您的帳戶將會被永久刪除,且無法被重新啟用。
default_role_manager: 管理人員
default_role_developer: 開發人員
@@ -1111,3 +1104,10 @@
description_date_range_interval: 選擇起始與結束日期以設定範圍區間
description_date_from: 輸入起始日期
description_date_to: 輸入結束日期
label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to unsubscribe
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.

View File

@@ -1007,29 +1007,29 @@ zh:
button_export: 导出
label_export_options: "%{export_format} 导出选项"
error_attachment_too_big: 该文件无法上传。超过文件大小限制 (%{max_size})
notice_failed_to_save_time_entries: "无法保存下列所选取的 %{total} 个项目中的 %{count} 工时: %{ids}"
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} 问题"
label_repository_new: 新建版本库
field_repository_is_default: 主版本库
label_copy_attachments: 复制附件
label_repository_new: New repository
field_repository_is_default: Main repository
label_copy_attachments: Copy attachments
label_item_position: "%{position}/%{count}"
label_completed_versions: 已完成的版本
text_project_identifier_info: 仅小写字母a-z、数字、破折号-和下划线_可以使用。<br />一旦保存,标识无法修改。
field_multiple: 多重取值
setting_commit_cross_project_ref: 允许引用/修复所有其他项目的问题
text_issue_conflict_resolution_add_notes: 添加说明并取消我的其他变更处理。
text_issue_conflict_resolution_overwrite: 直接套用我的变更 (先前的说明将被保留,但是某些变更内容可能会被覆盖)
notice_issue_update_conflict: 当您正在编辑这个问题的时候,它已经被其他人抢先一步更新过了。
text_issue_conflict_resolution_cancel: 取消我所有的变更并重新刷新显示 %{link}
permission_manage_related_issues: 相关问题管理
field_ldap_filter: LDAP 过滤器
label_search_for_watchers: 通过查找方式添加跟踪者
notice_account_deleted: 您的账号已被永久删除(账号已无法恢复)。
setting_unsubscribe: 允许用户退订
button_delete_my_account: 删除我的账号
label_completed_versions: Completed versions
text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_multiple: 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_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 unsubscribe
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.

View File

@@ -259,8 +259,7 @@ ActionController::Routing::Routes.draw do |map|
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/diff.:format',
:action => 'diff'
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/raw/*path',
:action => 'entry', :format => 'raw',
:requirements => { :rev => /[a-z0-9\.\-_]+/ }
:action => 'entry', :format => 'raw'
repository_views.connect 'projects/:id/repository/:repository_id/revisions/:rev/:action/*path',
:requirements => {
:action => /(browse|show|entry|changes|annotate|diff)/,
@@ -291,8 +290,7 @@ ActionController::Routing::Routes.draw do |map|
repository_views.connect 'projects/:id/repository/revisions/:rev/diff.:format',
:action => 'diff'
repository_views.connect 'projects/:id/repository/revisions/:rev/raw/*path',
:action => 'entry', :format => 'raw',
:requirements => { :rev => /[a-z0-9\.\-_]+/ }
:action => 'entry', :format => 'raw'
repository_views.connect 'projects/:id/repository/revisions/:rev/:action/*path',
:requirements => {
:action => /(browse|show|entry|changes|annotate|diff)/,

View File

@@ -4,33 +4,6 @@ Redmine - project management software
Copyright (C) 2006-2012 Jean-Philippe Lang
http://www.redmine.org/
== 2012-06-05 v1.4.3
* Defect #11038: "Create and continue" should preserve project, issue and activity when logging time
* Defect #11046: Redmine.pm does not support "bind as user" ldap authentication
* Defect #11051: reposman.rb fails in 1.4.2 because of missing require for rubygems
* Fix for Rails vulnerability CVE-2012-2660
== 2012-05-13 v1.4.2
* Defect #10744: rake task redmine:email:test broken
* Defect #10787: "Allow users to unsubscribe" option is confusing
* Defect #10827: Cannot access Repositories page and Settings in a Project - Error 500
* Defect #10829: db:migrate fails 0.8.2 -> 1.4.1
* Defect #10832: REST Uploads fail with fastcgi
* Defect #10837: reposman and rdm-mailhandler not working with ruby 1.9.x
* Defect #10856: can not load translations from hr.yml with ruby1.9.3-p194
* Defect #10865: Filter reset when deleting locked user
* Feature #9790: Allow filtering text custom fields on "is null" and "is not null"
* Feature #10778: svn:ignore for config/additional_environment.rb
* Feature #10875: Partial Albanian Translations
* Feature #10888: Bring back List-Id to help aid Gmail filtering
* Patch #10733: Traditional Chinese language file (to r9502)
* Patch #10745: Japanese translation update (r9519)
* Patch #10750: Swedish Translation for r9522
* Patch #10785: Bulgarian translation (jstoolbar)
* Patch #10800: Simplified Chinese translation
== 2012-04-20 v1.4.1
* Defect #8574: Time report: date range fields not enabled when using the calendar popup

View File

@@ -1,9 +1,64 @@
#!/usr/bin/env ruby
# == Synopsis
#
# Reads an email from standard input and forward it to a Redmine server
# through a HTTP request.
#
# == Usage
#
# rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
#
# == Arguments
#
# -u, --url URL of the Redmine server
# -k, --key Redmine API key
#
# General options:
# --unknown-user=ACTION how to handle emails from an unknown user
# ACTION can be one of the following values:
# ignore: email is ignored (default)
# accept: accept as anonymous user
# create: create a user account
# --no-permission-check disable permission checking when receiving
# the email
# --key-file=PATH 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)
# --no-check-certificate do not check server certificate
# -h, --help show this help
# -v, --verbose show extra information
# -V, --version show version information and exit
#
# Issue attributes control options:
# -p, --project=PROJECT identifier of the target project
# -s, --status=STATUS name of the target status
# -t, --tracker=TRACKER name of the target tracker
# --category=CATEGORY name of the target category
# --priority=PRIORITY name of the target priority
# -o, --allow-override=ATTRS allow email content to override attributes
# specified by previous options
# ATTRS is a comma separated list of attributes
#
# == Examples
# No project specified. Emails MUST contain the 'Project' keyword:
#
# rdm-mailhandler --url http://redmine.domain.foo --key secret
#
# Fixed project and default tracker specified, but emails can override
# both tracker and priority attributes using keywords:
#
# rdm-mailhandler --url https://domain.foo/redmine --key secret \\
# --project foo \\
# --tracker bug \\
# --allow-override tracker,priority
require 'net/http'
require 'net/https'
require 'uri'
require 'optparse'
require 'getoptlong'
require 'rdoc/usage'
module Net
class HTTPS < HTTP
@@ -23,68 +78,64 @@ module Net
end
class RedmineMailHandler
VERSION = '0.2'
VERSION = '0.1'
attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
def initialize
self.issue_attributes = {}
optparse = OptionParser.new do |opts|
opts.banner = "Usage: rdm-mailhandler.rb [options] --url=<Redmine URL> --key=<API key>"
opts.separator("")
opts.separator("Reads an email from standard input and forward 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}
opts.on("-k", "--key KEY", "Redmine API key") {|v| self.key = v}
opts.separator("")
opts.separator("General options:")
opts.on("--unknown-user ACTION", "how to handle emails from an unknown user",
"ACTION can be one of the following values:",
"* ignore: email is ignored (default)",
"* accept: accept as anonymous user",
"* create: create a user account") {|v| self.unknown_user = v}
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("--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}
opts.on("-V", "--version", "show version information and exit") {puts VERSION; exit}
opts.separator("")
opts.separator("Issue attributes control options:")
opts.on("-p", "--project PROJECT", "identifier of the target project") {|v| self.issue_attributes['project'] = v}
opts.on("-s", "--status STATUS", "name of the target status") {|v| self.issue_attributes['status'] = v}
opts.on("-t", "--tracker TRACKER", "name of the target tracker") {|v| self.issue_attributes['tracker'] = v}
opts.on( "--category CATEGORY", "name of the target category") {|v| self.issue_attributes['category'] = v}
opts.on( "--priority PRIORITY", "name of the target priority") {|v| self.issue_attributes['priority'] = v}
opts.on("-o", "--allow-override ATTRS", "allow email content to override attributes",
"specified by previous options",
"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(" rdm-mailhandler.rb --url http://redmine.domain.foo --key secret")
opts.separator("")
opts.separator("Fixed project and default tracker specified, but emails can override")
opts.separator("both tracker and priority attributes using keywords:")
opts.separator(" rdm-mailhandler.rb --url https://domain.foo/redmine --key secret \\")
opts.separator(" --project foo \\")
opts.separator(" --tracker bug \\")
opts.separator(" --allow-override tracker,priority")
opts = GetoptLong.new(
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
[ '--version', '-V', GetoptLong::NO_ARGUMENT ],
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
[ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
[ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
[ '--key-file', GetoptLong::REQUIRED_ARGUMENT],
[ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
[ '--status', '-s', GetoptLong::REQUIRED_ARGUMENT ],
[ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
[ '--category', GetoptLong::REQUIRED_ARGUMENT],
[ '--priority', GetoptLong::REQUIRED_ARGUMENT],
[ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
[ '--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
[ '--no-permission-check', GetoptLong::NO_ARGUMENT],
[ '--no-check-certificate', GetoptLong::NO_ARGUMENT]
)
opts.summary_width = 27
opts.each do |opt, arg|
case opt
when '--url'
self.url = arg.dup
when '--key'
self.key = arg.dup
when '--key-file'
begin
self.key = File.read(arg).strip
rescue Exception => e
$stderr.puts "Unable to read the key from #{arg}: #{e.message}"
exit 1
end
when '--help'
usage
when '--verbose'
self.verbose = true
when '--version'
puts VERSION; exit
when '--project', '--status', '--tracker', '--category', '--priority'
self.issue_attributes[opt.gsub(%r{^\-\-}, '')] = arg.dup
when '--allow-override'
self.allow_override = arg.dup
when '--unknown-user'
self.unknown_user = arg.dup
when '--no-permission-check'
self.no_permission_check = '1'
when '--no-check-certificate'
self.no_check_certificate = true
end
end
optparse.parse!
unless url && key
puts "Some arguments are missing. Use `rdm-mailhandler.rb --help` for getting help."
exit 1
end
RDoc.usage if url.nil?
end
def submit(email)
@@ -130,15 +181,6 @@ class RedmineMailHandler
def debug(msg)
puts msg if verbose
end
def read_key_from_file(filename)
begin
self.key = File.read(filename).strip
rescue Exception => e
$stderr.puts "Unable to read the key from #{filename}:\n#{e.message}"
exit 1
end
end
end
handler = RedmineMailHandler.new

View File

@@ -366,19 +366,12 @@ sub is_member {
);
$sthldap->execute($auth_source_id);
while (my @rowldap = $sthldap->fetchrow_array) {
my $bind_as = $rowldap[3] ? $rowldap[3] : "";
my $bind_pw = $rowldap[4] ? $rowldap[4] : "";
if ($bind_as =~ m/\$login/) {
# replace $login with $redmine_user and use $redmine_pass
$bind_as =~ s/\$login/$redmine_user/g;
$bind_pw = $redmine_pass
}
my $ldap = Authen::Simple::LDAP->new(
host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]:$rowldap[1]" : $rowldap[0],
port => $rowldap[1],
basedn => $rowldap[5],
binddn => $bind_as,
bindpw => $bind_pw,
binddn => $rowldap[3] ? $rowldap[3] : "",
bindpw => $rowldap[4] ? $rowldap[4] : "",
filter => "(".$rowldap[6]."=%s)"
);
my $method = $r->method;

View File

@@ -1,13 +1,96 @@
#!/usr/bin/env ruby
require 'optparse'
# == Synopsis
#
# reposman: manages your repositories with Redmine
#
# == Usage
#
# reposman [OPTIONS...] -s [DIR] -r [HOST]
#
# Examples:
# reposman --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion
# reposman -s /var/git -r redmine.example.net -u http://svn.example.net --scm git
#
# == Arguments (mandatory)
#
# -s, --svn-dir=DIR use DIR as base directory for svn repositories
# -r, --redmine-host=HOST assume Redmine is hosted on HOST. Examples:
# -r redmine.example.net
# -r http://redmine.example.net
# -r https://example.net/redmine
# -k, --key=KEY use KEY as the Redmine API key (you can use the
# --key-file option as an alternative)
#
# == Options
#
# -o, --owner=OWNER owner of the repository. using the rails login
# allow user to browse the repository within
# Redmine even for private project. If you want to
# share repositories through Redmine.pm, you need
# to use the apache owner.
# -g, --group=GROUP group of the repository. (default: root)
# --scm=SCM the kind of SCM repository you want to create (and
# register) in Redmine (default: Subversion).
# reposman is able to create Git and Subversion
# repositories. For all other kind, you must specify
# a --command option
# -u, --url=URL the base url Redmine will use to access your
# repositories. This option is used to automatically
# register the repositories in Redmine. The project
# identifier will be appended to this url. Examples:
# -u https://example.net/svn
# -u file:///var/svn/
# if this option isn't set, reposman won't register
# the repositories in Redmine
# -c, --command=COMMAND use this command instead of "svnadmin create" to
# create a repository. This option can be used to
# create repositories other than subversion and git
# kind.
# This command override the default creation for git
# and subversion.
# -f, --force force repository creation even if the project
# repository is already declared in Redmine
# --key-file=PATH 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)
# -t, --test only show what should be done
# -h, --help show help and exit
# -v, --verbose verbose
# -V, --version print version and exit
# -q, --quiet no log
#
# == References
#
# You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos
require 'getoptlong'
require 'rdoc/usage'
require 'find'
require 'etc'
require 'rubygems'
Version = "1.4"
Version = "1.3"
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
opts = GetoptLong.new(
['--svn-dir', '-s', GetoptLong::REQUIRED_ARGUMENT],
['--redmine-host', '-r', GetoptLong::REQUIRED_ARGUMENT],
['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
['--key-file', GetoptLong::REQUIRED_ARGUMENT],
['--owner', '-o', GetoptLong::REQUIRED_ARGUMENT],
['--group', '-g', GetoptLong::REQUIRED_ARGUMENT],
['--url', '-u', GetoptLong::REQUIRED_ARGUMENT],
['--command' , '-c', GetoptLong::REQUIRED_ARGUMENT],
['--scm', GetoptLong::REQUIRED_ARGUMENT],
['--test', '-t', GetoptLong::NO_ARGUMENT],
['--force', '-f', GetoptLong::NO_ARGUMENT],
['--verbose', '-v', GetoptLong::NO_ARGUMENT],
['--version', '-V', GetoptLong::NO_ARGUMENT],
['--help' , '-h', GetoptLong::NO_ARGUMENT],
['--quiet' , '-q', GetoptLong::NO_ARGUMENT]
)
$verbose = 0
$quiet = false
$redmine_host = ''
@@ -50,84 +133,36 @@ module SCM
end
def read_key_from_file(filename)
begin
$api_key = File.read(filename).strip
rescue Exception => e
$stderr.puts "Unable to read the key from #{filename}: #{e.message}"
exit 1
begin
opts.each do |opt, arg|
case opt
when '--svn-dir'; $repos_base = arg.dup
when '--redmine-host'; $redmine_host = arg.dup
when '--key'; $api_key = arg.dup
when '--key-file'
begin
$api_key = File.read(arg).strip
rescue Exception => e
$stderr.puts "Unable to read the key from #{arg}: #{e.message}"
exit 1
end
when '--owner'; $svn_owner = arg.dup; $use_groupid = false;
when '--group'; $svn_group = arg.dup; $use_groupid = false;
when '--url'; $svn_url = arg.dup
when '--scm'; $scm = arg.dup.capitalize; log("Invalid SCM: #{$scm}", :exit => true) unless SUPPORTED_SCM.include?($scm)
when '--command'; $command = arg.dup
when '--verbose'; $verbose += 1
when '--test'; $test = true
when '--force'; $force = true
when '--version'; puts Version; exit
when '--help'; RDoc::usage
when '--quiet'; $quiet = true
end
end
rescue
exit 1
end
def set_scm(scm)
$scm = scm.capitalize
unless SUPPORTED_SCM.include?($scm)
log("Invalid SCM: #{$scm}\nValid SCM are: #{SUPPORTED_SCM.join(', ')}", :exit => true)
end
end
optparse = OptionParser.new do |opts|
opts.banner = "Usage: reposman.rb [OPTIONS...] -s [DIR] -r [HOST] -k [KEY]"
opts.separator("")
opts.separator("Manages your repositories with Redmine.")
opts.separator("")
opts.separator("Required arguments:")
opts.on("-s", "--svn-dir DIR", "use DIR as base directory for svn repositories") {|v| $repos_base = v}
opts.on("-r", "--redmine-host HOST","assume Redmine is hosted on HOST. Examples:",
" -r redmine.example.net",
" -r http://redmine.example.net",
" -r https://redmine.example.net") {|v| $redmine_host = v}
opts.on("-k", "--key KEY", "use KEY as the Redmine API key",
"(you can use --key-file option as an alternative)") {|v| $api_key = v}
opts.separator("")
opts.separator("Options:")
opts.on("-o", "--owner OWNER", "owner of the repository. using the rails login",
"allows users to browse the repository within",
"Redmine even for private projects. If you want to",
"share repositories through Redmine.pm, you need",
"to use the apache owner.") {|v| $svn_owner = v; $use_groupid = false}
opts.on("-g", "--group GROUP", "group of the repository (default: root)") {|v| $svn_group = v; $use_groupid = false}
opts.on("-u", "--url URL", "the base url Redmine will use to access your",
"repositories. This option is used to register",
"the repositories in Redmine automatically. The",
"project identifier will be appended to this url.",
"Examples:",
" -u https://example.net/svn",
" -u file:///var/svn/",
"if this option isn't set, reposman won't register",
"the repositories in Redmine") {|v| $svn_url = v}
opts.on( "--scm SCM", "the kind of SCM repository you want to create",
"(and register) in Redmine (default: Subversion).",
"reposman is able to create Git and Subversion",
"repositories.",
"For all other kind, you must specify a --command",
"option") {|v| set_scm(v)}
opts.on("-c", "--command COMMAND", "use this command instead of `svnadmin create` to",
"create a repository. This option can be used to",
"create repositories other than subversion and git",
"kind.",
"This command override the default creation for",
"git and subversion.") {|v| $command = v}
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",
"want the key to appear in the command line)") {|v| read_key_from_file(v)}
opts.on("-t", "--test", "only show what should be done") {$test = true}
opts.on("-f", "--force", "force repository creation even if the project", "repository is already declared in Redmine") {$force = true}
opts.on("-v", "--verbose", "verbose") {$verbose += 1}
opts.on("-V", "--version", "show version and exit") {puts Version; exit}
opts.on("-h", "--help", "show help and exit") {puts opts; exit 1}
opts.on("-q", "--quiet", "no log") {$quiet = true}
opts.separator("")
opts.separator("Examples:")
opts.separator(" reposman.rb --svn-dir=/var/svn --redmine-host=redmine.host")
opts.separator(" reposman.rb -s /var/git -r redmine.host -u http://git.host --scm git")
opts.separator("")
opts.separator("You can find more information on the redmine's wiki:\nhttp://www.redmine.org/projects/redmine/wiki/HowTos")
opts.summary_width = 25
end
optparse.parse!
if $test
log("running in test mode")
end
@@ -144,8 +179,7 @@ end
$svn_url += "/" if $svn_url and not $svn_url.match(/\/$/)
if ($redmine_host.empty? or $repos_base.empty?)
puts "Some arguments are missing. Use reposman.rb --help for getting help."
exit 1
RDoc::usage
end
unless File.directory?($repos_base)

View File

@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc:
MAJOR = 1
MINOR = 4
TINY = 3
TINY = 1
# Branch values:
# * official release: nil

View File

@@ -176,7 +176,7 @@ END_DESC
ActionMailer::Base.raise_delivery_errors = true
begin
Mailer.deliver_test_email(user)
Mailer.deliver_test_email(User.current)
puts l(:notice_email_sent, user.mail)
rescue Exception => e
abort l(:notice_email_error, e.message)

View File

@@ -1,126 +0,0 @@
// ** I18N
// Calendar SQ language
// Encoding: any
// Distributed under the same terms as the calendar itself.
// For translators: please use UTF-8 if possible. We strongly believe that
// Unicode is the answer to a real internationalized world. Also please
// include your contact information in the header, as can be seen above.
// full day names
Calendar._DN = new Array
("Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
// for exemplification on how one can customize the short day names, but if
// they are simply the first N letters of the full name you can simply say:
//
// Calendar._SDN_len = N; // short day name length
// Calendar._SMN_len = N; // short month name length
//
// If N = 3 then this is not needed either since we assume a value of 3 if not
// present, to be compatible with translation files that were written before
// this feature.
// short day names
Calendar._SDN = new Array
("Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun");
// First day of the week. "0" means display Sunday first, "1" means display
// Monday first, etc.
Calendar._FD = 0;
// full month names
Calendar._MN = new Array
("January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December");
// short month names
Calendar._SMN = new Array
("Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec");
// tooltips
Calendar._TT = {};
Calendar._TT["INFO"] = "About the calendar";
Calendar._TT["ABOUT"] =
"DHTML Date/Time Selector\n" +
"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
"\n\n" +
"Date selection:\n" +
"- Use the \xab, \xbb buttons to select year\n" +
"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
"- Hold mouse button on any of the above buttons for faster selection.";
Calendar._TT["ABOUT_TIME"] = "\n\n" +
"Time selection:\n" +
"- Click on any of the time parts to increase it\n" +
"- or Shift-click to decrease it\n" +
"- or click and drag for faster selection.";
Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
Calendar._TT["GO_TODAY"] = "Go Today";
Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
Calendar._TT["SEL_DATE"] = "Select date";
Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
Calendar._TT["PART_TODAY"] = " (today)";
// the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name.
Calendar._TT["DAY_FIRST"] = "Display %s first";
// This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
// means Monday, etc.
Calendar._TT["WEEKEND"] = "0,6";
Calendar._TT["CLOSE"] = "Close";
Calendar._TT["TODAY"] = "Today";
Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
Calendar._TT["WK"] = "wk";
Calendar._TT["TIME"] = "Time:";

View File

@@ -1,16 +1,16 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Получер';
jsToolBar.strings['Italic'] = 'Курсив';
jsToolBar.strings['Underline'] = 'Подчертан';
jsToolBar.strings['Deleted'] = 'Изтрит';
jsToolBar.strings['Code'] = 'Вграден код';
jsToolBar.strings['Heading 1'] = 'Заглавие 1';
jsToolBar.strings['Heading 2'] = 'Заглавие 2';
jsToolBar.strings['Heading 3'] = 'Заглавие 3';
jsToolBar.strings['Unordered list'] = 'Неподреден списък';
jsToolBar.strings['Ordered list'] = 'Подреден списък';
jsToolBar.strings['Quote'] = 'Цитат';
jsToolBar.strings['Unquote'] = 'Премахване на цитат';
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Връзка до Wiki страница';
jsToolBar.strings['Image'] = 'Изображение';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

View File

@@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

View File

@@ -21,7 +21,6 @@ custom_fields_002:
min_length: 1
regexp: ""
is_for_all: true
is_filter: true
type: IssueCustomField
max_length: 100
possible_values: ""

View File

@@ -44,7 +44,6 @@ class TimelogControllerTest < ActionController::TestCase
# Default activity selected
assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
:content => 'Development'
assert_select 'input[name=project_id][value=1]'
end
def test_get_new_should_only_show_active_time_entry_activities
@@ -62,18 +61,6 @@ class TimelogControllerTest < ActionController::TestCase
assert_response :success
assert_template 'new'
assert_tag 'select', :attributes => {:name => 'time_entry[project_id]'}
assert_select 'input[name=project_id]', 0
end
def test_new_without_project_should_prefill_the_form
@request.session[:user_id] = 3
get :new, :time_entry => {:project_id => '1'}
assert_response :success
assert_template 'new'
assert_select 'select[name=?]', 'time_entry[project_id]' do
assert_select 'option[value=1][selected=selected]'
end
assert_select 'input[name=project_id]', 0
end
def test_new_without_project_should_deny_without_permission
@@ -157,7 +144,7 @@ class TimelogControllerTest < ActionController::TestCase
:spent_on => '2008-03-14',
:hours => '7.3'},
:continue => '1'
assert_redirected_to '/projects/ecookbook/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D='
assert_redirected_to '/projects/ecookbook/time_entries/new'
end
def test_create_and_continue_with_issue_id
@@ -168,7 +155,7 @@ class TimelogControllerTest < ActionController::TestCase
:spent_on => '2008-03-14',
:hours => '7.3'},
:continue => '1'
assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=1'
assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new'
end
def test_create_and_continue_without_project
@@ -180,7 +167,7 @@ class TimelogControllerTest < ActionController::TestCase
:hours => '7.3'},
:continue => '1'
assert_redirected_to '/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=&time_entry%5Bproject_id%5D=1'
assert_redirected_to '/time_entries/new'
end
def test_create_without_log_time_permission_should_be_denied

View File

@@ -483,11 +483,3 @@ end
# Simple module to "namespace" all of the API tests
module ApiTest
end
module ActionController
class TestUploadedFile
def respond_to?(method_name)
@tempfile.respond_to?(method_name) || super
end
end
end

View File

@@ -166,7 +166,6 @@ class MailerTest < ActiveSupport::TestCase
assert_not_nil mail
assert_equal 'OOF', mail.header_string('X-Auto-Response-Suppress')
assert_equal 'auto-generated', mail.header_string('Auto-Submitted')
assert_equal '<redmine.example.net>', mail.header_string('List-Id')
end
def test_email_headers_should_include_sender

View File

@@ -112,15 +112,6 @@ class QueryTest < ActiveSupport::TestCase
assert issues.all? {|i| i.start_date.nil?}
end
def test_operator_none_for_string_custom_field
query = Query.new(:project => Project.find(1), :name => '_')
query.add_filter('cf_2', '!*', [''])
assert query.has_filter?('cf_2')
issues = find_issues_with_query(query)
assert !issues.empty?
assert issues.all? {|i| i.custom_field_value(2).blank?}
end
def test_operator_all
query = Query.new(:project => Project.find(1), :name => '_')
query.add_filter('fixed_version_id', '*', [''])
@@ -138,15 +129,6 @@ class QueryTest < ActiveSupport::TestCase
assert issues.all? {|i| i.start_date.present?}
end
def test_operator_all_for_string_custom_field
query = Query.new(:project => Project.find(1), :name => '_')
query.add_filter('cf_2', '*', [''])
assert query.has_filter?('cf_2')
issues = find_issues_with_query(query)
assert !issues.empty?
assert issues.all? {|i| i.custom_field_value(2).present?}
end
def test_numeric_filter_should_not_accept_non_numeric_values
query = Query.new(:name => '_')
query.add_filter('estimated_hours', '=', ['a'])

View File

@@ -318,13 +318,4 @@ class RepositoryTest < ActiveSupport::TestCase
assert_equal "test_value_23",
repo.extra_info["test_2"]["test_23"]
end
def test_sort_should_not_raise_an_error_with_nil_identifiers
r1 = Repository.new
r2 = Repository.new
assert_nothing_raised do
[r1, r2].sort
end
end
end

View File

@@ -184,7 +184,7 @@ module CollectiveIdea #:nodoc:
find(:all, :conditions => ["#{quoted_parent_column_name} = ? #{scope.call(node)}", node], :order => "#{quoted_left_column_name}, #{quoted_right_column_name}, #{acts_as_nested_set_options[:order]}").each{|n| set_left_and_rights.call(n) }
# set right
node[right_column_name] = indices[scope.call(node)] += 1
node.save(false)
node.save!
end
# Find root node(s)