Compare commits

...
91 Commits
Author SHA1 Message Date
Jean-Philippe Lang fd7354ac06 Updates for 1.4.7 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11237 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 18:20:19 +00:00
Toshi MARUYAMA 5c077abb0e 1.4-stable: add a link to a mail posted on 14 Jan 2013 about Rails 2.3 CVE-2013-0155
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11208 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 11:48:54 +00:00
Toshi MARUYAMA a1614e5e53 1.4-stable: add the patch for CVE-2013-0155 in Rails 2.3.15
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11197 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-17 00:36:07 +00:00
Jean-Philippe Lang 284ee1080b Removed Rails patch.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11154 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 15:18:37 +00:00
Jean-Philippe Lang 190fc8d9db Changes for 1.4.6 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11149 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:43:38 +00:00
Jean-Philippe Lang cf5e29a83b Upgrade to Rails 2.3.15.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11148 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:42:30 +00:00
Toshi MARUYAMA 2acfd0847c Merged r11051 from trunk to 1.4-stable (#12630)
Russian "x_hours" translation updated by Mikhail Velkin.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11055 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-19 00:05:11 +00:00
Toshi MARUYAMA 2f2f360311 Merged r11035 from trunk to 1.4-stable (#12615)
Russian translation updated by Kirill Bezrukov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11039 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-17 23:54:47 +00:00
Toshi MARUYAMA 29b64fce8e Merged r11022 from trunk to 1.4-stable (#12614)
Dutch translation updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11025 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-17 12:45:09 +00:00
Toshi MARUYAMA 759a3321f4 Merged r11014 from trunk to 1.4-stable (#12605)
Norwegian translation for 1.4-stable updated by Ketil Mehl.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@11020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-16 07:42:04 +00:00
Jean-Philippe Lang b5c0a3313b Reverts r10896 (#12472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10899 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-30 10:26:02 +00:00
Jean-Philippe Lang ca73f99056 Reverts r10896 (#12472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10898 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-30 10:25:48 +00:00
Jean-Philippe Lang 8312fec63f Merged r10893 into 1.4-stable (#12472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-30 08:59:57 +00:00
Toshi MARUYAMA 68c2588f85 Merged r10862 from trunk to 1.4-stable (#12409)
scm: git: change extra_report_last_commit type at unit test to string.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10864 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-22 01:18:23 +00:00
Toshi MARUYAMA 31e714f2db Merged r10856 and r10857 from trunk to 1.4-stable (#12409)
scm: git: fix changesets aren't read after clear_changesets call.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10859 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 09:59:22 +00:00
Toshi MARUYAMA 886d6f006b Merged r10840 from trunk to 1.4-stable
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10849 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 22:47:32 +00:00
Jean-Philippe Lang 628e63eefe Updates for 1.4.5 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10834 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 13:24:56 +00:00
Toshi MARUYAMA 83b356484a Merged r10709 from trunk to 1.4-stable (#12196)
fix "Page not found" on OK button in SCM "View all revisions" page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10711 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 10:33:15 +00:00
Toshi MARUYAMA 5210b58226 Merged r10702 from trunk to 1.4-stable (#12189)
add tmp/pdf directory.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10704 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 11:01:49 +00:00
Toshi MARUYAMA a0932173a5 Merged r10689 from trunk to 1.4-stable
Partial backout r10263.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:29:14 +00:00
Toshi MARUYAMA e889fe9c8a Merged r10688 from trunk to 1.4-stable
Backout r10253.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10692 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:28:44 +00:00
Toshi MARUYAMA 16b1fcb079 Merged r10596 from trunk to 1.4-stable (#9732)
German translation updated by Raphael Kallensee.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10601 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 03:55:38 +00:00
Toshi MARUYAMA 3b7793561a Merged r10572 from trunk
add missing fixtures to test/unit/issue_relation_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:58:27 +00:00
Toshi MARUYAMA 2c3c1d2a02 Merged r10571 from trunk
add missing fixture to test/integration/api_test/issues_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:58:13 +00:00
Toshi MARUYAMA 49cb3aaca6 Merged r10503 from trunk to 1.4-stable (#11966)
add functional test of sub repository diff path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10508 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 04:48:01 +00:00
Toshi MARUYAMA 8a8df72937 Merged r10502 from trunk to 1.4-stable (#11966)
add functional test of main repository diff path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10507 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 04:47:46 +00:00
Toshi MARUYAMA ad238abd0c Merged r10490 from trunk to 1.4-stable (#11966)
explicitly define route at scm diff view.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10506 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 04:47:26 +00:00
Toshi MARUYAMA d69cae859f Merged r10501 from trunk
set user preference diff type nil at functional tests.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10504 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 03:51:33 +00:00
Toshi MARUYAMA 59d4d210a7 Merged r10498 from trunk
scm: git: use with_settings instead of assigned setting at functional test

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 00:19:09 +00:00
Toshi MARUYAMA 633b86236c Merged r10477 from trunk
set default_language en at test_commit_closing_a_subproject_issue of unit changeset test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10483 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 12:05:51 +00:00
Toshi MARUYAMA 91514dd682 add tests that i18n currency options are nil to 1.4-stable Rails2 (#11922)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10475 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 08:12:04 +00:00
Jean-Philippe Lang 917127f179 Updated 1.4 CHANGELOG.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10300 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:25:29 +00:00
Jean-Philippe Lang 49295481de Add namespace to Time (#11298).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10299 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:23:57 +00:00
Jean-Philippe Lang 8cc56cce66 Merged r10294 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10297 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:21:09 +00:00
Jean-Philippe Lang 8d5fadc773 Updated 1.4 CHANGELOG.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10296 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:19:27 +00:00
Jean-Philippe Lang eb3e79b70d Merged r10148 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10295 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-06 17:07:49 +00:00
Toshi MARUYAMA 5d3bdb66cd Merged r10253, r10257, r10263 and r10264 from trunk to 1.4-stable
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10266 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 07:22:52 +00:00
Toshi MARUYAMA 1974123562 Merged r10255 from trunk to 1.4-stable
add missing fixture to test/unit/lib/redmine/safe_attributes_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10262 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 05:09:12 +00:00
Toshi MARUYAMA bcef197b41 Merged r10256 from trunk to 1.4-stable
add missing fixtures to test/unit/lib/redmine/hook_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10261 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 05:08:57 +00:00
Toshi MARUYAMA 231145160f Merged r10249 from trunk to 1.4-stable
set language en to test_label_for at test/unit/query_test.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10260 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 05:08:42 +00:00
Toshi MARUYAMA 0e1ae572c7 Merged r10252 from trunk to 1.4-stable (#11752)
scm: git: use with_settings at test_diff_truncated of functional test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10259 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 05:08:22 +00:00
Toshi MARUYAMA b3a86771ce Merged r10251 from trunk to 1.4-stable (#11752)
scm: git: use diff_max_lines_displayed setting at test_diff_with_rev_and_path of functional test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10258 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 05:08:06 +00:00
Toshi MARUYAMA 2516d4f408 Merged r9949 from trunk to 1.4-stable
Tests should not change settings.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10250 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-01 02:16:07 +00:00
Toshi MARUYAMA 03d6c4668e Merged r10245 from trunk to 1.4-stable (#11752)
scm: git: add functional test of diff with revision and path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10248 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-31 23:55:56 +00:00
Toshi MARUYAMA a97d6baddd Merged r10230 from trunk (#11665)
add check default document category is not defined on database in tests.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10233 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-22 22:44:30 +00:00
Toshi MARUYAMA f3a8494cfb Merged r10219 from trunk to 1.4-stable (#11665)
add functional test to create non default document category.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10227 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 17:16:28 +00:00
Toshi MARUYAMA 14dcefaa97 set default category_id instead of the object (#11665)
Rails 2.3 still has issues with synchronizing the association_id
and association attributes of an object. That means, if you set the
association with an object first and then just set the id afterwards,
the object wins and the setting of the id gets lost.

This is not an issue in Rails >= 3.1 anymore.

Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10226 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 17:15:59 +00:00
Toshi MARUYAMA f4a7d6ca8c Merged r10221 from trunk to 1.4-stable (#11665)
force set default document category if it is not set on database.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10225 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 17:15:38 +00:00
Toshi MARUYAMA aedd5c5e35 Merged r10220 from trunk to 1.4-stable (#11665)
add unit test to get default document category defined on database.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10224 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 17:15:16 +00:00
Toshi MARUYAMA 554d6bcba2 Merged r10222 from trunk to 1.4-stable (#11665)
add position to DocumentCategory in enumerations fixture.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10223 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 17:14:53 +00:00
Toshi MARUYAMA 4fcec69a40 Merged r10216 from trunk
add missing fixtures to test/functional/documents_controller_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10218 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 04:53:10 +00:00
Toshi MARUYAMA 7e6cc2f583 Merged r10213 from trunk
add missing fixtures to test/unit/document_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10215 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-21 02:25:58 +00:00
Toshi MARUYAMA 16383ed386 Merged r10169 from trunk to 1.4-stable (#11600)
fix plural form of the abbreviation for hours in Brazilian Portuguese.

Contributed by Mauricio Piacentini.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10173 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-08 01:39:09 +00:00
Toshi MARUYAMA 27127e1a3b Merged r10167 from trunk to 1.4-stable
Gemfile: mocha version up 0.12.3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-08 01:38:54 +00:00
Toshi MARUYAMA a92ef237d3 Merged r10155 from trunk to 1.4-stable
Gemfile: pin mocha version 0.12.1.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10168 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-08-07 23:21:45 +00:00
Toshi MARUYAMA a82a16378f Merged r10137 from trunk to 1.4-stable (#10320, #10818)
Gemfile: prevent "rake db:migrate RAILS_ENV=test" causes exception on Ruby 1.9.3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10139 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-31 08:47:21 +00:00
Toshi MARUYAMA 886daba641 Merged r10055 from trunk to 1.4-stable (#11448)
Russian translation for 1.4-stable and 2.0-stable updated by Александр Закревский.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10057 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-20 10:12:18 +00:00
Toshi MARUYAMA ab8dd5aa6e Backported r10005 from trunk to 1.4-stable (#11406, #11404)
German translation for configurable session lifetime and timeout updated by Hannes Meier.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-16 14:17:35 +00:00
Jean-Philippe Lang dbc02e66dc Backported r9982 and r9984 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-15 16:00:58 +00:00
Jean-Philippe Lang 75e350f4e6 Merged r9924 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9960 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:38:57 +00:00
Jean-Philippe Lang 81553d396e Merged r9908 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:32:38 +00:00
Jean-Philippe Lang 77e03b508b Merged r9875 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-08 12:26:49 +00:00
Toshi MARUYAMA 1b0e717902 Merged r9911 from trunk to 1.4-stable (#11328)
Fix Japanese mistranslation for 'label_language_based'.

Contributed by Go MAEDA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-07-05 13:10:27 +00:00
Toshi MARUYAMA 53b8de5e39 Backport r9890 from trunk to 1.4-stable
Simplified Chinese translation updated by Steven Wong (#11261).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-26 11:44:38 +00:00
Toshi MARUYAMA 34df573ec2 Merge r9870 from trunk
scm: git: fix unable to run unit lib test if git binary is not available on Windows.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9874 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-19 02:12:59 +00:00
Jean-Philippe Lang e2f00792a8 Updates for 1.4.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-18 18:46:53 +00:00
Jean-Philippe Lang 9ed998af9b Merged r9861 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9863 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-18 18:35:50 +00:00
Jean-Philippe Lang 1881706df4 Backported r9858 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-18 18:29:15 +00:00
Toshi MARUYAMA a3bf12ab9f Backport r9856 from trunk (#11186)
Traditional Chinese translation updated by ChunChang Lo.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9857 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-18 03:49:29 +00:00
Toshi MARUYAMA 668981b8cd Merged r9853 from trunk (#10688)
fix PDF export tables problems.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9855 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 13:23:57 +00:00
Toshi MARUYAMA b303dddbe3 Merge r9750 from trunk
scm: git: skip Latin-1 path tests on Git for Windows above 1.7.10

Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10.
http://code.google.com/p/msysgit/issues/detail?id=80

So, Latin-1 path tests fail on Japanese Windows.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9852 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 10:53:30 +00:00
Jean-Philippe Lang 933e96116e Fix for Rails vulnerabilities CVE-2012-2694 and CVE-2012-2695.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9849 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 09:21:16 +00:00
Jean-Philippe Lang 10711fda6d Merged r9837 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9847 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 09:01:17 +00:00
Jean-Philippe Lang b3b829c025 Merged r9831 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9844 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 08:57:15 +00:00
Jean-Philippe Lang 8cd0baf773 Merged r9822 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9842 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 08:54:12 +00:00
Jean-Philippe Lang 033aa68427 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9841 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-17 08:52:59 +00:00
Etienne Massip 1eb20d42bd Merged r9832 fro trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9833 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-14 21:09:00 +00:00
Toshi MARUYAMA a9dbecd5a5 Backported r9817 from trunk (#11130)
Simplified Chinese translation updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9821 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-11 07:30:25 +00:00
Toshi MARUYAMA a13218e9f4 Backported r9816 from trunk (#11129)
Bulgarian translation updated by Ivan Cenov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9820 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-11 07:30:00 +00:00
Toshi MARUYAMA 57b0faf128 Backported r9815 from trunk (#11128)
Japanese translation updated by Go MAEDA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-11 07:29:31 +00:00
Jean-Philippe Lang ba3828b49f Backported r9797 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9810 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-10 20:30:58 +00:00
Jean-Philippe Lang fe1a152e02 Merged r9798 to r9801 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9803 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-10 13:40:02 +00:00
Jean-Philippe Lang 69709a2513 CHANGELOG update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9791 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-09 13:54:33 +00:00
Jean-Philippe Lang 7b7bca0b59 Merged r9783 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9790 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-09 13:53:37 +00:00
Toshi MARUYAMA 64b0cb336d Merged r9777 from trunk (#11113)
fix German "field_multiple" translation glitch by Andreas Deininger.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-08 07:50:40 +00:00
Toshi MARUYAMA 79b7b32980 1.4-stable: scm: git: backport creating and updating test from trunk r9616 (#10830)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9775 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-06 23:08:29 +00:00
Jean-Philippe Lang 1e1517e6ab Updates for 1.4.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-05 17:21:42 +00:00
Jean-Philippe Lang 70b0d5722b Rails CVE-2012-2660.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-03 20:08:23 +00:00
Jean-Philippe Lang 3883d5e2db Merged r9755 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9757 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-03 08:50:53 +00:00
Jean-Philippe Lang bca6c447cb Merged r9740 and r9741 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9754 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-03 08:13:58 +00:00
Jean-Philippe Lang b230429a61 Merged r9742 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9752 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-06-03 08:07:37 +00:00
120 changed files with 1518 additions and 274 deletions
+1
View File
@@ -18,6 +18,7 @@
/public/plugin_assets /public/plugin_assets
/tmp/* /tmp/*
/tmp/cache/* /tmp/cache/*
/tmp/pdf/*
/tmp/sessions/* /tmp/sessions/*
/tmp/sockets/* /tmp/sockets/*
/tmp/test/* /tmp/test/*
+1
View File
@@ -20,6 +20,7 @@ public/dispatch.*
public/plugin_assets public/plugin_assets
tmp/* tmp/*
tmp/cache/* tmp/cache/*
tmp/pdf/*
tmp/sessions/* tmp/sessions/*
tmp/sockets/* tmp/sockets/*
tmp/test/* tmp/test/*
+5 -3
View File
@@ -1,6 +1,6 @@
source :rubygems source :rubygems
gem "rails", "2.3.14" gem "rails", "2.3.15"
gem "i18n", "~> 0.4.2" gem "i18n", "~> 0.4.2"
gem "coderay", "~> 1.0.6" gem "coderay", "~> 1.0.6"
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
@@ -39,7 +39,7 @@ end
platforms :mri_18, :mingw_18 do platforms :mri_18, :mingw_18 do
group :mysql do group :mysql do
gem "mysql" gem "mysql", "~> 2.8.1"
end end
end end
@@ -71,8 +71,10 @@ end
group :test do group :test do
gem "shoulda", "~> 2.10.3" gem "shoulda", "~> 2.10.3"
# Shoulda does not work nice on Ruby 1.9.3 and seems to need test-unit explicitely.
gem "test-unit", :platforms => [:mri_19]
gem "edavis10-object_daddy", :require => "object_daddy" gem "edavis10-object_daddy", :require => "object_daddy"
gem "mocha" gem "mocha", "0.12.3"
end end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
+49 -8
View File
@@ -56,7 +56,7 @@ class ApplicationController < ActionController::Base
end end
end end
before_filter :user_setup, :check_if_login_required, :set_localization before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization
filter_parameter_logging :password filter_parameter_logging :password
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
@@ -70,6 +70,38 @@ class ApplicationController < ActionController::Base
require_dependency "repository/#{scm.underscore}" require_dependency "repository/#{scm.underscore}"
end end
def session_expiration
if session[:user_id]
if session_expired? && !try_to_autologin
reset_session
flash[:error] = l(:error_session_expired)
redirect_to signin_url
else
session[:atime] = Time.now.utc.to_i
end
end
end
def session_expired?
if Setting.session_lifetime?
unless session[:ctime] && (Time.now.utc.to_i - session[:ctime].to_i <= Setting.session_lifetime.to_i * 60)
return true
end
end
if Setting.session_timeout?
unless session[:atime] && (Time.now.utc.to_i - session[:atime].to_i <= Setting.session_timeout.to_i * 60)
return true
end
end
false
end
def start_user_session(user)
session[:user_id] = user.id
session[:ctime] = Time.now.utc.to_i
session[:atime] = Time.now.utc.to_i
end
def user_setup def user_setup
# Check the settings cache for each request # Check the settings cache for each request
Setting.check_cache Setting.check_cache
@@ -83,10 +115,7 @@ class ApplicationController < ActionController::Base
if session[:user_id] if session[:user_id]
# existing session # existing session
(User.active.find(session[:user_id]) rescue nil) (User.active.find(session[:user_id]) rescue nil)
elsif cookies[:autologin] && Setting.autologin? elsif user = try_to_autologin
# auto-login feature starts a new session
user = User.try_to_autologin(cookies[:autologin])
session[:user_id] = user.id if user
user user
elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth? elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth?
# RSS key authentication does not start a session # RSS key authentication does not start a session
@@ -104,12 +133,24 @@ class ApplicationController < ActionController::Base
end end
end end
def try_to_autologin
if cookies[:autologin] && Setting.autologin?
# auto-login feature starts a new session
user = User.try_to_autologin(cookies[:autologin])
if user
reset_session
start_user_session(user)
end
user
end
end
# Sets the logged in user # Sets the logged in user
def logged_user=(user) def logged_user=(user)
reset_session reset_session
if user && user.is_a?(User) if user && user.is_a?(User)
User.current = user User.current = user
session[:user_id] = user.id start_user_session(user)
else else
User.current = User.anonymous User.current = User.anonymous
end end
@@ -458,9 +499,9 @@ class ApplicationController < ActionController::Base
# Returns the API key present in the request # Returns the API key present in the request
def api_key_from_request def api_key_from_request
if params[:key].present? if params[:key].present?
params[:key] params[:key].to_s
elsif request.headers["X-Redmine-API-Key"].present? elsif request.headers["X-Redmine-API-Key"].present?
request.headers["X-Redmine-API-Key"] request.headers["X-Redmine-API-Key"].to_s
end end
end end
+18 -10
View File
@@ -18,12 +18,13 @@
class TimelogController < ApplicationController class TimelogController < ApplicationController
menu_item :issues menu_item :issues
before_filter :find_project, :only => [:create] before_filter :find_project_for_new_time_entry, :only => [:create]
before_filter :find_time_entry, :only => [:show, :edit, :update] before_filter :find_time_entry, :only => [:show, :edit, :update]
before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy] before_filter :find_time_entries, :only => [:bulk_edit, :bulk_update, :destroy]
before_filter :authorize, :except => [:new, :index, :report] before_filter :authorize, :except => [:new, :index, :report]
before_filter :find_optional_project, :only => [:new, :index, :report] before_filter :find_optional_project, :only => [:index, :report]
before_filter :find_optional_project_for_new_time_entry, :only => [:new]
before_filter :authorize_global, :only => [:new, :index, :report] before_filter :authorize_global, :only => [:new, :index, :report]
accept_rss_auth :index accept_rss_auth :index
@@ -38,7 +39,7 @@ class TimelogController < ApplicationController
def index def index
sort_init 'spent_on', 'desc' sort_init 'spent_on', 'desc'
sort_update 'spent_on' => 'spent_on', sort_update 'spent_on' => ['spent_on', "#{TimeEntry.table_name}.created_on"],
'user' => 'user_id', 'user' => 'user_id',
'activity' => 'activity_id', 'activity' => 'activity_id',
'project' => "#{Project.table_name}.name", 'project' => "#{Project.table_name}.name",
@@ -133,9 +134,13 @@ class TimelogController < ApplicationController
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
if params[:continue] if params[:continue]
if params[:project_id] if params[:project_id]
redirect_to :action => 'new', :project_id => @time_entry.project, :issue_id => @time_entry.issue, :back_url => params[:back_url] 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]
else else
redirect_to :action => 'new', :back_url => params[:back_url] 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]
end end
else else
redirect_back_or_default :action => 'index', :project_id => @time_entry.project redirect_back_or_default :action => 'index', :project_id => @time_entry.project
@@ -258,7 +263,7 @@ private
end end
end end
def find_project def find_optional_project_for_new_time_entry
if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present? if (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
@project = Project.find(project_id) @project = Project.find(project_id)
end end
@@ -266,14 +271,17 @@ private
@issue = Issue.find(issue_id) @issue = Issue.find(issue_id)
@project ||= @issue.project @project ||= @issue.project
end end
if @project.nil?
render_404
return false
end
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
render_404 render_404
end end
def find_project_for_new_time_entry
find_optional_project_for_new_time_entry
if @project.nil?
render_404
end
end
def find_optional_project def find_optional_project
if !params[:issue_id].blank? if !params[:issue_id].blank?
@issue = Issue.find(params[:issue_id]) @issue = Issue.find(params[:issue_id])
+3 -1
View File
@@ -799,7 +799,7 @@ module ApplicationHelper
end end
end end
HEADING_RE = /(<h(1|2|3|4)( [^>]+)?>(.+?)<\/h(1|2|3|4)>)/i unless const_defined?(:HEADING_RE) HEADING_RE = /(<h(\d)( [^>]+)?>(.+?)<\/h(\d)>)/i unless const_defined?(:HEADING_RE)
def parse_sections(text, project, obj, attr, only_path, options) def parse_sections(text, project, obj, attr, only_path, options)
return unless options[:edit_section_links] return unless options[:edit_section_links]
@@ -870,6 +870,8 @@ module ApplicationHelper
# Renders the TOC with given headings # Renders the TOC with given headings
def replace_toc(text, headings) def replace_toc(text, headings)
text.gsub!(TOC_RE) do text.gsub!(TOC_RE) do
# Keep only the 4 first levels
headings = headings.select{|level, anchor, item| level <= 4}
if headings.empty? if headings.empty?
'' ''
else else
+1
View File
@@ -24,6 +24,7 @@ class Attachment < ActiveRecord::Base
validates_presence_of :filename, :author validates_presence_of :filename, :author
validates_length_of :filename, :maximum => 255 validates_length_of :filename, :maximum => 255
validates_length_of :disk_filename, :maximum => 255 validates_length_of :disk_filename, :maximum => 255
validates_length_of :description, :maximum => 255, :allow_blank => true
validate :validate_max_file_size validate :validate_max_file_size
acts_as_event :title => :filename, acts_as_event :title => :filename,
+3 -1
View File
@@ -42,7 +42,9 @@ class Document < ActiveRecord::Base
def initialize(attributes=nil, *args) def initialize(attributes=nil, *args)
super super
if new_record? if new_record?
self.category ||= DocumentCategory.default # Rails3 use this instead
# self.category ||= DocumentCategory.default
self.category_id = DocumentCategory.default.id if self.category_id == 0
end end
end end
+8
View File
@@ -31,4 +31,12 @@ class DocumentCategory < Enumeration
def transfer_relations(to) def transfer_relations(to)
documents.update_all("category_id = #{to.id}") documents.update_all("category_id = #{to.id}")
end end
def self.default
d = super
if d.nil?
d = find(:first)
end
d
end
end end
+22
View File
@@ -123,6 +123,28 @@ class Issue < ActiveRecord::Base
end end
end end
# AR#Base#destroy would raise and StaleObjectError exception
# if the issue was already deleted or updated (non matching lock_version).
# This is a problem when bulk deleting issues or deleting a project
# (because an issue may already be deleted if its parent was deleted
# first).
# The issue is reloaded by the nested_set before being deleted so
# the lock_version condition should not be an issue but we handle it.
def destroy
super
rescue ActiveRecord::StaleObjectError
# Stale or already deleted
begin
reload
rescue ActiveRecord::RecordNotFound
# The issue was actually already deleted
@destroyed = true
return freeze
end
# The issue was stale, retry to destroy
super
end
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields # Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
def available_custom_fields def available_custom_fields
(project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : [] (project && tracker) ? (project.all_issue_custom_fields & tracker.custom_fields.all) : []
+9 -6
View File
@@ -44,8 +44,8 @@ class MailHandler < ActionMailer::Base
cattr_accessor :ignored_emails_headers cattr_accessor :ignored_emails_headers
@@ignored_emails_headers = { @@ignored_emails_headers = {
'X-Auto-Response-Suppress' => 'OOF', 'X-Auto-Response-Suppress' => 'oof',
'Auto-Submitted' => 'auto-replied' 'Auto-Submitted' => /^auto-/
} }
# Processes incoming emails # Processes incoming emails
@@ -63,11 +63,14 @@ class MailHandler < ActionMailer::Base
# Ignore auto generated emails # Ignore auto generated emails
self.class.ignored_emails_headers.each do |key, ignored_value| self.class.ignored_emails_headers.each do |key, ignored_value|
value = email.header_string(key) value = email.header_string(key)
if value && value.to_s.downcase == ignored_value.downcase if value
if logger && logger.info value = value.to_s.downcase
logger.info "MailHandler: ignoring email with #{key}:#{value} header" if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value
if logger && logger.info
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
end
return false
end end
return false
end end
end end
@user = User.find_by_mail(sender_email) if sender_email.present? @user = User.find_by_mail(sender_email) if sender_email.present?
+2 -2
View File
@@ -174,9 +174,9 @@ class Query < ActiveRecord::Base
if values_for(field) if values_for(field)
case type_for(field) case type_for(field)
when :integer when :integer
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) } add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) }
when :float when :float
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+(\.\d*)?$/) } add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+(\.\d*)?$/) }
when :date, :date_past when :date, :date_past
case operator_for(field) case operator_for(field)
when "=", ">=", "<=", "><" when "=", ">=", "<=", "><"
+6 -2
View File
@@ -37,8 +37,8 @@ class Repository < ActiveRecord::Base
validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? } validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true
validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph) validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph)
# donwcase letters, digits, dashes but not digits only # donwcase letters, digits, dashes, underscores but not digits only
validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-]*$/, :allow_blank => true validates_format_of :identifier, :with => /^(?!\d+$)[a-z0-9\-_]*$/, :allow_blank => true
# Checks if the SCM is enabled when creating a repository # Checks if the SCM is enabled when creating a repository
validate :repo_create_validation, :on => :create validate :repo_create_validation, :on => :create
@@ -415,5 +415,9 @@ class Repository < ActiveRecord::Base
connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})") connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
connection.delete("DELETE FROM #{cp} WHERE #{cp}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})") connection.delete("DELETE FROM #{cp} WHERE #{cp}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}") connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}")
clear_extra_info_of_changesets
end
def clear_extra_info_of_changesets
end end
end end
+11
View File
@@ -255,4 +255,15 @@ class Repository::Git < Repository
:order => 'committed_on DESC' :order => 'committed_on DESC'
) )
end end
def clear_extra_info_of_changesets
return if extra_info.nil?
v = extra_info["extra_report_last_commit"]
write_attribute(:extra_info, nil)
h = {}
h["extra_report_last_commit"] = v
merge_extra_info(h)
self.save
end
private :clear_extra_info_of_changesets
end end
+1 -1
View File
@@ -66,7 +66,7 @@ class TimeEntry < ActiveRecord::Base
end end
} }
safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values' safe_attributes 'hours', 'comments', 'issue_id', 'activity_id', 'spent_on', 'custom_field_values', 'custom_fields'
def initialize(attributes=nil, *args) def initialize(attributes=nil, *args)
super super
+7 -4
View File
@@ -130,8 +130,11 @@ class User < Principal
# Returns the user that matches provided login and password, or nil # 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)
login = login.to_s
password = password.to_s
# Make sure no one can sign in with an empty password # Make sure no one can sign in with an empty password
return nil if password.to_s.empty? return nil if password.empty?
user = find_by_login(login) user = find_by_login(login)
if user if user
# user is already in local database # user is already in local database
@@ -164,7 +167,7 @@ class User < Principal
# Returns the user who matches the given autologin +key+ or nil # Returns the user who matches the given autologin +key+ or nil
def self.try_to_autologin(key) def self.try_to_autologin(key)
tokens = Token.find_all_by_action_and_value('autologin', key) tokens = Token.find_all_by_action_and_value('autologin', key.to_s)
# Make sure there's only 1 token that matches the key # Make sure there's only 1 token that matches the key
if tokens.size == 1 if tokens.size == 1
token = tokens.first token = tokens.first
@@ -338,12 +341,12 @@ class User < Principal
end end
def self.find_by_rss_key(key) def self.find_by_rss_key(key)
token = Token.find_by_value(key) token = Token.find_by_action_and_value('feeds', key.to_s)
token && token.user.active? ? token.user : nil token && token.user.active? ? token.user : nil
end end
def self.find_by_api_key(key) def self.find_by_api_key(key)
token = Token.find_by_action_and_value('api', key) token = Token.find_by_action_and_value('api', key.to_s)
token && token.user.active? ? token.user : nil token && token.user.active? ? token.user : nil
end end
+1 -1
View File
@@ -10,7 +10,7 @@
<span> <span>
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file', <%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil, :class => 'file',
:onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%> :onchange => "checkFileSize(this, #{Setting.attachment_max_size.to_i.kilobytes}, '#{escape_javascript(l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)))}');" -%>
<%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :placeholder => l(:label_optional_description) %> <%= text_field_tag 'attachments[1][description]', '', :id => nil, :class => 'description', :maxlength => 255, :placeholder => l(:label_optional_description) %>
<%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %> <%= link_to_function(image_tag('delete.png'), 'removeFileField(this)', :title => (l(:button_delete))) %>
</span> </span>
</span> </span>
+3 -2
View File
@@ -1,8 +1,9 @@
<h2><%= l(:label_revision) %> <%= @diff_format_revisions %> <%=h @path %></h2> <h2><%= l(:label_revision) %> <%= @diff_format_revisions %> <%=h @path %></h2>
<!-- Choose view type --> <!-- Choose view type -->
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %> <% form_tag({:action => 'diff', :id => @project,
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %> :repository_id => @repository.identifier_param,
:path => to_path_param(@path), :rev => @rev}, :method => 'get') do %>
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %> <%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
<p> <p>
<label><%= l(:label_view_diff) %></label> <label><%= l(:label_view_diff) %></label>
+2 -1
View File
@@ -1,7 +1,8 @@
<div class="contextual"> <div class="contextual">
<% form_tag( <% form_tag(
{:action => 'revision', :id => @project, {:action => 'revision', :id => @project,
:repository_id => @repository.identifier_param} :repository_id => @repository.identifier_param},
:method => :get
) do %> ) do %>
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %> <%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
<%= submit_tag 'OK' %> <%= submit_tag 'OK' %>
@@ -21,5 +21,16 @@
<p><%= setting_check_box :rest_api_enabled %></p> <p><%= setting_check_box :rest_api_enabled %></p>
</div> </div>
<fieldset class="box">
<legend><%= l(:label_session_expiration) %></legend>
<div class="tabular settings">
<p><%= setting_select :session_lifetime, [[l(:label_disabled), 0]] + [1, 7, 30, 60, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), (days * 60 * 24).to_s]} %></p>
<p><%= setting_select :session_timeout, [[l(:label_disabled), 0]] + [1, 2, 4, 8, 12, 24, 48].collect{|hours| [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s]} %></p>
</div>
<p><em class="info"><%= l(:text_session_expiration_settings) %></em></p>
</fieldset>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<% end %> <% end %>
+1
View File
@@ -1,6 +1,7 @@
<h2><%= l(:label_spent_time) %></h2> <h2><%= l(:label_spent_time) %></h2>
<% labelled_form_for @time_entry, :url => time_entries_path do |f| %> <% 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} %> <%= render :partial => 'form', :locals => {:f => f} %>
<%= submit_tag l(:button_create) %> <%= submit_tag l(:button_create) %>
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %> <%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
+1
View File
@@ -8,6 +8,7 @@ api.array :versions, api_meta(:total_count => @versions.size) do
api.description version.description api.description version.description
api.status version.status api.status version.status
api.due_date version.effective_date api.due_date version.effective_date
api.sharing version.sharing
render_api_custom_values version.custom_field_values, api render_api_custom_values version.custom_field_values, api
+1
View File
@@ -6,6 +6,7 @@ api.version do
api.description @version.description api.description @version.description
api.status @version.status api.status @version.status
api.due_date @version.effective_date api.due_date @version.effective_date
api.sharing @version.sharing
render_api_custom_values @version.custom_field_values, api render_api_custom_values @version.custom_field_values, api
+71
View File
@@ -85,4 +85,75 @@ module ActionController
end end
end end
end end
# CVE-2012-2660
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/f1203e3376acec0f
# CVE-2012-2694
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/8c82d9df8b401c5e
class Request
protected
# Remove nils from the params hash
def deep_munge(hash)
keys = hash.keys.find_all { |k| hash[k] == [nil] }
keys.each { |k| hash[k] = nil }
hash.each_value do |v|
case v
when Array
v.grep(Hash) { |x| deep_munge(x) }
v.compact!
when Hash
deep_munge(v)
end
end
hash
end
def parse_query(qs)
deep_munge(super)
end
end
end
# Fix for CVE-2013-0155
# https://groups.google.com/d/msg/rubyonrails-security/c7jT-EeN9eI/L0u4e87zYGMJ
# https://groups.google.com/d/msg/rubyonrails-security/kKGNeMrnmiY/r2yM7xy-G48J
# https://github.com/rails/rails/blob/v2.3.15/activerecord/lib/active_record/base.rb#L2340
module ActiveRecord
class Base
class << self
protected
def self.sanitize_sql_hash_for_conditions(attrs, default_table_name = quoted_table_name, top_level = true)
attrs = expand_hash_conditions_for_aggregates(attrs)
return '1 = 2' if !top_level && attrs.is_a?(Hash) && attrs.empty?
conditions = attrs.map do |attr, value|
table_name = default_table_name
if not value.is_a?(Hash)
attr = attr.to_s
# Extract table name from qualified attribute names.
if attr.include?('.') and top_level
attr_table_name, attr = attr.split('.', 2)
attr_table_name = connection.quote_table_name(attr_table_name)
else
attr_table_name = table_name
end
attribute_condition("#{attr_table_name}.#{connection.quote_column_name(attr)}", value)
elsif top_level
sanitize_sql_hash_for_conditions(value, connection.quote_table_name(attr.to_s), false)
else
raise ActiveRecord::StatementInvalid
end
end.join(' AND ')
replace_bind_variables(conditions, expand_range_bind_variables(attrs.values))
end
alias_method :sanitize_sql_hash, :sanitize_sql_hash_for_conditions
end
end
end end
+8
View File
@@ -49,6 +49,9 @@ ar:
about_x_hours: about_x_hours:
one: "حوالي ساعة" one: "حوالي ساعة"
other: "ساعات %{count}حوالي " other: "ساعات %{count}حوالي "
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "يوم" one: "يوم"
other: "%{count} أيام" other: "%{count} أيام"
@@ -1031,3 +1034,8 @@ ar:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -50,6 +50,9 @@ bg:
about_x_hours: about_x_hours:
one: "около 1 час" one: "около 1 час"
other: "около %{count} часа" other: "около %{count} часа"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 ден" one: "1 ден"
other: "%{count} дена" other: "%{count} дена"
@@ -195,6 +198,7 @@ bg:
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
error_unable_to_connect: Невъзможност за свързване с (%{value}) error_unable_to_connect: Невъзможност за свързване с (%{value})
error_attachment_too_big: Този файл не може да бъде качен, понеже надхвърля максималната възможна големина (%{max_size}) error_attachment_too_big: Този файл не може да бъде качен, понеже надхвърля максималната възможна големина (%{max_size})
error_session_expired: Вашата сесия е изтекла. Моля влезете в Redmine отново.
warning_attachments_not_saved: "%{count} файла не бяха записани." warning_attachments_not_saved: "%{count} файла не бяха записани."
mail_subject_lost_password: "Вашата парола (%{value})" mail_subject_lost_password: "Вашата парола (%{value})"
@@ -386,6 +390,8 @@ bg:
setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата setting_default_issue_start_date_to_creation_date: Начална дата на новите задачи по подразбиране да бъде днешната дата
setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище setting_commit_cross_project_ref: Отбелязване и приключване на задачи от други проекти, несвързани с конкретното хранилище
setting_unsubscribe: Потребителите могат да премахват профилите си setting_unsubscribe: Потребителите могат да премахват профилите си
setting_session_lifetime: Максимален живот на сесиите
setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите
permission_add_project: Създаване на проект permission_add_project: Създаване на проект
permission_add_subprojects: Създаване на подпроекти permission_add_subprojects: Създаване на подпроекти
@@ -848,6 +854,7 @@ bg:
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Завършени версии label_completed_versions: Завършени версии
label_search_for_watchers: Търсене на потребители за наблюдатели label_search_for_watchers: Търсене на потребители за наблюдатели
label_session_expiration: Изтичане на сесиите
button_login: Вход button_login: Вход
button_submit: Прикачване button_submit: Прикачване
@@ -983,6 +990,7 @@ bg:
text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени text_issue_conflict_resolution_add_notes: Добавяне на моите коментари и отхвърляне на другите мои промени
text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link} text_issue_conflict_resolution_cancel: Отхвърляне на всички мои промени и презареждане на %{link}
text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване." text_account_destroy_confirmation: "Сигурен/на ли сте, че желаете да продължите?\nВашият профил ще бъде премахнат без възможност за възстановяване."
text_session_expiration_settings: "Внимание: промяната на тези установяваноя може да прекрати всички активни сесии, включително и вашата."
default_role_manager: Мениджър default_role_manager: Мениджър
default_role_developer: Разработчик default_role_developer: Разработчик
+8
View File
@@ -48,6 +48,9 @@ bs:
about_x_hours: about_x_hours:
one: "oko 1 sahat" one: "oko 1 sahat"
other: "oko %{count} sahata" other: "oko %{count} sahata"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dana" other: "%{count} dana"
@@ -1045,3 +1048,8 @@ bs:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -52,6 +52,9 @@ ca:
about_x_hours: about_x_hours:
one: "aproximadament 1 hora" one: "aproximadament 1 hora"
other: "aproximadament %{count} hores" other: "aproximadament %{count} hores"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dia" one: "1 dia"
other: "%{count} dies" other: "%{count} dies"
@@ -1033,3 +1036,8 @@ ca:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -53,6 +53,9 @@ cs:
about_x_hours: about_x_hours:
one: "asi 1 hodina" one: "asi 1 hodina"
other: "asi %{count} hodin" other: "asi %{count} hodin"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 den" one: "1 den"
other: "%{count} dnů" other: "%{count} dnů"
@@ -1034,3 +1037,8 @@ cs:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -51,6 +51,9 @@ da:
about_x_hours: about_x_hours:
one: "cirka en time" one: "cirka en time"
other: "cirka %{count} timer" other: "cirka %{count} timer"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "en dag" one: "en dag"
other: "%{count} dage" other: "%{count} dage"
@@ -1048,3 +1051,8 @@ da:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+11 -3
View File
@@ -52,6 +52,9 @@ de:
about_x_hours: about_x_hours:
one: 'etwa 1 Stunde' one: 'etwa 1 Stunde'
other: 'etwa %{count} Stunden' other: 'etwa %{count} Stunden'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: '1 Tag' one: '1 Tag'
other: '%{count} Tagen' other: '%{count} Tagen'
@@ -1016,8 +1019,8 @@ de:
description_date_from: Startdatum eintragen description_date_from: Startdatum eintragen
description_date_to: Enddatum eintragen description_date_to: Enddatum eintragen
label_parent_revision: Parent label_parent_revision: Vorgänger
label_child_revision: Child label_child_revision: Nachfolger
error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet. error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet.
setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden
button_edit_section: Diesen Bereich bearbeiten button_edit_section: Diesen Bereich bearbeiten
@@ -1036,7 +1039,7 @@ de:
label_copy_attachments: Anhänge Kopieren label_copy_attachments: Anhänge Kopieren
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Abgeschlossene Versionen label_completed_versions: Abgeschlossene Versionen
field_multiple: Mehrer Werte field_multiple: Mehrere Werte
setting_commit_cross_project_ref: Erlauben auf Tickets aller anderen Projekte zu referenzieren setting_commit_cross_project_ref: Erlauben auf Tickets aller anderen Projekte zu referenzieren
text_issue_conflict_resolution_add_notes: Meine Änderungen übernehmen und alle anderen Änderungen verwerfen text_issue_conflict_resolution_add_notes: Meine Änderungen übernehmen und alle anderen Änderungen verwerfen
text_issue_conflict_resolution_overwrite: Meine Änderungen trotzdem übernehmen (vorherige Notizen bleiben erhalten aber manche können überschrieben werden) text_issue_conflict_resolution_overwrite: Meine Änderungen trotzdem übernehmen (vorherige Notizen bleiben erhalten aber manche können überschrieben werden)
@@ -1049,3 +1052,8 @@ de:
setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen
button_delete_my_account: Mein Benutzerkonto löschen button_delete_my_account: Mein Benutzerkonto löschen
text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden. text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden.
error_session_expired: Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.
text_session_expiration_settings: "Achtung: Änderungen können aktuelle Sitzungen beenden, Ihre eingeschlossen!"
setting_session_lifetime: Längste Dauer einer Sitzung
setting_session_timeout: Zeitüberschreitung bei Inaktivität
label_session_expiration: Ende einer Sitzung
+8
View File
@@ -51,6 +51,9 @@ el:
about_x_hours: about_x_hours:
one: "περίπου 1 ώρα" one: "περίπου 1 ώρα"
other: "περίπου %{count} ώρες" other: "περίπου %{count} ώρες"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 ημέρα" one: "1 ημέρα"
other: "%{count} ημέρες" other: "%{count} ημέρες"
@@ -1031,3 +1034,8 @@ el:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -48,6 +48,9 @@ en-GB:
about_x_hours: about_x_hours:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
@@ -1033,3 +1036,8 @@ en-GB:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -49,6 +49,9 @@ en:
about_x_hours: about_x_hours:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
@@ -194,6 +197,7 @@ en:
error_unable_delete_issue_status: 'Unable to delete issue status' error_unable_delete_issue_status: 'Unable to delete issue status'
error_unable_to_connect: "Unable to connect (%{value})" error_unable_to_connect: "Unable to connect (%{value})"
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
error_session_expired: "Your session has expired. Please login again."
warning_attachments_not_saved: "%{count} file(s) could not be saved." warning_attachments_not_saved: "%{count} file(s) could not be saved."
mail_subject_lost_password: "Your %{value} password" mail_subject_lost_password: "Your %{value} password"
@@ -385,6 +389,8 @@ en:
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues 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_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 delete their own account
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
permission_add_project: Create project permission_add_project: Create project
permission_add_subprojects: Create subprojects permission_add_subprojects: Create subprojects
@@ -847,6 +853,7 @@ en:
label_item_position: "%{position} of %{count}" label_item_position: "%{position} of %{count}"
label_completed_versions: Completed versions label_completed_versions: Completed versions
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
label_session_expiration: Session expiration
button_login: Login button_login: Login
button_submit: Submit button_submit: Submit
@@ -982,6 +989,7 @@ en:
text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes" text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}" text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it." text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
default_role_manager: Manager default_role_manager: Manager
default_role_developer: Developer default_role_developer: Developer
+8
View File
@@ -79,6 +79,9 @@ es:
about_x_hours: about_x_hours:
one: "alrededor de 1 hora" one: "alrededor de 1 hora"
other: "alrededor de %{count} horas" other: "alrededor de %{count} horas"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 día" one: "1 día"
other: "%{count} días" other: "%{count} días"
@@ -1068,3 +1071,8 @@ es:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -67,6 +67,9 @@ et:
about_x_hours: about_x_hours:
one: "umbes 1 tund" one: "umbes 1 tund"
other: "umbes %{count} tundi" other: "umbes %{count} tundi"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 päev" one: "1 päev"
other: "%{count} päeva" other: "%{count} päeva"
@@ -1047,3 +1050,8 @@ et:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -52,6 +52,9 @@ eu:
about_x_hours: about_x_hours:
one: "ordu 1 inguru" one: "ordu 1 inguru"
other: "%{count} ordu inguru" other: "%{count} ordu inguru"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "egun 1" one: "egun 1"
other: "%{count} egun" other: "%{count} egun"
@@ -1034,3 +1037,8 @@ eu:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -49,6 +49,9 @@ fa:
about_x_hours: about_x_hours:
one: "نزدیک 1 ساعت" one: "نزدیک 1 ساعت"
other: "نزدیک %{count} ساعت" other: "نزدیک %{count} ساعت"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 روز" one: "1 روز"
other: "%{count} روز" other: "%{count} روز"
@@ -1033,3 +1036,8 @@ fa:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -94,6 +94,9 @@ fi:
about_x_hours: about_x_hours:
one: "noin tunti" one: "noin tunti"
other: "noin %{count} tuntia" other: "noin %{count} tuntia"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "päivä" one: "päivä"
other: "%{count} päivää" other: "%{count} päivää"
@@ -1052,3 +1055,8 @@ fi:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -53,6 +53,9 @@ fr:
about_x_hours: about_x_hours:
one: "environ une heure" one: "environ une heure"
other: "environ %{count} heures" other: "environ %{count} heures"
x_hours:
one: "une heure"
other: "%{count} heures"
x_days: x_days:
one: "un jour" one: "un jour"
other: "%{count} jours" other: "%{count} jours"
@@ -201,6 +204,7 @@ fr:
error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles' error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles'
error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour. error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size}) error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size})
error_session_expired: "Votre session a expiré. Veuillez vous reconnecter."
warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés." warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés."
@@ -381,6 +385,8 @@ fr:
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_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_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 supprimer leur propre compte
setting_session_lifetime: Durée de vie maximale des sessions
setting_session_timeout: Durée maximale d'inactivité
permission_add_project: Créer un projet permission_add_project: Créer un projet
permission_add_subprojects: Créer des sous-projets permission_add_subprojects: Créer des sous-projets
@@ -822,6 +828,7 @@ fr:
label_copy_attachments: Copier les fichiers label_copy_attachments: Copier les fichiers
label_item_position: "%{position} sur %{count}" label_item_position: "%{position} sur %{count}"
label_completed_versions: Versions passées label_completed_versions: Versions passées
label_session_expiration: Expiration des sessions
button_login: Connexion button_login: Connexion
button_submit: Soumettre button_submit: Soumettre
@@ -938,6 +945,7 @@ fr:
text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements" text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}" text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver." text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
default_role_manager: "Manager " default_role_manager: "Manager "
default_role_developer: "Développeur " default_role_developer: "Développeur "
+8
View File
@@ -90,6 +90,9 @@ gl:
about_x_hours: about_x_hours:
one: 'aproximadamente unha hora' one: 'aproximadamente unha hora'
other: '%{count} horas' other: '%{count} horas'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: '1 día' one: '1 día'
other: '%{count} días' other: '%{count} días'
@@ -1042,3 +1045,8 @@ gl:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -55,6 +55,9 @@ he:
about_x_hours: about_x_hours:
one: 'בערך שעה אחת' one: 'בערך שעה אחת'
other: 'בערך %{count} שעות' other: 'בערך %{count} שעות'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: 'יום אחד' one: 'יום אחד'
other: '%{count} ימים' other: '%{count} ימים'
@@ -1036,3 +1039,8 @@ he:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -48,6 +48,9 @@ hr:
about_x_hours: about_x_hours:
one: "oko sat vremena" one: "oko sat vremena"
other: "oko %{count} sati" other: "oko %{count} sati"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dana" other: "%{count} dana"
@@ -1034,3 +1037,8 @@ hr:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -50,6 +50,9 @@
about_x_hours: about_x_hours:
one: 'csaknem 1 órája' one: 'csaknem 1 órája'
other: 'csaknem %{count} órája' other: 'csaknem %{count} órája'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: '1 napja' one: '1 napja'
other: '%{count} napja' other: '%{count} napja'
@@ -1050,3 +1053,8 @@
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -46,6 +46,9 @@ id:
about_x_hours: about_x_hours:
one: "sekitar sejam" one: "sekitar sejam"
other: "sekitar %{count} jam" other: "sekitar %{count} jam"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "sehari" one: "sehari"
other: "%{count} hari" other: "%{count} hari"
@@ -1037,3 +1040,8 @@ id:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -54,6 +54,9 @@ it:
about_x_hours: about_x_hours:
one: "circa un'ora" one: "circa un'ora"
other: "circa %{count} ore" other: "circa %{count} ore"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 giorno" one: "1 giorno"
other: "%{count} giorni" other: "%{count} giorni"
@@ -1032,3 +1035,8 @@ it:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+9 -1
View File
@@ -52,6 +52,9 @@ ja:
about_x_hours: about_x_hours:
one: "約1時間" one: "約1時間"
other: "約%{count}時間" other: "約%{count}時間"
x_hours:
one: "1時間"
other: "%{count}時間"
x_days: x_days:
one: "1日" one: "1日"
other: "%{count}日" other: "%{count}日"
@@ -758,7 +761,7 @@ ja:
label_week: 週 label_week: 週
label_date_from: "日付指定: " label_date_from: "日付指定: "
label_date_to: から label_date_to: から
label_language_based: 既定の言語の設定に従う label_language_based: ユーザの言語の設定に従う
label_sort_by: "並び替え %{value}" label_sort_by: "並び替え %{value}"
label_send_test_email: テストメールを送信 label_send_test_email: テストメールを送信
label_feeds_access_key: RSSアクセスキー label_feeds_access_key: RSSアクセスキー
@@ -1061,3 +1064,8 @@ ja:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
本当にアカウントを削除しますか? 本当にアカウントを削除しますか?
アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。 アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。
error_session_expired: セッションが失効しました。ログインし直してください。
text_session_expiration_settings: "警告: この設定を変更すると現在有効なセッションが失効する可能性があります。"
setting_session_lifetime: 有効期間の最大値
setting_session_timeout: 無操作タイムアウト
label_session_expiration: セッション有効期間
+8
View File
@@ -49,6 +49,9 @@ ko:
about_x_hours: about_x_hours:
one: "약 한시간" one: "약 한시간"
other: "약 %{count}시간" other: "약 %{count}시간"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "하루" one: "하루"
other: "%{count}일" other: "%{count}일"
@@ -1081,3 +1084,8 @@ ko:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -58,6 +58,9 @@ lt:
about_x_hours: about_x_hours:
one: "apie 1 valanda" one: "apie 1 valanda"
other: "apie %{count} valandų" other: "apie %{count} valandų"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 diena" one: "1 diena"
other: "%{count} dienų" other: "%{count} dienų"
@@ -1091,3 +1094,8 @@ lt:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -45,6 +45,9 @@ lv:
about_x_hours: about_x_hours:
one: "aptuveni 1 stunda" one: "aptuveni 1 stunda"
other: "aptuveni %{count} stundas" other: "aptuveni %{count} stundas"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 diena" one: "1 diena"
other: "%{count} dienas" other: "%{count} dienas"
@@ -1025,3 +1028,8 @@ lv:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -49,6 +49,9 @@ mk:
about_x_hours: about_x_hours:
one: "околу 1 час" one: "околу 1 час"
other: "околу %{count} часа" other: "околу %{count} часа"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 ден" one: "1 ден"
other: "%{count} дена" other: "%{count} дена"
@@ -1031,3 +1034,8 @@ mk:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -48,6 +48,9 @@ mn:
about_x_hours: about_x_hours:
one: "1 цаг орчим" one: "1 цаг орчим"
other: "ойролцоогоор %{count} цаг" other: "ойролцоогоор %{count} цаг"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 өдөр" one: "1 өдөр"
other: "%{count} өдөр" other: "%{count} өдөр"
@@ -1031,3 +1034,8 @@ mn:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+33 -22
View File
@@ -48,6 +48,9 @@ nl:
about_x_hours: about_x_hours:
one: "ongeveer 1 uur" one: "ongeveer 1 uur"
other: "ongeveer %{count} uren" other: "ongeveer %{count} uren"
x_hours:
one: "1 uur"
other: "%{count} hours"
x_days: x_days:
one: "1 dag" one: "1 dag"
other: "%{count} dagen" other: "%{count} dagen"
@@ -987,29 +990,37 @@ nl:
description_all_columns: Alle kolommen description_all_columns: Alle kolommen
button_export: Exporteren button_export: Exporteren
label_export_options: "%{export_format} export opties" label_export_options: "%{export_format} export opties"
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) 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: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." notice_failed_to_save_time_entries: "Opslaan gefaald voor %{count} tijdsnotatie(s) van %{total} geselecteerde: %{ids}."
label_x_issues: label_x_issues:
zero: 0 issue zero: 0 incidenten
one: 1 issue one: 1 incidenten
other: "%{count} issues" other: "%{count} incidenten"
label_repository_new: New repository label_repository_new: Nieuw repository
field_repository_is_default: Main repository field_repository_is_default: Hoofd repository
label_copy_attachments: Copy attachments label_copy_attachments: Copieer bijlage(n)
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions label_completed_versions: Versies compleet
field_multiple: Multiple values field_multiple: Meerdere waardes
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Sta toe om incidenten van alle projecten te refereren en oplossen
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes text_issue_conflict_resolution_add_notes: Voeg mijn notities toe en annuleer andere wijzigingen
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) text_issue_conflict_resolution_overwrite: Voeg mijn wijzigingen alsnog toe (voorgaande notities worden bewaard, maar sommige kunnen overschreden worden)
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. notice_issue_update_conflict: Dit incident is reeds geupdate door een andere gebruiker terwijl jij bezig was
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} text_issue_conflict_resolution_cancel: Annuleer mijn wijzigingen en geef pagina opnieuw weer %{link}
permission_manage_related_issues: Manage related issues permission_manage_related_issues: Beheer gerelateerde incidenten
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. label_search_for_watchers: Zoek om monitoorders toe te voegen
setting_unsubscribe: Allow users to delete their own account notice_account_deleted: Uw account is permanent verwijderd
button_delete_my_account: Delete my account setting_unsubscribe: Sta gebruikers toe hun eigen account te verwijderen
button_delete_my_account: Verwijder mijn account
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Weet u zeker dat u door wilt gaan?
Your account will be permanently deleted, with no way to reactivate it. Uw account wordt permanent verwijderd zonder mogelijkheid deze te heractiveren.
error_session_expired: Uw sessie is verlopen. U dient opnieuw in te loggen.
text_session_expiration_settings: "Waarschuwing: door deze instelling te wijzigen kan sessies laten verlopen inclusief de uwe"
setting_session_lifetime: Maximale sessieduur
setting_session_timeout: Sessie inactiviteit timeout
label_session_expiration: Sessie verlopen
+38 -30
View File
@@ -43,6 +43,9 @@
about_x_hours: about_x_hours:
one: "rundt 1 time" one: "rundt 1 time"
other: "rundt %{count} timer" other: "rundt %{count} timer"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dag" one: "1 dag"
other: "%{count} dager" other: "%{count} dager"
@@ -968,56 +971,61 @@
setting_issue_group_assignment: Tillat tildeling av saker til grupper setting_issue_group_assignment: Tillat tildeling av saker til grupper
label_diff: diff label_diff: diff
description_query_sort_criteria_direction: Sort direction description_query_sort_criteria_direction: Sorteringsretning
description_project_scope: Search scope description_project_scope: Search scope
description_filter: Filter description_filter: Filter
description_user_mail_notification: Mail notification settings description_user_mail_notification: Mail notification settings
description_date_from: Enter start date description_date_from: Oppgi startdato
description_message_content: Message content description_message_content: Meldingsinnhold
description_available_columns: Available Columns description_available_columns: Tilgjengelige kolonner
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Velg datointervall ved å spesifisere start- og sluttdato
description_issue_category_reassign: Choose issue category description_issue_category_reassign: Choose issue category
description_search: Searchfield description_search: Søkefelt
description_notes: Notes description_notes: Notes
description_date_range_list: Choose range from list description_date_range_list: Choose range from list
description_choose_project: Projects description_choose_project: Prosjekter
description_date_to: Enter end date description_date_to: Oppgi sluttdato
description_query_sort_criteria_attribute: Sort attribute description_query_sort_criteria_attribute: Sort attribute
description_wiki_subpages_reassign: Choose new parent page description_wiki_subpages_reassign: Velg ny overordnet side
description_selected_columns: Selected Columns description_selected_columns: Valgte kolonner
label_parent_revision: Parent label_parent_revision: Overordnet
label_child_revision: Child label_child_revision: Underordnet
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. 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 setting_default_issue_start_date_to_creation_date: Bruk dagens dato som startdato for nye saker
button_edit_section: Edit this section button_edit_section: Rediger denne seksjonen
setting_repositories_encodings: Attachments and repositories encodings setting_repositories_encodings: Attachments and repositories encodings
description_all_columns: All Columns description_all_columns: Alle kolonnene
button_export: Export button_export: Eksporter
label_export_options: "%{export_format} export options" label_export_options: "%{export_format} eksportvalg"
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) error_attachment_too_big: Filen overstiger maksimum filstørrelse (%{max_size}) og kan derfor ikke lastes opp
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
label_x_issues: label_x_issues:
zero: 0 sak zero: 0 sak
one: 1 sak one: 1 sak
other: "%{count} saker" other: "%{count} saker"
label_repository_new: New repository label_repository_new: Nytt depot
field_repository_is_default: Main repository field_repository_is_default: Hoveddepot
label_copy_attachments: Copy attachments label_copy_attachments: Kopier vedlegg
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions 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. text_project_identifier_info: Kun små bokstaver (a-z), tall, bindestrek (-) og "underscore" (_) er tillatt.<br />Etter lagring er det ikke mulig å gjøre endringer.
field_multiple: Multiple values field_multiple: Flere verdier
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed 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_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) 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. notice_issue_update_conflict: Saken ble oppdatert av en annen bruker mens du redigerte den.
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} text_issue_conflict_resolution_cancel: Forkast alle endringen mine og vis %{link} på nytt
permission_manage_related_issues: Manage related issues permission_manage_related_issues: Manage related issues
field_ldap_filter: LDAP filter field_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted. notice_account_deleted: Din konto er ugjenkallelig slettet.
setting_unsubscribe: Allow users to delete their own account setting_unsubscribe: Tillat brukere å slette sin egen konto
button_delete_my_account: Delete my account button_delete_my_account: Slett kontoen min
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Er du sikker på at du ønsker å fortsette?
Your account will be permanently deleted, with no way to reactivate it. Kontoen din vil bli ugjenkallelig slettet uten mulighet for å reaktiveres igjen.
error_session_expired: Økten har gått ut på tid. Vennligst logg på igjen.
text_session_expiration_settings: "Advarsel: ved å endre disse innstillingene kan aktive økter gå ut på tid, inkludert din egen."
setting_session_lifetime: Øktenes makslengde
setting_session_timeout: Økten er avsluttet på grunn av inaktivitet
label_session_expiration: Økten er avsluttet
+8
View File
@@ -81,6 +81,9 @@ pl:
about_x_hours: about_x_hours:
one: "około godziny" one: "około godziny"
other: "około %{count} godzin" other: "około %{count} godzin"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dzień" one: "1 dzień"
other: "%{count} dni" other: "%{count} dni"
@@ -1048,3 +1051,8 @@ pl:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+12 -4
View File
@@ -18,10 +18,10 @@ pt-BR:
time: time:
formats: formats:
default: "%A, %d de %B de %Y, %H:%M hs" default: "%A, %d de %B de %Y, %H:%M h"
time: "%H:%M hs" time: "%H:%M h"
short: "%d/%m, %H:%M hs" short: "%d/%m, %H:%M h"
long: "%A, %d de %B de %Y, %H:%M hs" long: "%A, %d de %B de %Y, %H:%M h"
only_second: "%S" only_second: "%S"
datetime: datetime:
formats: formats:
@@ -52,6 +52,9 @@ pt-BR:
about_x_hours: about_x_hours:
one: 'aproximadamente 1 hora' one: 'aproximadamente 1 hora'
other: 'aproximadamente %{count} horas' other: 'aproximadamente %{count} horas'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: '1 dia' one: '1 dia'
@@ -1053,3 +1056,8 @@ pt-BR:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -50,6 +50,9 @@ pt:
about_x_hours: about_x_hours:
one: "aproximadamente 1 hora" one: "aproximadamente 1 hora"
other: "aproximadamente %{count} horas" other: "aproximadamente %{count} horas"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dia" one: "1 dia"
other: "%{count} dias" other: "%{count} dias"
@@ -1036,3 +1039,8 @@ pt:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -46,6 +46,9 @@ ro:
about_x_hours: about_x_hours:
one: "aproximativ o oră" one: "aproximativ o oră"
other: "aproximativ %{count} ore" other: "aproximativ %{count} ore"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "o zi" one: "o zi"
other: "%{count} zile" other: "%{count} zile"
@@ -1028,3 +1031,8 @@ ro:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+43 -35
View File
@@ -116,6 +116,9 @@ ru:
few: "около %{count} часов" few: "около %{count} часов"
many: "около %{count} часов" many: "около %{count} часов"
other: "около %{count} часа" other: "около %{count} часа"
x_hours:
one: "1 час"
other: "%{count} часов"
x_days: x_days:
one: "%{count} день" one: "%{count} день"
few: "%{count} дня" few: "%{count} дня"
@@ -1089,11 +1092,11 @@ ru:
notice_issue_successful_create: Задача %{id} создана. notice_issue_successful_create: Задача %{id} создана.
label_between: между label_between: между
setting_issue_group_assignment: Разрешить назначение задач группам пользователей setting_issue_group_assignment: Разрешить назначение задач группам пользователей
label_diff: diff label_diff: Разница(diff)
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Sort direction description_query_sort_criteria_direction: Порядок сортировки
description_project_scope: Search scope description_project_scope: Search scope
description_filter: Filter description_filter: Фильтр
description_user_mail_notification: Mail notification settings description_user_mail_notification: Mail notification settings
description_date_from: Enter start date description_date_from: Enter start date
description_message_content: Message content description_message_content: Message content
@@ -1101,46 +1104,51 @@ ru:
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Choose range by selecting start and end date
description_issue_category_reassign: Choose issue category description_issue_category_reassign: Choose issue category
description_search: Searchfield description_search: Searchfield
description_notes: Notes description_notes: Примечания
description_date_range_list: Choose range from list description_date_range_list: Выберите диапазон из списка
description_choose_project: Projects description_choose_project: Проекты
description_date_to: Enter end date description_date_to: Введите дату выполнения
description_query_sort_criteria_attribute: Sort attribute description_query_sort_criteria_attribute: Критерий сортировки
description_wiki_subpages_reassign: Choose new parent page description_wiki_subpages_reassign: Выбрать новую родительскую страницу
description_selected_columns: Selected Columns description_selected_columns: Выбранные столбцы
label_parent_revision: Parent label_parent_revision: Родительский
label_child_revision: Child label_child_revision: Дочерний
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size. error_scm_annotate_big_text_file: Комментарий невозможен из-за превышения максимального размера текстового файла.
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues setting_default_issue_start_date_to_creation_date: Использовать текущую дату в качестве даты начала для новых задач
button_edit_section: Edit this section button_edit_section: Редактировать эту секцию
setting_repositories_encodings: Attachments and repositories encodings setting_repositories_encodings: Кодировка вложений и хранилищ
description_all_columns: All Columns description_all_columns: Все столбцы
button_export: Export button_export: Экспорт
label_export_options: "%{export_format} export options" label_export_options: "%{export_format} параметры экспорта"
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size}) error_attachment_too_big: Этот файл нельзя загрузить из-за превышения максимального размера файла (%{max_size})
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}." notice_failed_to_save_time_entries: "Невозможно сохранить %{count} затраченное время для %{total} выбранных: %{ids}."
label_x_issues: label_x_issues:
zero: 0 Задач zero: 0 Задач
one: 1 Задача one: 1 Задача
few: "%{count} Задач" few: "%{count} Задач"
many: "%{count} Задач" many: "%{count} Задач"
other: "%{count} Задач" other: "%{count} Задач"
label_repository_new: New repository label_repository_new: Новое хранилище
field_repository_is_default: Main repository field_repository_is_default: Хранилище по умолчанию
label_copy_attachments: Copy attachments label_copy_attachments: Копировать вложения
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions label_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. text_project_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.<br />После сохранения идентификатор изменить нельзя.
field_multiple: Multiple values field_multiple: Множественные значения
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Разрешить ссылаться и исправлять задачи во всех остальных проектах
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes text_issue_conflict_resolution_add_notes: Добавить мои примечания и отказаться от моих изменений
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten) text_issue_conflict_resolution_overwrite: Применить мои изменения (все предыдущие замечания будут сохранены, но некоторые изменения могут быть перезаписаны)
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it. notice_issue_update_conflict: Кто-то изменил задачу, пока вы ее редактировали.
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link} text_issue_conflict_resolution_cancel: Отменить мои изменения и показать задачу заново %{link}
permission_manage_related_issues: Manage related issues permission_manage_related_issues: Управление связанными задачами
field_ldap_filter: LDAP filter field_ldap_filter: Фильтр LDAP
label_search_for_watchers: Search for watchers to add label_search_for_watchers: Найти наблюдателей
notice_account_deleted: "Ваша учетная запись полностью удалена" notice_account_deleted: "Ваша учетная запись полностью удалена"
setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи"
button_delete_my_account: "Удалить мою учетную запись" button_delete_my_account: "Удалить мою учетную запись"
text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?"
error_session_expired: Срок вашей сессии истек. Пожалуйста войдите еще раз
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
setting_session_lifetime: Максимальная продолжительность сессии
setting_session_timeout: Таймут сессии
label_session_expiration: Срок истечения сессии
+8
View File
@@ -48,6 +48,9 @@ sk:
about_x_hours: about_x_hours:
one: "okolo 1 hodiny" one: "okolo 1 hodiny"
other: "okolo %{count} hodín" other: "okolo %{count} hodín"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 deň" one: "1 deň"
other: "%{count} dní" other: "%{count} dní"
@@ -1031,3 +1034,8 @@ sk:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -49,6 +49,9 @@ sl:
about_x_hours: about_x_hours:
one: "okrog 1. ure" one: "okrog 1. ure"
other: "okrog %{count} ur" other: "okrog %{count} ur"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dni" other: "%{count} dni"
@@ -1031,3 +1034,8 @@ sl:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -49,6 +49,9 @@ sq:
about_x_hours: about_x_hours:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
@@ -1027,3 +1030,8 @@ sq:
description_date_range_interval: Choose range by selecting start and end date description_date_range_interval: Choose range by selecting start and end date
description_date_from: Enter start date description_date_from: Enter start date
description_date_to: Enter end date description_date_to: Enter end date
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
+8
View File
@@ -50,6 +50,9 @@ sr-YU:
about_x_hours: about_x_hours:
one: "približno jedan sat" one: "približno jedan sat"
other: "približno %{count} sati" other: "približno %{count} sati"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "jedan dan" one: "jedan dan"
other: "%{count} dana" other: "%{count} dana"
@@ -1031,3 +1034,8 @@ sr-YU:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -50,6 +50,9 @@ sr:
about_x_hours: about_x_hours:
one: "приближно један сат" one: "приближно један сат"
other: "приближно %{count} сати" other: "приближно %{count} сати"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "један дан" one: "један дан"
other: "%{count} дана" other: "%{count} дана"
@@ -1032,3 +1035,8 @@ sr:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -78,6 +78,9 @@ sv:
about_x_hours: about_x_hours:
one: "ungefär en timme" one: "ungefär en timme"
other: "ungefär %{count} timmar" other: "ungefär %{count} timmar"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "en dag" one: "en dag"
other: "%{count} dagar" other: "%{count} dagar"
@@ -1069,3 +1072,8 @@ sv:
description_date_range_interval: Ange intervall genom att välja start- och slutdatum description_date_range_interval: Ange intervall genom att välja start- och slutdatum
description_date_from: Ange startdatum description_date_from: Ange startdatum
description_date_to: Ange slutdatum description_date_to: Ange slutdatum
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
+8
View File
@@ -48,6 +48,9 @@ th:
about_x_hours: about_x_hours:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
@@ -1028,3 +1031,8 @@ th:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -55,6 +55,9 @@ tr:
about_x_hours: about_x_hours:
one: 'yaklaşık 1 saat' one: 'yaklaşık 1 saat'
other: 'yaklaşık %{count} saat' other: 'yaklaşık %{count} saat'
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: '1 gün' one: '1 gün'
other: '%{count} gün' other: '%{count} gün'
@@ -1050,3 +1053,8 @@ tr:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -48,6 +48,9 @@ uk:
about_x_hours: about_x_hours:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
@@ -1026,3 +1029,8 @@ uk:
setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи" setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи"
button_delete_my_account: "Видалити мій обліковий запис" button_delete_my_account: "Видалити мій обліковий запис"
text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?" text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?"
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
+8
View File
@@ -79,6 +79,9 @@ vi:
about_x_hours: about_x_hours:
one: "khoảng 1 giờ" one: "khoảng 1 giờ"
other: "khoảng %{count} giờ" other: "khoảng %{count} giờ"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 ngày" one: "1 ngày"
other: "%{count} ngày" other: "%{count} ngày"
@@ -1082,3 +1085,8 @@ vi:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
Are you sure you want to proceed? Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it. 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
+8
View File
@@ -120,6 +120,9 @@
about_x_hours: about_x_hours:
one: "約 1 小時" one: "約 1 小時"
other: "約 %{count} 小時" other: "約 %{count} 小時"
x_hours:
one: "1 hour"
other: "%{count} hours"
x_days: x_days:
one: "1 天" one: "1 天"
other: "%{count} 天" other: "%{count} 天"
@@ -276,6 +279,7 @@
error_unable_delete_issue_status: '無法刪除問題狀態' error_unable_delete_issue_status: '無法刪除問題狀態'
error_unable_to_connect: "無法連線至(%{value})" error_unable_to_connect: "無法連線至(%{value})"
error_attachment_too_big: "這個檔案無法被上傳,因為它已經超過最大的檔案大小 (%{max_size})" error_attachment_too_big: "這個檔案無法被上傳,因為它已經超過最大的檔案大小 (%{max_size})"
error_session_expired: "您的工作階段已經過期。請重新登入。"
warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。" warning_attachments_not_saved: "%{count} 個附加檔案無法被儲存。"
mail_subject_lost_password: 您的 Redmine 網站密碼 mail_subject_lost_password: 您的 Redmine 網站密碼
@@ -467,6 +471,8 @@
setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期 setting_default_issue_start_date_to_creation_date: 設定新問題的起始日期為今天的日期
setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題 setting_commit_cross_project_ref: 允許關聯並修正其他專案的問題
setting_unsubscribe: 允許用戶取消註冊(刪除帳戶) setting_unsubscribe: 允許用戶取消註冊(刪除帳戶)
setting_session_lifetime: 工作階段存留時間最大值
setting_session_timeout: 工作階段無活動逾時時間
permission_add_project: 建立專案 permission_add_project: 建立專案
permission_add_subprojects: 建立子專案 permission_add_subprojects: 建立子專案
@@ -929,6 +935,7 @@
label_item_position: "%{position} / %{count}" label_item_position: "%{position} / %{count}"
label_completed_versions: 已完成版本 label_completed_versions: 已完成版本
label_search_for_watchers: 搜尋可供加入的監看者 label_search_for_watchers: 搜尋可供加入的監看者
label_session_expiration: 工作階段逾期
button_login: 登入 button_login: 登入
button_submit: 送出 button_submit: 送出
@@ -1066,6 +1073,7 @@
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
您確定要繼續這個動作嗎? 您確定要繼續這個動作嗎?
您的帳戶將會被永久刪除,且無法被重新啟用。 您的帳戶將會被永久刪除,且無法被重新啟用。
text_session_expiration_settings: "警告:變更這些設定將會導致包含您在內的所有工作階段過期。"
default_role_manager: 管理人員 default_role_manager: 管理人員
default_role_developer: 開發人員 default_role_developer: 開發人員
+8
View File
@@ -51,6 +51,9 @@ zh:
about_x_hours: about_x_hours:
one: "大约一小时" one: "大约一小时"
other: "大约 %{count} 小时" other: "大约 %{count} 小时"
x_hours:
one: "1 小时"
other: "%{count} 小时"
x_days: x_days:
one: "一天" one: "一天"
other: "%{count} 天" other: "%{count} 天"
@@ -1033,3 +1036,8 @@ zh:
text_account_destroy_confirmation: |- text_account_destroy_confirmation: |-
确定继续处理? 确定继续处理?
您的账号一旦删除,将无法再次激活使用。 您的账号一旦删除,将无法再次激活使用。
error_session_expired: 您的会话已过期。请重新登陆。
text_session_expiration_settings: "警告: 更改这些设置将会使包括你在内的当前会话失效。"
setting_session_lifetime: 会话最大有效时间
setting_session_timeout: 会话闲置超时
label_session_expiration: 会话过期
+8
View File
@@ -36,6 +36,14 @@ unsubscribe:
password_min_length: password_min_length:
format: int format: int
default: 4 default: 4
# Maximum lifetime of user sessions in minutes
session_lifetime:
format: int
default: 0
# User session timeout in minutes
session_timeout:
format: int
default: 0
attachment_max_size: attachment_max_size:
format: int format: int
default: 5120 default: 5120
+54
View File
@@ -4,6 +4,60 @@ Redmine - project management software
Copyright (C) 2006-2012 Jean-Philippe Lang Copyright (C) 2006-2012 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2013-01-20 v1.4.7
* Patch for Rails vulnerability CVE-2013-0155
== 2013-01-09 v1.4.6
* Upgrade to Rails 2.3.15
* Defect #12409: Git: changesets aren't read after clear_changesets call
* Patch #12605: Norwegian translation for 1.4-stable update
* Patch #12614: Dutch translation
* Patch #12615: Russian translation
* Patch #12630: Russian "x_hours" translation
== 2012-11-17 v1.4.5
* Defect #10818: Running rake in test environment causes exception
* Defect #11192: Make repository identifier accept underscores
* Defect #11298: Issue API may not work on Ruby 1.9 in Redmine 1.4
* Defect #11307: Can't filter for negative numeric custom fields
* Defect #11365: Attachment description length is not validated
* Defect #11541: Version sharing is missing in the REST API
* Defect #11665: New document category is not saved properly
* Defect #11789: Edit section links broken with h5/h6 headings
* Defect #11966: 404 Error when switching mode in view revision differences in non-main repo
* Defect #12189: No tmp/pdf directory
* Defect #12196: "Page not found" on OK button in SCM "View all revisions" page
* Feature #11338: Exclude emails with auto-submitted => auto-generated
* Patch #9732: German translations
* Patch #11261: Simplified Chinese translation for configurable session lifetime and timeout
* Patch #11328: Fix Japanese mistranslation for 'label_language_based'
* Patch #11406: German translation for configurable session lifetime and timeout
* Patch #11448: Russian translation for 1.4-stable and 2.0-stable
* Patch #11600: Fix plural form of the abbreviation for hours in Brazilian Portuguese
== 2012-06-18 v1.4.4
* Defect #10688: PDF export from Wiki - Problems with tables
* Defect #11061: Cannot choose commit versions to view differences in Git/Mercurial repository view
* Defect #11112: REST API - custom fields in POST/PUT ignored for time_entries
* Defect #11133: Wiki-page section edit link can point to incorrect section
* Defect #11160: SQL Error on time report if a custom field has multiple values for an entry
* Defect #11178: Spent time sorted by date-descending order lists same-date entries in physical order
* Defect #11185: Redmine fails to delete a project with parent/child task
* Feature #6597: Configurable session lifetime and timeout
* Patch #11113: Small glitch in German localization
* Fix for Rails vulnerabilities CVE-2012-2694 and CVE-2012-2695
== 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 == 2012-05-13 v1.4.2
* Defect #10744: rake task redmine:email:test broken * Defect #10744: rake task redmine:email:test broken
+9 -2
View File
@@ -366,12 +366,19 @@ sub is_member {
); );
$sthldap->execute($auth_source_id); $sthldap->execute($auth_source_id);
while (my @rowldap = $sthldap->fetchrow_array) { 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( my $ldap = Authen::Simple::LDAP->new(
host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]:$rowldap[1]" : $rowldap[0], host => ($rowldap[2] eq "1" || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]:$rowldap[1]" : $rowldap[0],
port => $rowldap[1], port => $rowldap[1],
basedn => $rowldap[5], basedn => $rowldap[5],
binddn => $rowldap[3] ? $rowldap[3] : "", binddn => $bind_as,
bindpw => $rowldap[4] ? $rowldap[4] : "", bindpw => $bind_pw,
filter => "(".$rowldap[6]."=%s)" filter => "(".$rowldap[6]."=%s)"
); );
my $method = $r->method; my $method = $r->method;
+1
View File
@@ -3,6 +3,7 @@
require 'optparse' require 'optparse'
require 'find' require 'find'
require 'etc' require 'etc'
require 'rubygems'
Version = "1.4" Version = "1.4"
SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem ) SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
+3 -3
View File
@@ -138,21 +138,21 @@ module Redmine
# Add list and boolean custom fields as available criteria # Add list and boolean custom fields as available criteria
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields) custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf| custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id ORDER BY c.value LIMIT 1)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end if @project end if @project
# Add list and boolean time entry custom fields # Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id ORDER BY c.value LIMIT 1)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end end
# Add list and boolean time entry activity custom fields # Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf| TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)", @available_criteria["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id ORDER BY c.value LIMIT 1)",
:format => cf.field_format, :format => cf.field_format,
:label => cf.name} :label => cf.name}
end end
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 1 MAJOR = 1
MINOR = 4 MINOR = 4
TINY = 2 TINY = 7
# Branch values: # Branch values:
# * official release: nil # * official release: nil
+1 -1
View File
@@ -29,7 +29,7 @@ module Redmine
end end
def method_missing(sym, *args, &block) def method_missing(sym, *args, &block)
if args.size == 1 && args.first.is_a?(Time) if args.size == 1 && args.first.is_a?(::Time)
__send__ sym, args.first.xmlschema, &block __send__ sym, args.first.xmlschema, &block
else else
super super
@@ -69,7 +69,7 @@ module Redmine
l = 1 l = 1
started = false started = false
ended = false ended = false
text.scan(/(((?:.*?)(\A|\r?\n\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level| text.scan(/(((?:.*?)(\A|\r?\n\s*\r?\n))(h(\d+)(#{A}#{C})\.(?::(\S+))? (.*?)$)|.*)/m).each do |all, content, lf, heading, level|
if heading.nil? if heading.nil?
if ended if ended
after << all after << all
+1 -1
View File
@@ -4,7 +4,7 @@ table.revision-info td {
padding: 0px; padding: 0px;
} }
div.revision-graph { position: absolute; } div.revision-graph { position: absolute; min-width: 1px; }
div.changeset-changes ul { margin: 0; padding: 0; } div.changeset-changes ul { margin: 0; padding: 0; }
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; } div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
+4
View File
@@ -4,16 +4,19 @@ enumerations_001:
id: 1 id: 1
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 1
enumerations_002: enumerations_002:
name: User documentation name: User documentation
id: 2 id: 2
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 2
enumerations_003: enumerations_003:
name: Technical documentation name: Technical documentation
id: 3 id: 3
type: DocumentCategory type: DocumentCategory
active: true active: true
position: 3
enumerations_004: enumerations_004:
name: Low name: Low
id: 4 id: 4
@@ -92,3 +95,4 @@ enumerations_016:
id: 16 id: 16
type: DocumentCategory type: DocumentCategory
active: false active: false
position: 4
@@ -96,8 +96,13 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_save_diff_type def test_save_diff_type
@request.session[:user_id] = 1 # admin user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1) user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin
get :show, :id => 5 get :show, :id => 5
assert_response :success assert_response :success
assert_template 'diff' assert_template 'diff'
+23 -4
View File
@@ -18,7 +18,9 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class DocumentsControllerTest < ActionController::TestCase class DocumentsControllerTest < ActionController::TestCase
fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :documents, :enumerations fixtures :projects, :users, :roles, :members, :member_roles,
:enabled_modules, :documents, :enumerations,
:groups_users, :attachments
def setup def setup
User.current = nil User.current = nil
@@ -95,16 +97,16 @@ LOREM
def test_create_with_one_attachment def test_create_with_one_attachment
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'document_added'
@request.session[:user_id] = 2 @request.session[:user_id] = 2
set_tmp_attachments_directory set_tmp_attachments_directory
post :create, :project_id => 'ecookbook', with_settings :notified_events => %w(document_added) do
post :create, :project_id => 'ecookbook',
:document => { :title => 'DocumentsControllerTest#test_post_new', :document => { :title => 'DocumentsControllerTest#test_post_new',
:description => 'This is a new document', :description => 'This is a new document',
:category_id => 2}, :category_id => 2},
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
end
assert_redirected_to '/projects/ecookbook/documents' assert_redirected_to '/projects/ecookbook/documents'
document = Document.find_by_title('DocumentsControllerTest#test_post_new') document = Document.find_by_title('DocumentsControllerTest#test_post_new')
@@ -124,6 +126,23 @@ LOREM
assert_template 'new' assert_template 'new'
end end
def test_create_non_default_category
@request.session[:user_id] = 2
category2 = Enumeration.find_by_name('User documentation')
category2.update_attributes(:is_default => true)
category1 = Enumeration.find_by_name('Uncategorized')
post :create,
:project_id => 'ecookbook',
:document => { :title => 'no default',
:description => 'This is a new document',
:category_id => category1.id }
assert_redirected_to '/projects/ecookbook/documents'
doc = Document.find_by_title('no default')
assert_not_nil doc
assert_equal category1.id, doc.category_id
assert_equal category1, doc.category
end
def test_edit def test_edit
@request.session[:user_id] = 2 @request.session[:user_id] = 2
get :edit, :id => 1 get :edit, :id => 1
+6 -6
View File
@@ -58,13 +58,14 @@ class FilesControllerTest < ActionController::TestCase
def test_create_file def test_create_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
assert_difference 'Attachment.count' do with_settings :notified_events => %w(file_added) do
post :create, :project_id => 1, :version_id => '', assert_difference 'Attachment.count' do
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} post :create, :project_id => 1, :version_id => '',
assert_response :redirect :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
assert_response :redirect
end
end end
assert_redirected_to '/projects/ecookbook/files' assert_redirected_to '/projects/ecookbook/files'
a = Attachment.find(:first, :order => 'created_on DESC') a = Attachment.find(:first, :order => 'created_on DESC')
@@ -80,7 +81,6 @@ class FilesControllerTest < ActionController::TestCase
def test_create_version_file def test_create_version_file
set_tmp_attachments_directory set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
Setting.notified_events = ['file_added']
assert_difference 'Attachment.count' do assert_difference 'Attachment.count' do
post :create, :project_id => 1, :version_id => '2', post :create, :project_id => 1, :version_id => '2',
@@ -1305,6 +1305,7 @@ class IssuesControllerTest < ActionController::TestCase
:tag => 'input', :tag => 'input',
:attributes => {:type => 'file', :name => 'attachments[1][file]'} :attributes => {:type => 'file', :name => 'attachments[1][file]'}
} }
assert_select 'input[name=?][maxlength=255]', 'attachments[1][description]'
end end
def test_get_new_should_prefill_the_form_from_params def test_get_new_should_prefill_the_form_from_params
+3 -2
View File
@@ -91,11 +91,12 @@ class MessagesControllerTest < ActionController::TestCase
def test_post_new def test_post_new
@request.session[:user_id] = 2 @request.session[:user_id] = 2
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events = ['message_posted']
post :new, :board_id => 1, with_settings :notified_events => %w(message_posted) do
post :new, :board_id => 1,
:message => { :subject => 'Test created message', :message => { :subject => 'Test created message',
:content => 'Message body'} :content => 'Message body'}
end
message = Message.find_by_subject('Test created message') message = Message.find_by_subject('Test created message')
assert_not_nil message assert_not_nil message
assert_redirected_to "/boards/1/topics/#{message.to_param}" assert_redirected_to "/boards/1/topics/#{message.to_param}"
+4 -3
View File
@@ -82,12 +82,13 @@ class NewsControllerTest < ActionController::TestCase
def test_post_create def test_post_create
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
Setting.notified_events << 'news_added'
@request.session[:user_id] = 2 @request.session[:user_id] = 2
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
with_settings :notified_events => %w(news_added) do
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
:description => 'This is the description', :description => 'This is the description',
:summary => '' } :summary => '' }
end
assert_redirected_to '/projects/ecookbook/news' assert_redirected_to '/projects/ecookbook/news'
news = News.find_by_title('NewsControllerTest') news = News.find_by_title('NewsControllerTest')
@@ -53,11 +53,48 @@ class RepositoriesGitControllerTest < ActionController::TestCase
if @char_1.respond_to?(:force_encoding) if @char_1.respond_to?(:force_encoding)
@char_1.force_encoding('UTF-8') @char_1.force_encoding('UTF-8')
end end
end
Setting.default_language = 'en' def test_create_and_update
@request.session[:user_id] = 1
assert_difference 'Repository.count' do
post :create, :project_id => 'subproject1',
:repository_scm => 'Git',
:repository => {
:url => '/test',
:is_default => '0',
:identifier => 'test-create',
:extra_report_last_commit => '1',
}
end
assert_response 302
repository = Repository.first(:order => 'id DESC')
assert_kind_of Repository::Git, repository
assert_equal '/test', repository.url
assert_equal true, repository.extra_report_last_commit
put :update, :id => repository.id,
:repository => {
:extra_report_last_commit => '0',
:identifier => 'test-update',
}
assert_response 302
repo2 = Repository.find(repository.id)
assert_equal 'test-update', repo2.identifier
assert_equal false, repo2.extra_report_last_commit
end end
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
## Ruby uses ANSI api to fork a process on Windows.
## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
## and these are incompatible with ASCII.
## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
## http://code.google.com/p/msysgit/issues/detail?id=80
## So, Latin-1 path tests fail on Japanese Windows
WINDOWS_PASS = (Redmine::Platform.mswin? &&
Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
def test_get_new def test_get_new
@request.session[:user_id] = 1 @request.session[:user_id] = 1
@project.repository.destroy @project.repository.destroy
@@ -185,6 +222,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
def test_entry_show_latin_1 def test_entry_show_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
elsif WINDOWS_PASS
puts WINDOWS_SKIP_STR
elsif JRUBY_SKIP elsif JRUBY_SKIP
puts JRUBY_SKIP_STR puts JRUBY_SKIP_STR
else else
@@ -224,6 +263,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
def test_diff def test_diff
assert_equal true, @repository.is_default
assert_nil @repository.identifier
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
@project.reload @project.reload
@@ -246,26 +287,55 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
end end
def test_diff_with_rev_and_path
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
with_settings :diff_max_lines_displayed => 1000 do
# Full diff of changeset 2f9c0091
['inline', 'sbs'].each do |dt|
get :diff,
:id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:type => dt
assert_response :success
assert_template 'diff'
# Line 22 removed
assert_tag :tag => 'th',
:content => '22',
:sibling => { :tag => 'td',
:attributes => { :class => /diff_out/ },
:content => /def remove/ }
assert_tag :tag => 'h2', :content => /2f9c0091/
end
end
end
def test_diff_truncated def test_diff_truncated
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
@project.reload @project.reload
assert_equal NUM_REV, @repository.changesets.count assert_equal NUM_REV, @repository.changesets.count
Setting.diff_max_lines_displayed = 5
# Truncated diff of changeset 2f9c0091 with_settings :diff_max_lines_displayed => 5 do
with_cache do # Truncated diff of changeset 2f9c0091
get :diff, :id => PRJ_ID, :type => 'inline', with_cache do
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' with_settings :default_language => 'en' do
assert_response :success get :diff, :id => PRJ_ID, :type => 'inline',
assert @response.body.include?("... This diff was truncated") :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success
Setting.default_language = 'fr' assert @response.body.include?("... This diff was truncated")
get :diff, :id => PRJ_ID, :type => 'inline', end
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' with_settings :default_language => 'fr' do
assert_response :success get :diff, :id => PRJ_ID, :type => 'inline',
assert ! @response.body.include?("... This diff was truncated") :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert @response.body.include?("... Ce diff") assert_response :success
assert ! @response.body.include?("... This diff was truncated")
assert @response.body.include?("... Ce diff")
end
end
end end
end end
@@ -285,9 +355,55 @@ class RepositoriesGitControllerTest < ActionController::TestCase
diff = assigns(:diff) diff = assigns(:diff)
assert_not_nil diff assert_not_nil diff
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/ assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/revisions/" +
"61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
end end
end end
def test_diff_path_in_subrepo
repo = Repository::Git.create(
:project => @project,
:url => REPOSITORY_PATH,
:identifier => 'test-diff-path',
:path_encoding => 'ISO-8859-1'
);
assert repo
assert_equal false, repo.is_default
assert_equal 'test-diff-path', repo.identifier
get :diff,
:id => PRJ_ID,
:repository_id => 'test-diff-path',
:rev => '61b685fbe55ab05b',
:rev_to => '2f9c0091c754a91a',
:type => 'inline'
assert_response :success
assert_template 'diff'
diff = assigns(:diff)
assert_not_nil diff
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/test-diff-path/" +
"revisions/61b685fbe55ab05b/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91a'
}
end
def test_diff_latin_1 def test_diff_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
@@ -319,8 +435,13 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
def test_save_diff_type def test_save_diff_type
@request.session[:user_id] = 1 # admin user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1) user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin
get :diff, get :diff,
:id => PRJ_ID, :id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
@@ -406,6 +527,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
def test_annotate_latin_1 def test_annotate_latin_1
if @ruby19_non_utf8_pass if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass() puts_ruby19_non_utf8_pass()
elsif WINDOWS_PASS
puts WINDOWS_SKIP_STR
elsif JRUBY_SKIP elsif JRUBY_SKIP
puts JRUBY_SKIP_STR puts JRUBY_SKIP_STR
else else
@@ -424,6 +547,21 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end end
end end
def test_revisions
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
get :revisions, :id => PRJ_ID
assert_response :success
assert_template 'revisions'
assert_tag :tag => 'form',
:attributes => {
:method => 'get',
:action => '/projects/subproject1/repository/revision'
}
end
def test_revision def test_revision
assert_equal 0, @repository.changesets.count assert_equal 0, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
+113
View File
@@ -0,0 +1,113 @@
# Redmine - project management software
# Copyright (C) 2006-2012 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 SessionStartTest < ActionController::TestCase
tests AccountController
def test_login_should_set_session_timestamps
post :login, :username => 'jsmith', :password => 'jsmith'
assert_response 302
assert_equal 2, session[:user_id]
assert_not_nil session[:ctime]
assert_not_nil session[:atime]
end
end
class SessionsTest < ActionController::TestCase
tests WelcomeController
def test_atime_from_user_session_should_be_updated
created = 2.hours.ago.utc.to_i
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
assert_response :success
assert_equal created, session[:ctime]
assert_not_equal created, session[:atime]
assert session[:atime] > created
end
def test_user_session_should_not_be_reset_if_lifetime_and_timeout_disabled
with_settings :session_lifetime => '0', :session_timeout => '0' do
get :index, {}, {:user_id => 2}
assert_response :success
end
end
def test_user_session_without_ctime_should_be_reset_if_lifetime_enabled
with_settings :session_lifetime => '720' do
get :index, {}, {:user_id => 2}
assert_redirected_to '/login'
end
end
def test_user_session_with_expired_ctime_should_be_reset_if_lifetime_enabled
with_settings :session_timeout => '720' do
get :index, {}, {:user_id => 2, :atime => 2.days.ago.utc.to_i}
assert_redirected_to '/login'
end
end
def test_user_session_with_valid_ctime_should_not_be_reset_if_lifetime_enabled
with_settings :session_timeout => '720' do
get :index, {}, {:user_id => 2, :atime => 3.hours.ago.utc.to_i}
assert_response :success
end
end
def test_user_session_without_atime_should_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2}
assert_redirected_to '/login'
end
end
def test_user_session_with_expired_atime_should_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2, :atime => 4.hours.ago.utc.to_i}
assert_redirected_to '/login'
end
end
def test_user_session_with_valid_atime_should_not_be_reset_if_timeout_enabled
with_settings :session_timeout => '60' do
get :index, {}, {:user_id => 2, :atime => 10.minutes.ago.utc.to_i}
assert_response :success
end
end
def test_expired_user_session_should_be_restarted_if_autologin
with_settings :session_lifetime => '720', :session_timeout => '60', :autologin => 7 do
token = Token.create!(:user_id => 2, :action => 'autologin', :created_on => 1.day.ago)
@request.cookies['autologin'] = token.value
created = 2.hours.ago.utc.to_i
get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
assert_equal 2, session[:user_id]
assert_response :success
assert_not_equal created, session[:ctime]
assert session[:ctime] >= created
end
end
def test_anonymous_session_should_not_be_reset
with_settings :session_lifetime => '720', :session_timeout => '60' do
get :index
assert_response :success
end
end
end
@@ -57,6 +57,7 @@ class SettingsControllerTest < ActionController::TestCase
assert !Setting.bcc_recipients? assert !Setting.bcc_recipients?
assert_equal %w(issue_added issue_updated news_added), Setting.notified_events assert_equal %w(issue_added issue_updated news_added), Setting.notified_events
assert_equal 'Test footer', Setting.emails_footer assert_equal 'Test footer', Setting.emails_footer
Setting.clear_cache
end end
def test_get_plugin_settings def test_get_plugin_settings
+4
View File
@@ -33,6 +33,10 @@ class SysControllerTest < ActionController::TestCase
Setting.enabled_scm = %w(Subversion Git) Setting.enabled_scm = %w(Subversion Git)
end end
def teardown
Setting.clear_cache
end
def test_projects_with_repository_enabled def test_projects_with_repository_enabled
get :projects get :projects
assert_response :success assert_response :success
@@ -80,6 +80,16 @@ class TimeEntryReportsControllerTest < ActionController::TestCase
assert_equal "162.90", "%.2f" % assigns(:report).total_hours assert_equal "162.90", "%.2f" % assigns(:report).total_hours
end end
def test_report_custom_field_criteria_with_multiple_values
field = TimeEntryCustomField.create!(:name => 'multi', :field_format => 'list', :possible_values => ['value1', 'value2'])
entry = TimeEntry.create!(:project => Project.find(1), :hours => 1, :activity_id => 10, :user => User.find(2), :spent_on => Date.today)
CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value1')
CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value2')
get :report, :project_id => 1, :columns => 'day', :criteria => ["cf_#{field.id}"]
assert_response :success
end
def test_report_one_day def test_report_one_day
get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["member", "activity"] get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["member", "activity"]
assert_response :success assert_response :success
+30 -3
View File
@@ -44,6 +44,7 @@ class TimelogControllerTest < ActionController::TestCase
# Default activity selected # Default activity selected
assert_tag :tag => 'option', :attributes => { :selected => 'selected' }, assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
:content => 'Development' :content => 'Development'
assert_select 'input[name=project_id][value=1]'
end end
def test_get_new_should_only_show_active_time_entry_activities def test_get_new_should_only_show_active_time_entry_activities
@@ -61,6 +62,18 @@ class TimelogControllerTest < ActionController::TestCase
assert_response :success assert_response :success
assert_template 'new' assert_template 'new'
assert_tag 'select', :attributes => {:name => 'time_entry[project_id]'} 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 end
def test_new_without_project_should_deny_without_permission def test_new_without_project_should_deny_without_permission
@@ -144,7 +157,7 @@ class TimelogControllerTest < ActionController::TestCase
:spent_on => '2008-03-14', :spent_on => '2008-03-14',
:hours => '7.3'}, :hours => '7.3'},
:continue => '1' :continue => '1'
assert_redirected_to '/projects/ecookbook/time_entries/new' assert_redirected_to '/projects/ecookbook/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D='
end end
def test_create_and_continue_with_issue_id def test_create_and_continue_with_issue_id
@@ -155,7 +168,7 @@ class TimelogControllerTest < ActionController::TestCase
:spent_on => '2008-03-14', :spent_on => '2008-03-14',
:hours => '7.3'}, :hours => '7.3'},
:continue => '1' :continue => '1'
assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new' assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=1'
end end
def test_create_and_continue_without_project def test_create_and_continue_without_project
@@ -167,7 +180,7 @@ class TimelogControllerTest < ActionController::TestCase
:hours => '7.3'}, :hours => '7.3'},
:continue => '1' :continue => '1'
assert_redirected_to '/time_entries/new' assert_redirected_to '/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=&time_entry%5Bproject_id%5D=1'
end end
def test_create_without_log_time_permission_should_be_denied def test_create_without_log_time_permission_should_be_denied
@@ -537,6 +550,20 @@ class TimelogControllerTest < ActionController::TestCase
:attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'} :attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'}
end end
def test_index_should_sort_by_spent_on_and_created_on
t1 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:00:00', :activity_id => 10)
t2 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:05:00', :activity_id => 10)
t3 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-15', :created_on => '2012-06-16 20:10:00', :activity_id => 10)
get :index, :project_id => 1, :from => '2012-06-15', :to => '2012-06-16'
assert_response :success
assert_equal [t2, t1, t3], assigns(:entries)
get :index, :project_id => 1, :from => '2012-06-15', :to => '2012-06-16', :sort => 'spent_on'
assert_response :success
assert_equal [t3, t1, t2], assigns(:entries)
end
def test_index_atom_feed def test_index_atom_feed
get :index, :project_id => 1, :format => 'atom' get :index, :project_id => 1, :format => 'atom'
assert_response :success assert_response :success
+1
View File
@@ -25,6 +25,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest
:member_roles, :member_roles,
:issues, :issues,
:issue_statuses, :issue_statuses,
:issue_relations,
:versions, :versions,
:trackers, :trackers,
:projects_trackers, :projects_trackers,
@@ -79,6 +79,21 @@ class ApiTest::TimeEntriesTest < ActionController::IntegrationTest
assert_equal 3.5, entry.hours assert_equal 3.5, entry.hours
assert_equal TimeEntryActivity.find(11), entry.activity assert_equal TimeEntryActivity.find(11), entry.activity
end 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 end
context "with project_id" do context "with project_id" do
+5 -9
View File
@@ -103,15 +103,11 @@ class ApiTest::VersionsTest < ActionController::IntegrationTest
assert_response :success assert_response :success
assert_equal 'application/xml', @response.content_type assert_equal 'application/xml', @response.content_type
assert_tag 'version', assert_select 'version' do
:child => { assert_select 'id', :text => '2'
:tag => 'id', assert_select 'name', :text => '1.0'
:content => '2', assert_select 'sharing', :text => 'none'
:sibling => { end
:tag => 'name',
:content => '1.0'
}
}
end end
end end
+6
View File
@@ -75,6 +75,12 @@ class AttachmentTest < ActiveSupport::TestCase
end end
end end
def test_description_length_should_be_validated
a = Attachment.new(:description => 'a' * 300)
assert !a.save
assert_not_nil a.errors[:description]
end
def test_destroy def test_destroy
a = Attachment.new(:container => Issue.find(1), a = Attachment.new(:container => Issue.find(1),
:file => uploaded_test_file("testfile.txt", "text/plain"), :file => uploaded_test_file("testfile.txt", "text/plain"),
+2 -1
View File
@@ -179,7 +179,8 @@ class ChangesetTest < ActiveSupport::TestCase
end end
def test_commit_closing_a_subproject_issue def test_commit_closing_a_subproject_issue
with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes' do with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes',
:default_language => 'en' do
issue = Issue.find(5) issue = Issue.find(5)
assert !issue.closed? assert !issue.closed?
assert_difference 'Journal.count' do assert_difference 'Journal.count' do
+4 -3
View File
@@ -33,11 +33,12 @@ class CommentTest < ActiveSupport::TestCase
end end
def test_create_should_send_notification def test_create_should_send_notification
Setting.notified_events << 'news_comment_added'
Watcher.create!(:watchable => @news, :user => @jsmith) Watcher.create!(:watchable => @news, :user => @jsmith)
assert_difference 'ActionMailer::Base.deliveries.size' do with_settings :notified_events => %w(news_comment_added) do
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment") assert_difference 'ActionMailer::Base.deliveries.size' do
Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment")
end
end end
end end
+12
View File
@@ -32,4 +32,16 @@ class DocumentCategoryTest < ActiveSupport::TestCase
def test_option_name def test_option_name
assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name
end end
def test_default
assert_nil DocumentCategory.find(:first, :conditions => { :is_default => true })
e = Enumeration.find_by_name('Technical documentation')
e.update_attributes(:is_default => true)
assert_equal 3, DocumentCategory.default.id
end
def test_force_default
assert_nil DocumentCategory.find(:first, :conditions => { :is_default => true })
assert_equal 1, DocumentCategory.default.id
end
end end

Some files were not shown because too many files have changed in this diff Show More