Compare commits

..
98 Commits
Author SHA1 Message Date
Jean-Philippe Lang 7e6d1b6c35 Version set to 1.2.3.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8178 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-10 14:49:48 +00:00
Jean-Philippe Lang 5c4b618bce CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8177 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-10 14:49:10 +00:00
Jean-Philippe Lang 2f87b3bae3 Merged r7920, r7921, r7922 and r7924 from trunk (#9405).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8158 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-10 12:04:47 +00:00
Jean-Philippe Lang 1848fcd91e Merged r8103 from trunk (#9737).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8157 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-10 11:56:13 +00:00
Jean-Philippe Lang 40a14cafbc Merged r7809 from trunk (#9567).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8120 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:58:58 +00:00
Jean-Philippe Lang f252108f30 Merged r7834 from trunk (#9566).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8119 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:57:55 +00:00
Jean-Philippe Lang 6d57380712 Merged r7780 from trunk (#9552).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8118 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:56:49 +00:00
Jean-Philippe Lang 00d1b230e0 Merged r7814 from trunk (#9577).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:54:05 +00:00
Jean-Philippe Lang d19a0b70e0 Merged r7971 from trunk (#9682).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:52:31 +00:00
Jean-Philippe Lang 535b5ccf2b Merged r7919 from trunk (#9448).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 21:49:52 +00:00
Toshi MARUYAMA a441667b8d Merged r8106 from trunk
remove trailing white-spaces from calendar-hr.js

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8108 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 01:21:54 +00:00
Toshi MARUYAMA d4246334e0 Merged r8105 from trunk
convert calendar-hr.js (Croatian) from Windows-1250 to UTF-8.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-07 01:21:06 +00:00
Toshi MARUYAMA c8c48a7816 Merged r8002 from trunk
Bulgarian translation updated by Ivan Cenov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-12-04 22:36:12 +00:00
Jean-Philippe Lang fa894328bb Merged r7983 and r7984 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@8000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:17:41 +00:00
Jean-Philippe Lang 63e2e52dd3 Merged r7782 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:14:24 +00:00
Jean-Philippe Lang ff75a959e0 Merged r7779 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:12:58 +00:00
Jean-Philippe Lang 5d1388db02 Merged r7985 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7997 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:11:54 +00:00
Jean-Philippe Lang 3e4d1fb04f Backported r7982 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7996 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:10:45 +00:00
Jean-Philippe Lang 2858979b69 Merged r7956 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7995 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-29 21:08:06 +00:00
Etienne Massip be09ba039b Merged r7837 from trunk (#9597).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7838 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-18 22:30:32 +00:00
Toshi MARUYAMA a5adecb40c Merge r7797 from trunk
Simplified Chinese "text_git_repository_note" translation updated by Steven Wong.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7801 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-13 06:38:41 +00:00
Toshi MARUYAMA f328373ffd Merge r7796 from trunk
Simplified Chinese translation for 1.2.2 updated by Steven Wong.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-13 06:38:08 +00:00
Toshi MARUYAMA 367ad46911 Merge r7795 from trunk
Simplified Chinese translation changed by Steven Wong.

* field_due_date
* permission_rename_wiki_pages
* button_rename

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7799 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-13 06:37:33 +00:00
Toshi MARUYAMA 909cb9ab78 Merge r6699 from trunk
remove trailing white-spaces from config/locales/zh.yml

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7793 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-13 03:46:53 +00:00
Toshi MARUYAMA 8c2869f521 Merge r6698 from trunk
Ruby 1.9: fix parsing error of zh.yml with psych yaml library

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7792 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-13 03:46:05 +00:00
Jean-Philippe Lang 20e54f46b0 Merged r7776 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7777 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 12:53:35 +00:00
Jean-Philippe Lang 88e918f64d Merged r7774 from trunk (#8615).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7775 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 12:44:13 +00:00
Jean-Philippe Lang b6f0d9da8a Merged r7772 from trunk (#8615).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 12:33:15 +00:00
Jean-Philippe Lang d6bf26ace7 Merged r6308 from trunk (#8884).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:44:10 +00:00
Jean-Philippe Lang 21910aa428 Merged r6311 from trunk (#8880).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:40:56 +00:00
Jean-Philippe Lang f22ff1f1c2 Merged r6298 from trunk (#8865).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:37:55 +00:00
Jean-Philippe Lang 83a2283b7d Merged r6300 and r6302 from trunk (#8836).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:36:52 +00:00
Jean-Philippe Lang 03b2162e6c Merged r6324 and r6325 from trunk (#8651).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:35:03 +00:00
Jean-Philippe Lang c605477da5 Merged r6314 from trunk (#8633).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7765 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-11 11:31:49 +00:00
Toshi MARUYAMA 35ec8e3570 Merged r7731 from trunk
Spanish translation updated by Ismael G Marin C.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-05 06:57:52 +00:00
Toshi MARUYAMA 6e68bf8ab4 merge r7707 from trunk
add unit test of escaping image urls

Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7709 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-02 07:41:12 +00:00
Toshi MARUYAMA d181a2221a merge r6759 from trunk
remove trailing white-spaces from test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7708 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-11-02 07:40:49 +00:00
Toshi MARUYAMA e4034bc74b backed out previous 1.2-stable dummy commit
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7703 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-30 03:29:14 +00:00
Toshi MARUYAMA 310d4c52ce dummy commit to run test on CI server
Tests fail on CI Server, but I don't know the reason.
http://www.redmine.org/builds/build_1.2-stable-1.8.7-sqlite3_82.html

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7702 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-30 03:28:46 +00:00
Toshi MARUYAMA 1d1b3fc77d Merged r7699 from trunk
Dutch translation updated by Pieter Nicolai

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7700 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-30 00:05:29 +00:00
Toshi MARUYAMA 5e58434567 Merged r7660 from trunk
scm: git: fix typo of comments about fetching revisions

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7661 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-27 01:37:09 +00:00
Toshi MARUYAMA 8da22803be Merged r7658 from trunk
scm: git: recovery and improve comments of fetching from 1.1
about harmful influence that git does not have the revision number.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-27 00:41:37 +00:00
Toshi MARUYAMA 83ab216d70 Merged r7650 from trunk
scm: mercurial: drop supporting below Mercurial 1.1

On November 1st 2011, Mercurial 2.0 will be released.

On Mercurial 1.1.2, unit lib test fails with following error.

<pre>
Traceback (most recent call last):
  File "/WEB-DOWN/hg-repo/hg-crew/hg", line 20, in <module>
    mercurial.dispatch.run()
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 20, in run
    sys.exit(dispatch(sys.argv[1:]))
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 29, in dispatch
    return _runcatch(u, args)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 45, in _runcatch
    return _dispatch(ui, args)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 367, in _dispatch
    ret = _runcommand(ui, options, cmd, d)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 416, in _runcommand
    return checkargs()
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 376, in checkargs
    return cmdfunc()
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 361, in <lambda>
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/util.py", line 715, in check
    return func(*args, **kwargs)
  File "/REDMINE-1/hg-workdir/redmine-bb-all/lib/redmine/scm/adapters/mercurial/redminehelper.py", line 149, in rhlog
    if hg.util.version() >= '1.6':
AttributeError: 'module' object has no attribute 'version'

  1) Error:
test_nodes_in_branch(MercurialAdapterTest):
Redmine::Scm::Adapters::MercurialAdapter::HgCommandAborted: hg exited with non-zero status: 1
    lib/redmine/scm/adapters/mercurial_adapter.rb:306:in `hg'
    lib/redmine/scm/adapters/mercurial_adapter.rb:234:in `nodes_in_branch'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:311:in `test_nodes_in_branch'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:304:in `each'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:304:in `test_nodes_in_branch'
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7651 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-25 07:20:14 +00:00
Toshi MARUYAMA 4104741383 Merged r7643 from trunk
scm: mercurial: skip failing unit model tests on below Mercurial 1.5

Tests of non ASCII nor alphabetic nor numeric *named branch* fails on below Mercurial 1.5.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7647 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-24 11:29:38 +00:00
Toshi MARUYAMA 6dac4a499f Merged r7642 from trunk
scm: mercurial: skip failing unit lib tests on below Mercurial 1.5

Tests of non ASCII nor alphabetic nor numeric *named branch* fails on below Mercurial 1.5.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7646 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-24 11:28:51 +00:00
Toshi MARUYAMA e0a8442b09 Merged r7641 from trunk
scm: mercurial: switch rev parameter of extension rhlog() if above Mercurial 1.6 or not

On Mercurial 1.5, following error raises.

<pre>
hg --config extensions.redminehelper=lib/redmine/scm/adapters/mercurial/redminehelper.py \
  --rhbranch default --from default --to 0

abort: unknown revision '"default"'!
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7645 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-24 11:28:19 +00:00
Toshi MARUYAMA 6dd11c9558 Merged r7640 from trunk
scm: mercurial: fix extension cmdtable on Mercurial 1.5

Before Mercurial revision "40c06bbf58be":http://www.selenic.com/repo/hg-stable/rev/40c06bbf58be ,
following error raises.

<pre>
Traceback (most recent call last):
  File "/WEB-DOWN/hg-repo/hg-crew/hg", line 27, in <module>
    mercurial.dispatch.run()
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 16, in run
    sys.exit(dispatch(sys.argv[1:]))
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 30, in dispatch
    return _runcatch(u, args)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 47, in _runcatch
    return _dispatch(ui, args)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 398, in _dispatch
    cmd, func, args, options, cmdoptions = _parse(lui, args)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/dispatch.py", line 277, in _parse
    args = fancyopts.fancyopts(args, c, cmdoptions, True)
  File "/WEB-DOWN/hg-repo/hg-crew/mercurial/fancyopts.py", line 62, in fancyopts
    for short, name, default, comment in options:
ValueError: too many values to unpack

  1) Error:
test_nodes_in_branch(MercurialAdapterTest):
Redmine::Scm::Adapters::MercurialAdapter::HgCommandAborted: hg exited with non-zero status: 1
    lib/redmine/scm/adapters/mercurial_adapter.rb:306:in `hg'
    lib/redmine/scm/adapters/mercurial_adapter.rb:234:in `nodes_in_branch'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:311:in `test_nodes_in_branch'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:304:in `each'
    test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb:304:in `test_nodes_in_branch'
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7644 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-24 11:27:38 +00:00
Toshi MARUYAMA 1608ca3d98 Merged r7579 from trunk.
Restrict anonymous read access with Redmine.pm

Redmine.pm now also checks for public projects whether the anonymous
user has the browse_repository right for a read operation.

Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-04 21:52:08 +00:00
Etienne Massip 0ef89ee4ea Merged r7570 from trunk (#9245).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-04 19:29:00 +00:00
Toshi MARUYAMA 4813672728 Merged r7571 from trunk.
Fix typo of fix_issue() at Changeset model.

Contributed by Sylvain Utard.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-04 10:55:32 +00:00
Etienne Massip ade5409310 Merged r7568 from trunk (#9308).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-03 20:19:44 +00:00
Etienne Massip 605f1745ff Merged #7563 from trunk (#7215).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-02 17:28:33 +00:00
Etienne Massip 8158a26ee8 Merged #7560 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-02 15:35:39 +00:00
Etienne Massip 4682acf040 Merged r7558 from trunk (#3276).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7559 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-10-02 14:52:43 +00:00
Etienne Massip 3955f81b3f Merged r7538 from trunk (#8411).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-26 17:47:50 +00:00
Etienne Massip 16f56a4677 Merged r7458 from trunk (#7613).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-23 17:23:22 +00:00
Toshi MARUYAMA f77b83451b Merged r7468 from trunk.
Norwegian translation of trunk r5957 and 1.2-stable r7455 updated.

Contributed by Lars Erik Gullerud.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7471 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-23 10:45:28 +00:00
Toshi MARUYAMA 2f2a93c6ef Merged r7451 and r7454 from trunk.
Slovenian translation updated.

Contributed by Nejc Vidmar.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7455 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-22 14:06:18 +00:00
Toshi MARUYAMA 5c282222a0 Backed out r7442.
Merged r7439 from trunk.

Slovenian translation of trunk r5957 and 1.2-stable r7434 updated.

Contributed by Nejc Vidmar.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-22 12:28:30 +00:00
Toshi MARUYAMA 61b4f41539 Merged r7439 from trunk.
Slovenian translation of trunk r5957 and 1.2-stable r7434 updated.

Contributed by Nejc Vidmar.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-22 01:52:04 +00:00
Toshi MARUYAMA 73e27a48e0 Merged r7432 from trunk.
fix typos in lib/redmine/hook.rb.

Contributed by Igor Zubkov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-21 09:57:26 +00:00
Toshi MARUYAMA 51d7c568b0 Merged r7407 from trunk.
remove trailing white-spaces from lib/redmine/hook.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-21 09:56:52 +00:00
Toshi MARUYAMA 51d772de70 Merged r7068 from trunk.
fix typo in imap examples at lib/tasks/email.rake.

Contributed by Nathan L Smith.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-07 01:07:43 +00:00
Toshi MARUYAMA 86845b1989 Merged r7060 from trunk.
add "ruby test/unit/issue_test.rb" for an each test at doc/RUNNING_TESTS.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-05 11:45:16 +00:00
Toshi MARUYAMA 723d60a1ce Merge r7033 from trunk.
remove duplicate "test_index_should_not_list_issues_when_module_disabled" from functional issues controller test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7038 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-02 01:30:33 +00:00
Toshi MARUYAMA b128fcaf0d back out r7036.
I mistook merged revision of the revision comment.
r7035 is wrong. r7033 is correct.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-02 01:29:54 +00:00
Toshi MARUYAMA 73dd0c49dd Merge r7035 from trunk.
remove duplicate "test_index_should_not_list_issues_when_module_disabled" from functional issues controller test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@7036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-09-02 01:15:12 +00:00
Toshi MARUYAMA cc7274f38c Merge r6915 from trunk.
fix grammatical error of field_warn_on_leaving_unsaved in pt-BR.yml.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-31 14:59:35 +00:00
Toshi MARUYAMA d0f3b8fa4d Merge r6600 from trunk.
Hungarian translation for 1.2.1 updated by Csaba Molnár.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6601 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-24 12:56:36 +00:00
Toshi MARUYAMA 2302955bc5 Merge r6021 from trunk (#8825).
scm: fix JRuby tests fail in unit changeset following test.

* test_invalid_utf8_sequences_in_paths_should_be_replaced

Following Subversion functional tests fail on Japanese Windows + JRuby 1.6.2 (ruby-1.8.7-p330).

* test_directory_diff
* test_revision_diff

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6453 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-17 11:14:03 +00:00
Toshi MARUYAMA 90f83db148 Merged r6005 from trunk.
scm: git: skip non UTF-8 path encoding test of unit model test in JRuby.

Git, Mercurial and CVS path encodings are binary.
Subversion supports URL encoding for path.
Redmine Mercurial adapter and extension use URL encoding.
Git accepts only binary path in command line parameter.
So, there is no way to use binary command line parameter in JRuby.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6452 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-17 08:16:23 +00:00
Toshi MARUYAMA b6dbf26c86 Merged r6004 from trunk.
scm: git: skip non UTF-8 path encoding test of unit adapter test in JRuby.

Git, Mercurial and CVS path encodings are binary.
Subversion supports URL encoding for path.
Redmine Mercurial adapter and extension use URL encoding.
Git accepts only binary path in command line parameter.
So, there is no way to use binary command line parameter in JRuby.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6451 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-17 08:16:02 +00:00
Toshi MARUYAMA 8c7e0e279c Merged r6003 from trunk.
scm: git: skip non UTF-8 path encoding test of functional test in JRuby.

Git, Mercurial and CVS path encodings are binary.
Subversion supports URL encoding for path.
Redmine Mercurial adapter and extension use URL encoding.
Git accepts only binary path in command line parameter.
So, there is no way to use binary command line parameter in JRuby.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6450 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-17 08:15:37 +00:00
Toshi MARUYAMA 6f15634e12 Merged r6447 from trunk.
scm: add comment that configuration of SCM executable command does not work if contains spaces path to configuration.yml.example.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-16 00:18:14 +00:00
Toshi MARUYAMA 7e837aa34d Merged r6418 from trunk.
remove trailing white-spaces from config/configuration.yml.example.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6448 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-16 00:17:56 +00:00
Toshi MARUYAMA 6c89118bac Merged r6441 from trunk.
PDF: remove unused vendor/plugins/rfpdf/lib/barcode/*.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6443 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 09:57:07 +00:00
Toshi MARUYAMA 260c07eb73 Merged r6435 from trunk.
PDF: remove unused sjis.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 08:29:47 +00:00
Toshi MARUYAMA 7914381cdd Merged r6434 from trunk.
PDF: remove unused zapfdingbats.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 07:25:48 +00:00
Toshi MARUYAMA 65ce05326a Merged r6433 from trunk.
PDF: remove unused symbol.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 07:25:06 +00:00
Toshi MARUYAMA 112c7a1b15 Merged r6432 from trunk.
PDF: remove unused courier.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 07:24:27 +00:00
Toshi MARUYAMA 23a31dfe27 Merged r6431 from trunk.
PDF: remove unused times*.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6437 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 07:23:43 +00:00
Toshi MARUYAMA 0dc50cb0b1 Merged r6430 from trunk.
PDF: remove unused vera*.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 07:23:00 +00:00
Toshi MARUYAMA 88163849b4 Merged r6427 from trunk.
PDF: remove unused vera fonts.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 05:27:03 +00:00
Toshi MARUYAMA 058f36cc6f Merged r6426 from trunk.
PDF: remove unused FreeMono fonts.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-12 05:26:17 +00:00
Toshi MARUYAMA 11cf38a1a8 Merged r6402 from trunk.
PDF: remove unused DejaVu fonts except DejaVuSans-BoldOblique.

FreeSans has freesansbi.rb. But there is no dejavusansbi.rb.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6408 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-06 00:02:17 +00:00
Toshi MARUYAMA 37d7a9d62d Merged r6401 from trunk.
PDF: remove unused DejaVuSans-ExtraLight font.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6407 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-06 00:01:47 +00:00
Toshi MARUYAMA 1b299369bf Merged r6403 from trunk.
Italian translation for 1.2 updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6405 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-08-05 11:24:32 +00:00
Toshi MARUYAMA cbe42633c9 Merged r6282 from trunk.
scm: bazaar: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6294 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:48:38 +00:00
Toshi MARUYAMA 25657168b1 Merged r6281 from trunk.
scm: git: use self.class.sq_bin for command name at adpter scm_cmd().

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6293 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:48:06 +00:00
Toshi MARUYAMA 4852b38efc Merged r6280 from trunk.
scm: git: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6292 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:47:34 +00:00
Toshi MARUYAMA b882993d6a Merged r6279 from trunk.
scm: mercurial: use self.class.sq_bin for command name at adpter scm_cmd().

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6291 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:47:08 +00:00
Toshi MARUYAMA b6c46aa19d Merged r6278 from trunk.
scm: mercurial: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6290 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:46:35 +00:00
Toshi MARUYAMA 0903db52d9 Merged r6277 from trunk.
scm: cvs: use self.class.sq_bin for command name at adpter scm_cmd().

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6289 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:46:01 +00:00
Toshi MARUYAMA 93d256c4a8 Merged r6276 from trunk.
scm: cvs: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6288 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:45:26 +00:00
Toshi MARUYAMA 64a68b86c6 Merged r6275 from trunk.
scm: darcs: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6287 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:44:44 +00:00
Toshi MARUYAMA 1d79bbce44 Merged r6274 from trunk.
scm: subversion: use "shell_quote_command" method at adapter for JRuby + Windows command name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6286 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:44:07 +00:00
Toshi MARUYAMA 87211bcb75 Merged r6272 from trunk.
scm: add new method "shell_quote_command" at abstract adapter.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6285 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 23:43:22 +00:00
Toshi MARUYAMA 68e97858cb Merge(backport) r6230 from trunk (#8825).
scm: catch all exceptions at adapter shellout() to fork scm command.

If scm command does not exist,
Linux JRuby 1.6.2 (ruby-1.8.7-p330) raises java.io.IOException in production environment.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.2-stable@6273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 11:53:39 +00:00
216 changed files with 1660 additions and 8639 deletions
+2 -3
View File
@@ -48,9 +48,8 @@ class ContextMenusController < ApplicationController
@projects = @time_entries.collect(&:project).compact.uniq @projects = @time_entries.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1 @project = @projects.first if @projects.size == 1
@activities = TimeEntryActivity.shared.active @activities = TimeEntryActivity.shared.active
@can = {:edit => User.current.allowed_to?(:log_time, @projects), @can = {:edit => User.current.allowed_to?(:edit_time_entries, @projects),
:update => User.current.allowed_to?(:log_time, @projects), :delete => User.current.allowed_to?(:edit_time_entries, @projects)
:delete => User.current.allowed_to?(:log_time, @projects)
} }
@back = back_url @back = back_url
render :layout => false render :layout => false
+3 -2
View File
@@ -20,7 +20,8 @@ class SysController < ActionController::Base
def projects def projects
p = Project.active.has_module(:repository).find(:all, :include => :repository, :order => 'identifier') p = Project.active.has_module(:repository).find(:all, :include => :repository, :order => 'identifier')
render :xml => p.to_xml(:include => :repository) # extra_info attribute from repository breaks activeresource client
render :xml => p.to_xml(:only => [:id, :identifier, :name, :is_public, :status], :include => {:repository => {:only => [:id, :url]}})
end end
def create_project_repository def create_project_repository
@@ -31,7 +32,7 @@ class SysController < ActionController::Base
logger.info "Repository for #{project.name} was reported to be created by #{request.remote_ip}." logger.info "Repository for #{project.name} was reported to be created by #{request.remote_ip}."
project.repository = Repository.factory(params[:vendor], params[:repository]) project.repository = Repository.factory(params[:vendor], params[:repository])
if project.repository && project.repository.save if project.repository && project.repository.save
render :xml => project.repository, :status => 201 render :xml => project.repository.to_xml(:only => [:id, :url]), :status => 201
else else
render :nothing => true, :status => 422 render :nothing => true, :status => 422
end end
+12 -3
View File
@@ -550,15 +550,20 @@ module ApplicationHelper
if page =~ /^(.+?)\#(.+)$/ if page =~ /^(.+?)\#(.+)$/
page, anchor = $1, $2 page, anchor = $1, $2
end end
anchor = sanitize_anchor_name(anchor) if anchor.present?
# check if page exists # check if page exists
wiki_page = link_project.wiki.find_page(page) wiki_page = link_project.wiki.find_page(page)
url = case options[:wiki_links] url = if anchor.present? && wiki_page.present? && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version)) && obj.page == wiki_page
when :local; "#{title}.html" "##{anchor}"
else
case options[:wiki_links]
when :local; "#{page.present? ? Wiki.titleize(page) : ''}.html" + (anchor.present? ? "##{anchor}" : '')
when :anchor; "##{title}" # used for single-file wiki export when :anchor; "##{title}" # used for single-file wiki export
else else
wiki_page_id = page.present? ? Wiki.titleize(page) : nil wiki_page_id = page.present? ? Wiki.titleize(page) : nil
url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, :id => wiki_page_id, :anchor => anchor) url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project, :id => wiki_page_id, :anchor => anchor)
end end
end
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new'))) link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else else
# project or wiki doesn't exist # project or wiki doesn't exist
@@ -703,7 +708,7 @@ module ApplicationHelper
text.gsub!(HEADING_RE) do text.gsub!(HEADING_RE) do
level, attrs, content = $1.to_i, $2, $3 level, attrs, content = $1.to_i, $2, $3
item = strip_tags(content).strip item = strip_tags(content).strip
anchor = item.gsub(%r{[^\w\s\-]}, '').gsub(%r{\s+(\-+\s*)?}, '-') anchor = sanitize_anchor_name(item)
@parsed_headings << [level, anchor, item] @parsed_headings << [level, anchor, item]
"<a name=\"#{anchor}\"></a>\n<h#{level} #{attrs}>#{content}<a href=\"##{anchor}\" class=\"wiki-anchor\">&para;</a></h#{level}>" "<a name=\"#{anchor}\"></a>\n<h#{level} #{attrs}>#{content}<a href=\"##{anchor}\" class=\"wiki-anchor\">&para;</a></h#{level}>"
end end
@@ -889,6 +894,10 @@ module ApplicationHelper
end end
end end
def sanitize_anchor_name(anchor)
anchor.gsub(%r{[^\w\s\-]}, '').gsub(%r{\s+(\-+\s*)?}, '-')
end
# Returns the javascript tags that are included in the html layout head # Returns the javascript tags that are included in the html layout head
def javascript_heads def javascript_heads
tags = javascript_include_tag(:defaults) tags = javascript_include_tag(:defaults)
+1 -1
View File
@@ -193,7 +193,7 @@ class Changeset < ActiveRecord::Base
def fix_issue(issue) def fix_issue(issue)
status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i)
if status.nil? if status.nil?
logger.warn("No status macthes commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger
return issue return issue
end end
+9 -1
View File
@@ -42,6 +42,14 @@ class CustomField < ActiveRecord::Base
errors.add(:possible_values, :invalid) unless self.possible_values.is_a? Array errors.add(:possible_values, :invalid) unless self.possible_values.is_a? Array
end end
if regexp.present?
begin
Regexp.new(regexp)
rescue
errors.add(:regexp, :invalid)
end
end
# validate default value # validate default value
v = CustomValue.new(:custom_field => self.clone, :value => default_value, :customized => nil) v = CustomValue.new(:custom_field => self.clone, :value => default_value, :customized => nil)
v.custom_field.is_required = false v.custom_field.is_required = false
@@ -56,7 +64,7 @@ class CustomField < ActiveRecord::Base
when 'user' when 'user'
obj.project.users.sort.collect {|u| [u.to_s, u.id.to_s]} obj.project.users.sort.collect {|u| [u.to_s, u.id.to_s]}
when 'version' when 'version'
obj.project.versions.sort.collect {|u| [u.to_s, u.id.to_s]} obj.project.shared_versions.sort.collect {|u| [u.to_s, u.id.to_s]}
end end
elsif obj.is_a?(Array) elsif obj.is_a?(Array)
obj.collect {|o| possible_values_options(o)}.inject {|memo, v| memo & v} obj.collect {|o| possible_values_options(o)}.inject {|memo, v| memo & v}
+1 -1
View File
@@ -62,7 +62,7 @@ protected
when 'float' when 'float'
begin; Kernel.Float(value); rescue; errors.add(:value, :invalid) end begin; Kernel.Float(value); rescue; errors.add(:value, :invalid) end
when 'date' when 'date'
errors.add(:value, :not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/ errors.add(:value, :not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/ && begin; value.to_date; rescue; false end
when 'list' when 'list'
errors.add(:value, :inclusion) unless custom_field.possible_values.include?(value) errors.add(:value, :inclusion) unless custom_field.possible_values.include?(value)
end end
+1
View File
@@ -449,6 +449,7 @@ class Issue < ActiveRecord::Base
def assignable_users def assignable_users
users = project.assignable_users users = project.assignable_users
users << author if author users << author if author
users << assigned_to if assigned_to
users.uniq.sort users.uniq.sort
end end
+10 -8
View File
@@ -58,8 +58,7 @@ class IssueStatus < ActiveRecord::Base
transitions = workflows.select do |w| transitions = workflows.select do |w|
role_ids.include?(w.role_id) && role_ids.include?(w.role_id) &&
w.tracker_id == tracker.id && w.tracker_id == tracker.id &&
(author || !w.author) && ((!w.author && !w.assignee) || (author && w.author) || (assignee && w.assignee))
(assignee || !w.assignee)
end end
transitions.collect{|w| w.new_status}.compact.sort transitions.collect{|w| w.new_status}.compact.sort
else else
@@ -70,14 +69,17 @@ class IssueStatus < ActiveRecord::Base
# Same thing as above but uses a database query # Same thing as above but uses a database query
# More efficient than the previous method if called just once # More efficient than the previous method if called just once
def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false) def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
if roles && tracker if roles.present? && tracker
conditions = {:role_id => roles.collect(&:id), :tracker_id => tracker.id} conditions = "(author = :false AND assignee = :false)"
conditions[:author] = false unless author conditions << " OR author = :true" if author
conditions[:assignee] = false unless assignee conditions << " OR assignee = :true" if assignee
workflows.find(:all, workflows.find(:all,
:include => :new_status, :include => :new_status,
:conditions => conditions).collect{|w| w.new_status}.compact.sort :conditions => ["role_id IN (:role_ids) AND tracker_id = :tracker_id AND (#{conditions})",
{:role_ids => roles.collect(&:id), :tracker_id => tracker.id, :true => true, :false => false}
]
).collect{|w| w.new_status}.compact.sort
else else
[] []
end end
+1 -1
View File
@@ -198,7 +198,7 @@ class MailHandler < ActionMailer::Base
end end
def add_attachments(obj) def add_attachments(obj)
if email.has_attachments? if email.attachments && email.attachments.any?
email.attachments.each do |attachment| email.attachments.each do |attachment|
Attachment.create(:container => obj, Attachment.create(:container => obj,
:file => attachment, :file => attachment,
+1
View File
@@ -809,6 +809,7 @@ class Project < ActiveRecord::Base
new_query.attributes = query.attributes.dup.except("id", "project_id", "sort_criteria") new_query.attributes = query.attributes.dup.except("id", "project_id", "sort_criteria")
new_query.sort_criteria = query.sort_criteria if query.sort_criteria new_query.sort_criteria = query.sort_criteria if query.sort_criteria
new_query.project = self new_query.project = self
new_query.user_id = query.user_id
self.queries << new_query self.queries << new_query
end end
end end
+13 -10
View File
@@ -333,14 +333,17 @@ class Query < ActiveRecord::Base
end end
def columns def columns
if has_default_columns? # preserve the column_names order
available_columns.select do |c| (has_default_columns? ? default_columns_names : column_names).collect do |name|
# Adds the project column by default for cross-project lists available_columns.find { |col| col.name == name }
Setting.issue_list_default_columns.include?(c.name.to_s) || (c.name == :project && project.nil?) end.compact
end end
else
# preserve the column_names order def default_columns_names
column_names.collect {|name| available_columns.find {|col| col.name == name}}.compact @default_columns_names ||= begin
default_columns = Setting.issue_list_default_columns.map(&:to_sym)
project.present? ? default_columns : [:project] | default_columns
end end
end end
@@ -349,7 +352,7 @@ class Query < ActiveRecord::Base
names = names.select {|n| n.is_a?(Symbol) || !n.blank? } names = names.select {|n| n.is_a?(Symbol) || !n.blank? }
names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym } names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym }
# Set column_names to nil if default columns # Set column_names to nil if default columns
if names.map(&:to_s) == Setting.issue_list_default_columns if names == default_columns_names
names = nil names = nil
end end
end end
@@ -518,7 +521,7 @@ class Query < ActiveRecord::Base
# Returns the issue count # Returns the issue count
def issue_count def issue_count
Issue.count(:include => [:status, :project], :conditions => statement) Issue.visible.count(:include => [:status, :project], :conditions => statement)
rescue ::ActiveRecord::StatementInvalid => e rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message) raise StatementInvalid.new(e.message)
end end
+11
View File
@@ -92,6 +92,17 @@ class Repository::Git < Repository
options = {:report_last_commit => extra_report_last_commit}) options = {:report_last_commit => extra_report_last_commit})
end end
# With SCMs that have a sequential commit numbering,
# such as Subversion and Mercurial,
# Redmine is able to be clever and only fetch changesets
# going forward from the most recent one it knows about.
#
# However, Git does not have a sequential commit numbering.
#
# In order to fetch only new adding revisions,
# Redmine needs to parse revisions per branch.
# Branch "last_scmid" is for this requirement.
#
# In Git and Mercurial, revisions are not in date order. # In Git and Mercurial, revisions are not in date order.
# Redmine Mercurial fixed issues. # Redmine Mercurial fixed issues.
# * Redmine Takes Too Long On Large Mercurial Repository # * Redmine Takes Too Long On Large Mercurial Repository
+5
View File
@@ -43,6 +43,11 @@ class Version < ActiveRecord::Base
user.allowed_to?(:view_issues, self.project) user.allowed_to?(:view_issues, self.project)
end end
# Version files have same visibility as project files
def attachments_visible?(*args)
project.present? && project.attachments_visible?(*args)
end
def start_date def start_date
@start_date ||= fixed_issues.minimum('start_date') @start_date ||= fixed_issues.minimum('start_date')
end end
+1 -1
View File
@@ -30,7 +30,7 @@ class WikiPage < ActiveRecord::Base
:datetime => :created_on, :datetime => :created_on,
:url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.wiki.project, :id => o.title}} :url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.wiki.project, :id => o.title}}
acts_as_searchable :columns => ['title', 'text'], acts_as_searchable :columns => ['title', "#{WikiContent.table_name}.text"],
:include => [{:wiki => :project}, :content], :include => [{:wiki => :project}, :content],
:permission => :view_wiki_pages, :permission => :view_wiki_pages,
:project_key => "#{Wiki.table_name}.project_id" :project_key => "#{Wiki.table_name}.project_id"
@@ -15,10 +15,10 @@
<ul> <ul>
<% @activities.each do |u| -%> <% @activities.each do |u| -%>
<li><%= context_menu_link u.name, {:controller => 'timelog', :action => 'bulk_edit', :ids => @time_entries.collect(&:id), :time_entry => {'activity_id' => u}, :back_url => @back}, :method => :post, <li><%= context_menu_link u.name, {:controller => 'timelog', :action => 'bulk_edit', :ids => @time_entries.collect(&:id), :time_entry => {'activity_id' => u}, :back_url => @back}, :method => :post,
:selected => (@time_entry && u == @time_entry.activity), :disabled => !@can[:update] %></li> :selected => (@time_entry && u == @time_entry.activity), :disabled => !@can[:edit] %></li>
<% end -%> <% end -%>
<li><%= context_menu_link l(:label_nobody), {:controller => 'timelog', :action => 'bulk_edit', :ids => @time_entries.collect(&:id), :time_entry => {'activity_id' => 'none'}, :back_url => @back}, :method => :post, <li><%= context_menu_link l(:label_nobody), {:controller => 'timelog', :action => 'bulk_edit', :ids => @time_entries.collect(&:id), :time_entry => {'activity_id' => 'none'}, :back_url => @back}, :method => :post,
:selected => (@time_entry && @time_entry.activity.nil?), :disabled => !@can[:update] %></li> :selected => (@time_entry && @time_entry.activity.nil?), :disabled => !@can[:edit] %></li>
</ul> </ul>
</li> </li>
<% end %> <% end %>
+1 -1
View File
@@ -2,5 +2,5 @@
<p><em><%= format_time(document.updated_on) %></em></p> <p><em><%= format_time(document.updated_on) %></em></p>
<div class="wiki"> <div class="wiki">
<%= textilizable(truncate_lines(document.description)) %> <%= textilizable(truncate_lines(document.description), :object => document) %>
</div> </div>
+1 -1
View File
@@ -15,7 +15,7 @@
<%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %> <%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %>
</fieldset> </fieldset>
<% end %> <% end %>
<% if authorize_for('timelog', 'edit') %> <% if User.current.allowed_to?(:log_time, @project) %>
<fieldset class="tabular"><legend><%= l(:button_log_time) %></legend> <fieldset class="tabular"><legend><%= l(:button_log_time) %></legend>
<% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %> <% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
<div class="splitcontentleft"> <div class="splitcontentleft">
@@ -32,6 +32,7 @@
</div> </div>
<% unless @hours.empty? %> <% unless @hours.empty? %>
<div class="autoscroll">
<table class="list" id="time-report"> <table class="list" id="time-report">
<thead> <thead>
<tr> <tr>
@@ -59,6 +60,7 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'CSV', :url => params %> <%= f.link_to 'CSV', :url => params %>
+2
View File
@@ -1,5 +1,6 @@
<% form_tag({}) do -%> <% form_tag({}) do -%>
<%= hidden_field_tag 'back_url', url_for(params) %> <%= hidden_field_tag 'back_url', url_for(params) %>
<div class="autoscroll">
<table class="list time-entries"> <table class="list time-entries">
<thead> <thead>
<tr> <tr>
@@ -48,6 +49,7 @@
<% end -%> <% end -%>
</tbody> </tbody>
</table> </table>
</div>
<% end -%> <% end -%>
<%= context_menu time_entries_context_menu_path %> <%= context_menu time_entries_context_menu_path %>
+1 -1
View File
@@ -6,7 +6,7 @@
<h2><%= @page.pretty_title %></h2> <h2><%= @page.pretty_title %></h2>
<p> <p>
<%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'show', :id => @page.title, :version => @annotate.content.version %> <%= l(:label_version) %> <%= link_to @annotate.content.version, :action => 'show', :project_id => @project, :id => @page.title, :version => @annotate.content.version %>
<em>(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)</em> <em>(<%= @annotate.content.author ? @annotate.content.author.name : "anonyme" %>, <%= format_time(@annotate.content.updated_on) %>)</em>
</p> </p>
+2 -2
View File
@@ -46,8 +46,8 @@
<% end %> <% end %>
<% other_formats_links do |f| %> <% other_formats_links do |f| %>
<%= f.link_to 'HTML', :url => {:id => @page.title, :version => @content.version} %> <%= f.link_to 'HTML', :url => {:id => @page.title, :version => params[:version]} %>
<%= f.link_to 'TXT', :url => {:id => @page.title, :version => @content.version} %> <%= f.link_to 'TXT', :url => {:id => @page.title, :version => params[:version]} %>
<% end if User.current.allowed_to?(:export_wiki_pages, @project) %> <% end if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% content_for :header_tags do %> <% content_for :header_tags do %>
+9 -1
View File
@@ -108,8 +108,15 @@ default:
autologin_cookie_secure: autologin_cookie_secure:
# Configuration of SCM executable command. # Configuration of SCM executable command.
#
# Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe) # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe)
# On Windows, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work. # On Windows + CRuby, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work.
#
# On Windows + JRuby 1.6.2, path which contains spaces does not work.
# For example, "C:\Program Files\TortoiseHg\hg.exe".
# If you want to this feature, you need to install to the path which does not contains spaces.
# For example, "C:\TortoiseHg\hg.exe".
#
# Examples: # Examples:
# scm_subversion_command: svn # (default: svn) # scm_subversion_command: svn # (default: svn)
# scm_mercurial_command: C:\Program Files\TortoiseHg\hg.exe # (default: hg) # scm_mercurial_command: C:\Program Files\TortoiseHg\hg.exe # (default: hg)
@@ -117,6 +124,7 @@ default:
# scm_cvs_command: cvs # (default: cvs) # scm_cvs_command: cvs # (default: cvs)
# scm_bazaar_command: bzr.exe # (default: bzr) # scm_bazaar_command: bzr.exe # (default: bzr)
# scm_darcs_command: darcs-1.0.9-i386-linux # (default: darcs) # scm_darcs_command: darcs-1.0.9-i386-linux # (default: darcs)
#
scm_subversion_command: scm_subversion_command:
scm_mercurial_command: scm_mercurial_command:
scm_git_command: scm_git_command:
+1 -1
View File
@@ -368,7 +368,7 @@ bg:
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
setting_start_of_week: Първи ден на седмицата setting_start_of_week: Първи ден на седмицата
setting_rest_api_enabled: Разрешаване на REST web сървис setting_rest_api_enabled: Разрешаване на REST web сървис
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Кещиране на форматираните текстове
setting_default_notification_option: Подразбиращ се начин за известяване setting_default_notification_option: Подразбиращ се начин за известяване
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
setting_commit_logtime_activity_id: Дейност при отчитане на работното време setting_commit_logtime_activity_id: Дейност при отчитане на работното време
+1 -1
View File
@@ -132,7 +132,7 @@ es:
greater_than_start_date: "debe ser posterior a la fecha de comienzo" greater_than_start_date: "debe ser posterior a la fecha de comienzo"
not_same_project: "no pertenece al mismo proyecto" not_same_project: "no pertenece al mismo proyecto"
circular_dependency: "Esta relación podría crear una dependencia circular" circular_dependency: "Esta relación podría crear una dependencia circular"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "Esta petición no puede ser ligada a una de estas tareas"
# Append your own errors here or at the model/attributes scope. # Append your own errors here or at the model/attributes scope.
+53 -53
View File
@@ -34,40 +34,40 @@
distance_in_words: distance_in_words:
half_a_minute: 'fél perc' half_a_minute: 'fél perc'
less_than_x_seconds: less_than_x_seconds:
# zero: 'kevesebb, mint 1 másodperc' # zero: 'kevesebb, mint 1 másodperce'
one: 'kevesebb, mint 1 másodperc' one: 'kevesebb, mint 1 másodperce'
other: 'kevesebb, mint %{count} másodperc' other: 'kevesebb, mint %{count} másodperce'
x_seconds: x_seconds:
one: '1 másodperc' one: '1 másodperce'
other: '%{count} másodperc' other: '%{count} másodperce'
less_than_x_minutes: less_than_x_minutes:
# zero: 'kevesebb, mint 1 perc' # zero: 'kevesebb, mint 1 perce'
one: 'kevesebb, mint 1 perc' one: 'kevesebb, mint 1 perce'
other: 'kevesebb, mint %{count} perc' other: 'kevesebb, mint %{count} perce'
x_minutes: x_minutes:
one: '1 perc' one: '1 perce'
other: '%{count} perc' other: '%{count} perce'
about_x_hours: about_x_hours:
one: 'majdnem 1 óra' one: 'csaknem 1 órája'
other: 'majdnem %{count} óra' other: 'csaknem %{count} órája'
x_days: x_days:
one: '1 nap' one: '1 napja'
other: '%{count} nap' other: '%{count} napja'
about_x_months: about_x_months:
one: 'majdnem 1 hónap' one: 'csaknem 1 hónapja'
other: 'majdnem %{count} hónap' other: 'csaknem %{count} hónapja'
x_months: x_months:
one: '1 hónap' one: '1 hónapja'
other: '%{count} hónap' other: '%{count} hónapja'
about_x_years: about_x_years:
one: 'majdnem 1 év' one: 'csaknem 1 éve'
other: 'majdnem %{count} év' other: 'csaknem %{count} éve'
over_x_years: over_x_years:
one: 'több, mint 1 év' one: 'több, mint 1 éve'
other: 'több, mint %{count} év' other: 'több, mint %{count} éve'
almost_x_years: almost_x_years:
one: "közel 1 év" one: "csaknem 1 éve"
other: "közel %{count} év" other: "csaknem %{count} éve"
prompts: prompts:
year: "Év" year: "Év"
month: "Hónap" month: "Hónap"
@@ -264,7 +264,7 @@
field_attr_mail: E-mail field_attr_mail: E-mail
field_onthefly: On-the-fly felhasználó létrehozás field_onthefly: On-the-fly felhasználó létrehozás
field_start_date: Kezdés dátuma field_start_date: Kezdés dátuma
field_done_ratio: Elkészült (%) field_done_ratio: Készültség (%)
field_auth_source: Azonosítási mód field_auth_source: Azonosítási mód
field_hide_mail: Rejtse el az e-mail címem field_hide_mail: Rejtse el az e-mail címem
field_comments: Megjegyzés field_comments: Megjegyzés
@@ -280,7 +280,7 @@
field_delay: Késés field_delay: Késés
field_assignable: Feladat rendelhető ehhez a szerepkörhöz field_assignable: Feladat rendelhető ehhez a szerepkörhöz
field_redirect_existing_links: Létező linkek átirányítása field_redirect_existing_links: Létező linkek átirányítása
field_estimated_hours: Becsült idő field_estimated_hours: Becsült időigény
field_column_names: Oszlopok field_column_names: Oszlopok
field_time_zone: Időzóna field_time_zone: Időzóna
field_searchable: Kereshető field_searchable: Kereshető
@@ -326,7 +326,7 @@
project_module_documents: Dokumentumok project_module_documents: Dokumentumok
project_module_files: Fájlok project_module_files: Fájlok
project_module_wiki: Wiki project_module_wiki: Wiki
project_module_repository: Tároló project_module_repository: Forráskód
project_module_boards: Fórumok project_module_boards: Fórumok
label_user: Felhasználó label_user: Felhasználó
@@ -391,7 +391,7 @@
label_assigned_to_me_issues: A nekem kiosztott feladatok label_assigned_to_me_issues: A nekem kiosztott feladatok
label_last_login: Utolsó bejelentkezés label_last_login: Utolsó bejelentkezés
label_registered_on: Regisztrált label_registered_on: Regisztrált
label_activity: Tevékenységek label_activity: Történések
label_overall_activity: Teljes aktivitás label_overall_activity: Teljes aktivitás
label_new: Új label_new: Új
label_logged_as: Bejelentkezve, mint label_logged_as: Bejelentkezve, mint
@@ -510,8 +510,8 @@
label_contains: tartalmazza label_contains: tartalmazza
label_not_contains: nem tartalmazza label_not_contains: nem tartalmazza
label_day_plural: nap label_day_plural: nap
label_repository: Tároló label_repository: Forráskód
label_repository_plural: Tárolók label_repository_plural: Forráskódok
label_browse: Tallóz label_browse: Tallóz
label_modification: "%{count} változás" label_modification: "%{count} változás"
label_modification_plural: "%{count} változás" label_modification_plural: "%{count} változás"
@@ -600,10 +600,10 @@
label_language_based: A felhasználó nyelve alapján label_language_based: A felhasználó nyelve alapján
label_sort_by: "%{value} szerint rendezve" label_sort_by: "%{value} szerint rendezve"
label_send_test_email: Teszt e-mail küldése label_send_test_email: Teszt e-mail küldése
label_feeds_access_key_created_on: "RSS hozzáférési kulcs létrehozva ennyivel ezelőtt: %{value}" label_feeds_access_key_created_on: "RSS hozzáférési kulcs létrehozva %{value}"
label_module_plural: Modulok label_module_plural: Modulok
label_added_time_by: "%{author} adta hozzá ennyivel ezelőtt: %{age}" label_added_time_by: "%{author} adta hozzá %{age}"
label_updated_time: "Utolsó módosítás ennyivel ezelőtt: %{value}" label_updated_time: "Utolsó módosítás %{value}"
label_jump_to_a_project: Ugrás projekthez... label_jump_to_a_project: Ugrás projekthez...
label_file_plural: Fájlok label_file_plural: Fájlok
label_changeset_plural: Changesets label_changeset_plural: Changesets
@@ -695,11 +695,11 @@
text_unallowed_characters: Tiltott karakterek text_unallowed_characters: Tiltott karakterek
text_comma_separated: Több érték megengedett (vesszővel elválasztva) text_comma_separated: Több érték megengedett (vesszővel elválasztva)
text_issues_ref_in_commit_messages: Hivatkozás feladatokra, feladatok javítása a commit üzenetekben text_issues_ref_in_commit_messages: Hivatkozás feladatokra, feladatok javítása a commit üzenetekben
text_issue_added: "A feladatot %{id} bejelentette: %{author}." text_issue_added: "%{author} új feladatot hozott létre %{id} sorszámmal."
text_issue_updated: "A feladatot %{id} módosította: %{author}." text_issue_updated: "%{author} módosította a %{id} sorszámú feladatot."
text_wiki_destroy_confirmation: Biztosan törölni szeretné ezt a wiki-t minden tartalmával együtt ? text_wiki_destroy_confirmation: Biztosan törölni szeretné ezt a wiki-t minden tartalmával együtt ?
text_issue_category_destroy_question: "Néhány feladat (%{count}) hozzá van rendelve ehhez a kategóriához. Mit szeretne tenni ?" text_issue_category_destroy_question: "Néhány feladat (%{count}) hozzá van rendelve ehhez a kategóriához. Mit szeretne tenni?"
text_issue_category_destroy_assignments: Kategória hozzárendelés megszűntetése text_issue_category_destroy_assignments: Kategória hozzárendelés megszüntetése
text_issue_category_reassign_to: Feladatok újra hozzárendelése másik kategóriához text_issue_category_reassign_to: Feladatok újra hozzárendelése másik kategóriához
text_user_mail_option: "A nem kiválasztott projektekről csak akkor kap értesítést, ha figyelést kér rá, vagy részt vesz benne (pl. Ön a létrehozó, vagy a hozzárendelő)" text_user_mail_option: "A nem kiválasztott projektekről csak akkor kap értesítést, ha figyelést kér rá, vagy részt vesz benne (pl. Ön a létrehozó, vagy a hozzárendelő)"
text_no_configuration_data: "Szerepkörök, feladat típusok, feladat státuszok, és workflow adatok még nincsenek konfigurálva.\nErősen ajánlott, az alapértelmezett konfiguráció betöltése, és utána módosíthatja azt." text_no_configuration_data: "Szerepkörök, feladat típusok, feladat státuszok, és workflow adatok még nincsenek konfigurálva.\nErősen ajánlott, az alapértelmezett konfiguráció betöltése, és utána módosíthatja azt."
@@ -709,8 +709,8 @@
text_select_project_modules: 'Válassza ki az engedélyezett modulokat ehhez a projekthez:' text_select_project_modules: 'Válassza ki az engedélyezett modulokat ehhez a projekthez:'
text_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva text_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva
text_file_repository_writable: Fájl tároló írható text_file_repository_writable: Fájl tároló írható
text_rmagick_available: RMagick elérhető (opcionális) text_rmagick_available: RMagick elérhető (nem kötelező)
text_destroy_time_entries_question: "%{hours} órányi munka van rögzítve a feladatokon, amiket törölni szeretne. Mit szeretne tenni ?" text_destroy_time_entries_question: "%{hours} órányi munka van rögzítve a feladatokon, amiket törölni szeretne. Mit szeretne tenni?"
text_destroy_time_entries: A rögzített órák törlése text_destroy_time_entries: A rögzített órák törlése
text_assign_time_entries_to_project: A rögzített órák hozzárendelése a projekthez text_assign_time_entries_to_project: A rögzített órák hozzárendelése a projekthez
text_reassign_time_entries: 'A rögzített órák újra hozzárendelése másik feladathoz:' text_reassign_time_entries: 'A rögzített órák újra hozzárendelése másik feladathoz:'
@@ -720,7 +720,7 @@
default_role_reporter: Bejelentő default_role_reporter: Bejelentő
default_tracker_bug: Hiba default_tracker_bug: Hiba
default_tracker_feature: Fejlesztés default_tracker_feature: Fejlesztés
default_tracker_support: Support default_tracker_support: Támogatás
default_issue_status_new: Új default_issue_status_new: Új
default_issue_status_in_progress: Folyamatban default_issue_status_in_progress: Folyamatban
default_issue_status_resolved: Megoldva default_issue_status_resolved: Megoldva
@@ -741,7 +741,7 @@
enumeration_doc_categories: Dokumentum kategóriák enumeration_doc_categories: Dokumentum kategóriák
enumeration_activities: Tevékenységek (idő rögzítés) enumeration_activities: Tevékenységek (idő rögzítés)
mail_body_reminder: "%{count} neked kiosztott feladat határidős az elkövetkező %{days} napban:" mail_body_reminder: "%{count} neked kiosztott feladat határidős az elkövetkező %{days} napban:"
mail_subject_reminder: "%{count} feladat határidős az elkövetkező %{days} napokban" mail_subject_reminder: "%{count} feladat határidős az elkövetkező %{days} napban"
text_user_wrote: "%{value} írta:" text_user_wrote: "%{value} írta:"
label_duplicated_by: duplikálta label_duplicated_by: duplikálta
setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése
@@ -812,14 +812,14 @@
permission_edit_own_messages: Saját üzenetek szerkesztése permission_edit_own_messages: Saját üzenetek szerkesztése
permission_delete_own_messages: Saját üzenetek törlése permission_delete_own_messages: Saját üzenetek törlése
label_user_activity: "%{value} tevékenységei" label_user_activity: "%{value} tevékenységei"
label_updated_time_by: "Módosította %{author} ennyivel ezelőtt: %{age}" label_updated_time_by: "Módosította %{author} %{age}"
text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.' text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.'
setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál
text_plugin_assets_writable: Plugin eszközök könyvtár írható text_plugin_assets_writable: Plugin eszközök könyvtár írható
warning_attachments_not_saved: "%{count} fájl mentése nem sikerült." warning_attachments_not_saved: "%{count} fájl mentése nem sikerült."
button_create_and_continue: Létrehozás és folytatás button_create_and_continue: Létrehozás és folytatás
text_custom_field_possible_values_info: 'Értékenként egy sor' text_custom_field_possible_values_info: 'Értékenként egy sor'
label_display: Megjelenés label_display: Megmutat
field_editable: Szerkeszthető field_editable: Szerkeszthető
setting_repository_log_display_limit: Maximum hány revíziót mutasson meg a log megjelenítésekor setting_repository_log_display_limit: Maximum hány revíziót mutasson meg a log megjelenítésekor
setting_file_max_size_displayed: Maximum mekkora szövegfájlokat jelenítsen meg soronkénti összehasonlításnál setting_file_max_size_displayed: Maximum mekkora szövegfájlokat jelenítsen meg soronkénti összehasonlításnál
@@ -835,40 +835,40 @@
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: "<=" label_less_or_equal: "<="
text_wiki_page_destroy_question: Ennek az oldalnak %{descendants} gyermek-, és leszármazott oldala van. Mit szeretne tenni? text_wiki_page_destroy_question: Ennek az oldalnak %{descendants} gyermek-, és leszármazott oldala van. Mit szeretne tenni?
text_wiki_page_reassign_children: Az aloldalak hozzárendelése ehhez a szülő oldalhoz text_wiki_page_reassign_children: Aloldalak hozzárendelése ehhez a szülő oldalhoz
text_wiki_page_nullify_children: Az aloldalak megtartása, mint főoldalak text_wiki_page_nullify_children: Aloldalak átalakítása főoldallá
text_wiki_page_destroy_children: Minden aloldal és leszármazottjának törlése text_wiki_page_destroy_children: Minden aloldal és leszármazottjának törlése
setting_password_min_length: Minimum jelszó hosszúság setting_password_min_length: Minimum jelszó hosszúság
field_group_by: Szerint csoportosítva field_group_by: Szerint csoportosítva
mail_subject_wiki_content_updated: "'%{id}' wiki oldal frissítve" mail_subject_wiki_content_updated: "'%{id}' wiki oldal frissítve"
label_wiki_content_added: Wiki oldal hozzáadva label_wiki_content_added: Wiki oldal hozzáadva
mail_subject_wiki_content_added: "Új wiki oldal: '%{id}'" mail_subject_wiki_content_added: "Új wiki oldal: '%{id}'"
mail_body_wiki_content_added: A '%{id}' wiki oldalt %{author} hozta létre. mail_body_wiki_content_added: %{author} létrehozta a '%{id}' wiki oldalt.
label_wiki_content_updated: Wiki oldal frissítve label_wiki_content_updated: Wiki oldal frissítve
mail_body_wiki_content_updated: A '%{id}' wiki oldalt %{author} frissítette. mail_body_wiki_content_updated: %{author} frissítette a '%{id}' wiki oldalt.
permission_add_project: Projekt létrehozása permission_add_project: Projekt létrehozása
setting_new_project_user_role_id: Projekt létrehozási jog nem adminisztrátor felhasználóknak setting_new_project_user_role_id: Projekt létrehozási jog nem adminisztrátor felhasználóknak
label_view_all_revisions: Minden revízió megtekintése label_view_all_revisions: Összes verzió
label_tag: Tag label_tag: Tag
label_branch: Branch label_branch: Branch
error_no_tracker_in_project: Nincs feladat típus hozzárendelve ehhez a projekthez. Kérem ellenőrizze a projekt beállításait. error_no_tracker_in_project: Nincs feladat típus hozzárendelve ehhez a projekthez. Kérem ellenőrizze a projekt beállításait.
error_no_default_issue_status: Nincs alapértelmezett feladat státusz beállítva. Kérem ellenőrizze a beállításokat (Itt találja "Adminisztráció -> Feladat státuszok"). error_no_default_issue_status: Nincs alapértelmezett feladat státusz beállítva. Kérem ellenőrizze a beállításokat (Itt találja "Adminisztráció -> Feladat státuszok").
text_journal_changed: "%{label} változott erről: %{old} erre: %{new}" text_journal_changed: "%{label} megváltozott, %{old} helyett %{new} lett"
text_journal_set_to: "%{label} új értéke: %{value}" text_journal_set_to: "%{label} új értéke: %{value}"
text_journal_deleted: "%{label} törölve (%{old})" text_journal_deleted: "%{label} törölve lett (%{old})"
label_group_plural: Csoportok label_group_plural: Csoportok
label_group: Csoport label_group: Csoport
label_group_new: Új csoport label_group_new: Új csoport
label_time_entry_plural: Rögzített idő label_time_entry_plural: Időráfordítás
text_journal_added: "%{label} %{value} hozzáadva" text_journal_added: "%{label} %{value} hozzáadva"
field_active: Aktív field_active: Aktív
enumeration_system_activity: Rendszer Tevékenység enumeration_system_activity: Rendszertevékenység
permission_delete_issue_watchers: Megfigyelők törlése permission_delete_issue_watchers: Megfigyelők törlése
version_status_closed: lezárt version_status_closed: lezárt
version_status_locked: zárolt version_status_locked: zárolt
version_status_open: nyitott version_status_open: nyitott
error_can_not_reopen_issue_on_closed_version: Lezárt verzióhoz rendelt feladatot nem lehet újranyitni error_can_not_reopen_issue_on_closed_version: Lezárt verzióhoz rendelt feladatot nem lehet újranyitni
label_user_anonymous: Anonymous label_user_anonymous: Névtelen
button_move_and_follow: Mozgatás és követés button_move_and_follow: Mozgatás és követés
setting_default_projects_modules: Alapértelmezett modulok az új projektekhez setting_default_projects_modules: Alapértelmezett modulok az új projektekhez
setting_gravatar_default: Alapértelmezett Gravatar kép setting_gravatar_default: Alapértelmezett Gravatar kép
+36 -36
View File
@@ -939,41 +939,41 @@ it:
setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento
notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare
setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: Avvisami quando lascio una pagina con testo non salvato
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: La pagina corrente contiene del testo non salvato che verrà perso se lasci questa pagina.
label_my_queries: My custom queries label_my_queries: Le mie queries personalizzate
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} aggiornato"
label_news_comment_added: Comment added to a news label_news_comment_added: Commento aggiunto a una notizia
button_expand_all: Expand all button_expand_all: Espandi tutto
button_collapse_all: Collapse all button_collapse_all: Comprimi tutto
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Transizioni supplementari consentite quando l'utente è l'assegnatario
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Transizioni supplementari consentite quando l'utente è l'autore
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: Modifica massiva delle ore segnalate selezionate
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: Sei sicuro di voler eliminare l'ora\e selezionata\e?
label_role_anonymous: Anonymous label_role_anonymous: Anonimo
label_role_non_member: Non member label_role_non_member: Non membro
label_issue_note_added: Note added label_issue_note_added: Nota aggiunta
label_issue_status_updated: Status updated label_issue_status_updated: Stato aggiornato
label_issue_priority_updated: Priority updated label_issue_priority_updated: Priorità aggiornata
label_issues_visibility_own: Issues created by or assigned to the user label_issues_visibility_own: Segnalazioni create o assegnate all'utente
field_issues_visibility: Issues visibility field_issues_visibility: Visibilità segnalazioni
label_issues_visibility_all: All issues label_issues_visibility_all: Tutte le segnalazioni
permission_set_own_issues_private: Set own issues public or private permission_set_own_issues_private: Imposta le proprie segnalazioni pubbliche o private
field_is_private: Private field_is_private: Privato
permission_set_issues_private: Set issues public or private permission_set_issues_private: Imposta le segnalazioni pubbliche o private
label_issues_visibility_public: All non private issues label_issues_visibility_public: Tutte le segnalazioni non private
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: Questo eliminerà anche %{count} sottoattività.
field_commit_logs_encoding: Codifica dei messaggi di commit field_commit_logs_encoding: Codifica dei messaggi di commit
field_scm_path_encoding: Path encoding field_scm_path_encoding: Codifica del percorso
text_scm_path_encoding_note: "Default: UTF-8" text_scm_path_encoding_note: "Predefinito: UTF-8"
field_path_to_repository: Path to repository field_path_to_repository: Percorso del repository
field_root_directory: Root directory field_root_directory: Directory radice
field_cvs_module: Module field_cvs_module: Modulo
field_cvsroot: CVSROOT field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo) text_git_repository_note: Repository centrale e locale (es. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) text_mercurial_repository_note: Repository locale (es. /hgrepo, c:\hgrepo)
text_scm_command: Command text_scm_command: Comando
text_scm_command_version: Version text_scm_command_version: Versione
label_git_report_last_commit: Report last commit for files and directories label_git_report_last_commit: Riporta l'ultimo commit per files e directories
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it. text_scm_config: Puoi configurare i comandi scm nel file config/configuration.yml. E' necessario riavviare l'applicazione dopo averlo modificato.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel. text_scm_command_not_available: Il comando scm non è disponibile. Controllare le impostazioni nel pannello di amministrazione.
+9 -9
View File
@@ -123,7 +123,7 @@ nl:
greater_than_start_date: "moet na de startdatum liggen" greater_than_start_date: "moet na de startdatum liggen"
not_same_project: "hoort niet bij hetzelfde project" not_same_project: "hoort niet bij hetzelfde project"
circular_dependency: "Deze relatie zou een circulaire afhankelijkheid tot gevolg hebben" circular_dependency: "Deze relatie zou een circulaire afhankelijkheid tot gevolg hebben"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "Een issue kan niet gelinked worden met een subtask"
actionview_instancetag_blank_option: Selecteer actionview_instancetag_blank_option: Selecteer
@@ -703,7 +703,7 @@ nl:
setting_bcc_recipients: Blind carbon copy ontvangers (bcc) setting_bcc_recipients: Blind carbon copy ontvangers (bcc)
setting_commit_fix_keywords: Gefixeerde trefwoorden setting_commit_fix_keywords: Gefixeerde trefwoorden
setting_commit_ref_keywords: Refererende trefwoorden setting_commit_ref_keywords: Refererende trefwoorden
setting_cross_project_issue_relations: Sta crossproject issuerelaties toe setting_cross_project_issue_relations: Sta cross-project issuerelaties toe
setting_date_format: Datumformaat setting_date_format: Datumformaat
setting_default_language: Standaard taal setting_default_language: Standaard taal
setting_default_projects_public: Nieuwe projecten zijn standaard publiek setting_default_projects_public: Nieuwe projecten zijn standaard publiek
@@ -908,8 +908,8 @@ nl:
label_user_mail_option_only_my_events: Alleen voor dingen die ik volg of bij betrokken ben label_user_mail_option_only_my_events: Alleen voor dingen die ik volg of bij betrokken ben
label_user_mail_option_only_assigned: Alleen voor dingen die aan mij zijn toegewezen label_user_mail_option_only_assigned: Alleen voor dingen die aan mij zijn toegewezen
label_user_mail_option_none: Bij geen enkele gebeurtenis label_user_mail_option_none: Bij geen enkele gebeurtenis
field_member_of_group: Assignee's group field_member_of_group: Groep van toegewezene
field_assigned_to_role: Assignee's role field_assigned_to_role: Rol van toegewezene
notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd. notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd.
label_principal_search: "Zoek naar gebruiker of groep:" label_principal_search: "Zoek naar gebruiker of groep:"
label_user_search: "Zoek naar gebruiker:" label_user_search: "Zoek naar gebruiker:"
@@ -925,10 +925,10 @@ nl:
label_my_queries: Mijn aangepaste zoekopdrachten label_my_queries: Mijn aangepaste zoekopdrachten
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Commentaar toegevoegd aan een nieuwsitem label_news_comment_added: Commentaar toegevoegd aan een nieuwsitem
button_expand_all: Expand all button_expand_all: Klap uit
button_collapse_all: Collapse all button_collapse_all: Klap in
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Aanvullende veranderingen toegestaan wanneer de gebruiker de toegewezene is
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Aanvullende veranderingen toegestaan wanneer de gebruiker de auteur is
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous label_role_anonymous: Anonymous
@@ -946,7 +946,7 @@ nl:
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
field_commit_logs_encoding: Encodering van commit berichten field_commit_logs_encoding: Encodering van commit berichten
field_scm_path_encoding: Path encoding field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8" text_scm_path_encoding_note: "Standaard: UTF-8"
field_path_to_repository: Path to repository field_path_to_repository: Path to repository
field_root_directory: Root directory field_root_directory: Root directory
field_cvs_module: Module field_cvs_module: Module
+225 -223
View File
@@ -114,7 +114,7 @@
greater_than_start_date: "må være større enn startdato" greater_than_start_date: "må være større enn startdato"
not_same_project: "hører ikke til samme prosjekt" not_same_project: "hører ikke til samme prosjekt"
circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet" circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "En sak kan ikke kobles mot en av sine undersaker"
actionview_instancetag_blank_option: Vennligst velg actionview_instancetag_blank_option: Vennligst velg
@@ -212,7 +212,7 @@
field_role: Rolle field_role: Rolle
field_homepage: Hjemmeside field_homepage: Hjemmeside
field_is_public: Offentlig field_is_public: Offentlig
field_parent: Underprosjekt til field_parent: Underprosjekt av
field_is_in_roadmap: Vises i veikart field_is_in_roadmap: Vises i veikart
field_login: Brukernavn field_login: Brukernavn
field_mail_notification: E-post-varsling field_mail_notification: E-post-varsling
@@ -236,8 +236,8 @@
field_onthefly: On-the-fly brukeropprettelse field_onthefly: On-the-fly brukeropprettelse
field_start_date: Start field_start_date: Start
field_done_ratio: "% Ferdig" field_done_ratio: "% Ferdig"
field_auth_source: Autentifikasjonsmodus field_auth_source: Autentiseringskilde
field_hide_mail: Skjul min e-post-adresse field_hide_mail: Skjul min epost-adresse
field_comments: Kommentarer field_comments: Kommentarer
field_url: URL field_url: URL
field_start_page: Startside field_start_page: Startside
@@ -247,7 +247,7 @@
field_spent_on: Dato field_spent_on: Dato
field_identifier: Identifikasjon field_identifier: Identifikasjon
field_is_filter: Brukes som filter field_is_filter: Brukes som filter
field_issue_to: Relatert saker field_issue_to: Relaterte saker
field_delay: Forsinkelse field_delay: Forsinkelse
field_assignable: Saker kan tildeles denne rollen field_assignable: Saker kan tildeles denne rollen
field_redirect_existing_links: Viderekoble eksisterende lenker field_redirect_existing_links: Viderekoble eksisterende lenker
@@ -266,24 +266,24 @@
setting_self_registration: Selvregistrering setting_self_registration: Selvregistrering
setting_attachment_max_size: Maks. størrelse vedlegg setting_attachment_max_size: Maks. størrelse vedlegg
setting_issues_export_limit: Eksportgrense for saker setting_issues_export_limit: Eksportgrense for saker
setting_mail_from: Avsenders e-post setting_mail_from: Avsenders epost
setting_bcc_recipients: Blindkopi (bcc) til mottakere setting_bcc_recipients: Blindkopi (bcc) til mottakere
setting_host_name: Vertsnavn setting_host_name: Vertsnavn
setting_text_formatting: Tekstformattering setting_text_formatting: Tekstformattering
setting_wiki_compression: Komprimering av Wiki-historikk setting_wiki_compression: Komprimering av Wiki-historikk
setting_feeds_limit: Innholdsgrense for Feed setting_feeds_limit: Innholdsgrense for Feed
setting_default_projects_public: Nye prosjekter er offentlige som standard setting_default_projects_public: Nye prosjekter er offentlige som standard
setting_autofetch_changesets: Autohenting av innsendinger setting_autofetch_changesets: Autohenting av endringssett
setting_sys_api_enabled: Aktiver webservice for depot-administrasjon setting_sys_api_enabled: Aktiver webservice for depot-administrasjon
setting_commit_ref_keywords: Nøkkelord for referanse setting_commit_ref_keywords: Nøkkelord for referanse
setting_commit_fix_keywords: Nøkkelord for retting setting_commit_fix_keywords: Nøkkelord for retting
setting_autologin: Autoinnlogging setting_autologin: Autoinnlogging
setting_date_format: Datoformat setting_date_format: Datoformat
setting_time_format: Tidsformat setting_time_format: Tidsformat
setting_cross_project_issue_relations: Tillat saksrelasjoner mellom prosjekter setting_cross_project_issue_relations: Tillat saksrelasjoner på kryss av prosjekter
setting_issue_list_default_columns: Standardkolonner vist i sakslisten setting_issue_list_default_columns: Standardkolonner vist i sakslisten
setting_repositories_encodings: Depot-tegnsett setting_repositories_encodings: Depot-tegnsett
setting_emails_footer: E-post-signatur setting_emails_footer: Epost-signatur
setting_protocol: Protokoll setting_protocol: Protokoll
setting_per_page_options: Alternativer, objekter pr. side setting_per_page_options: Alternativer, objekter pr. side
setting_user_format: Visningsformat, brukere setting_user_format: Visningsformat, brukere
@@ -291,8 +291,8 @@
setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard
setting_enabled_scm: Aktiviserte SCM setting_enabled_scm: Aktiviserte SCM
project_module_issue_tracking: Sakssporing project_module_issue_tracking: Sakshåndtering
project_module_time_tracking: Tidssporing project_module_time_tracking: Tidsregistrering
project_module_news: Nyheter project_module_news: Nyheter
project_module_documents: Dokumenter project_module_documents: Dokumenter
project_module_files: Filer project_module_files: Filer
@@ -326,7 +326,7 @@
label_role: Rolle label_role: Rolle
label_role_plural: Roller label_role_plural: Roller
label_role_new: Ny rolle label_role_new: Ny rolle
label_role_and_permissions: Roller og tillatelser label_role_and_permissions: Roller og rettigheter
label_member: Medlem label_member: Medlem
label_member_new: Nytt medlem label_member_new: Nytt medlem
label_member_plural: Medlemmer label_member_plural: Medlemmer
@@ -343,7 +343,7 @@
label_custom_field: Eget felt label_custom_field: Eget felt
label_custom_field_plural: Egne felt label_custom_field_plural: Egne felt
label_custom_field_new: Nytt eget felt label_custom_field_new: Nytt eget felt
label_enumerations: Kodelister label_enumerations: Listeverdier
label_enumeration_new: Ny verdi label_enumeration_new: Ny verdi
label_information: Informasjon label_information: Informasjon
label_information_plural: Informasjon label_information_plural: Informasjon
@@ -367,10 +367,10 @@
label_new: Ny label_new: Ny
label_logged_as: Innlogget som label_logged_as: Innlogget som
label_environment: Miljø label_environment: Miljø
label_authentication: Autentifikasjon label_authentication: Autentisering
label_auth_source: Autentifikasjonsmodus label_auth_source: Autentiseringskilde
label_auth_source_new: Ny autentifikasjonmodus label_auth_source_new: Ny autentiseringskilde
label_auth_source_plural: Autentifikasjonsmoduser label_auth_source_plural: Autentiseringskilder
label_subproject_plural: Underprosjekter label_subproject_plural: Underprosjekter
label_and_its_subprojects: "%{value} og dets underprosjekter" label_and_its_subprojects: "%{value} og dets underprosjekter"
label_min_max_length: Min.-maks. lengde label_min_max_length: Min.-maks. lengde
@@ -423,13 +423,13 @@
one: 1 åpen one: 1 åpen
other: "%{count} åpne" other: "%{count} åpne"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 lukka zero: 0 lukket
one: 1 lukka one: 1 lukket
other: "%{count} lukka" other: "%{count} lukket"
label_total: Totalt label_total: Totalt
label_permissions: Godkjenninger label_permissions: Rettigheter
label_current_status: Nåværende status label_current_status: Nåværende status
label_new_statuses_allowed: Tillatte nye statuser label_new_statuses_allowed: Tillate nye statuser
label_all: alle label_all: alle
label_none: ingen label_none: ingen
label_nobody: ingen label_nobody: ingen
@@ -437,7 +437,7 @@
label_previous: Forrige label_previous: Forrige
label_used_by: Brukt av label_used_by: Brukt av
label_details: Detaljer label_details: Detaljer
label_add_note: Legg til notis label_add_note: Legg til notat
label_per_page: Pr. side label_per_page: Pr. side
label_calendar: Kalender label_calendar: Kalender
label_months_from: måneder fra label_months_from: måneder fra
@@ -449,7 +449,7 @@
label_comment: Kommentar label_comment: Kommentar
label_comment_plural: Kommentarer label_comment_plural: Kommentarer
label_x_comments: label_x_comments:
zero: no kommentarer zero: ingen kommentarer
one: 1 kommentar one: 1 kommentar
other: "%{count} kommentarer" other: "%{count} kommentarer"
label_comment_add: Legg til kommentar label_comment_add: Legg til kommentar
@@ -518,11 +518,11 @@
label_preview: Forhåndsvis label_preview: Forhåndsvis
label_feed_plural: Feeder label_feed_plural: Feeder
label_changes_details: Detaljer om alle endringer label_changes_details: Detaljer om alle endringer
label_issue_tracking: Sakssporing label_issue_tracking: Sakshåndtering
label_spent_time: Brukt tid label_spent_time: Brukt tid
label_f_hour: "%{value} time" label_f_hour: "%{value} time"
label_f_hour_plural: "%{value} timer" label_f_hour_plural: "%{value} timer"
label_time_tracking: Tidssporing label_time_tracking: Tidsregistrering
label_change_plural: Endringer label_change_plural: Endringer
label_statistics: Statistikk label_statistics: Statistikk
label_commits_per_month: Innsendinger pr. måned label_commits_per_month: Innsendinger pr. måned
@@ -532,7 +532,7 @@
label_diff_side_by_side: side ved side label_diff_side_by_side: side ved side
label_options: Alternativer label_options: Alternativer
label_copy_workflow_from: Kopier arbeidsflyt fra label_copy_workflow_from: Kopier arbeidsflyt fra
label_permissions_report: Godkjenningsrapport label_permissions_report: Rettighetsrapport
label_watched_issues: Overvåkede saker label_watched_issues: Overvåkede saker
label_related_issues: Relaterte saker label_related_issues: Relaterte saker
label_applied_status: Gitt status label_applied_status: Gitt status
@@ -571,7 +571,7 @@
label_date_to: Til label_date_to: Til
label_language_based: Basert på brukerens språk label_language_based: Basert på brukerens språk
label_sort_by: "Sorter etter %{value}" label_sort_by: "Sorter etter %{value}"
label_send_test_email: Send en e-post-test label_send_test_email: Send en epost-test
label_feeds_access_key_created_on: "RSS tilgangsnøkkel opprettet for %{value} siden" label_feeds_access_key_created_on: "RSS tilgangsnøkkel opprettet for %{value} siden"
label_module_plural: Moduler label_module_plural: Moduler
label_added_time_by: "Lagt til av %{author} for %{age} siden" label_added_time_by: "Lagt til av %{author} for %{age} siden"
@@ -598,7 +598,7 @@
label_more: Mer label_more: Mer
label_scm: SCM label_scm: SCM
label_plugins: Tillegg label_plugins: Tillegg
label_ldap_authentication: LDAP-autentifikasjon label_ldap_authentication: LDAP-autentisering
label_downloads_abbr: Nedl. label_downloads_abbr: Nedl.
label_optional_description: Valgfri beskrivelse label_optional_description: Valgfri beskrivelse
label_add_another_file: Legg til en fil til label_add_another_file: Legg til en fil til
@@ -650,7 +650,7 @@
status_locked: låst status_locked: låst
text_select_mail_notifications: Velg hendelser som skal varsles med e-post. text_select_mail_notifications: Velg hendelser som skal varsles med e-post.
text_regexp_info: eg. ^[A-Z0-9]+$ text_regexp_info: f.eks. ^[A-Z0-9]+$
text_min_max_length_info: 0 betyr ingen begrensning text_min_max_length_info: 0 betyr ingen begrensning
text_project_destroy_confirmation: Er du sikker på at du vil slette dette prosjekter og alle relatert data ? text_project_destroy_confirmation: Er du sikker på at du vil slette dette prosjekter og alle relatert data ?
text_subprojects_destroy_warning: "Underprojekt(ene): %{value} vil også bli slettet." text_subprojects_destroy_warning: "Underprojekt(ene): %{value} vil også bli slettet."
@@ -667,8 +667,8 @@
text_unallowed_characters: Ugyldige tegn text_unallowed_characters: Ugyldige tegn
text_comma_separated: Flere verdier tillat (kommaseparert). text_comma_separated: Flere verdier tillat (kommaseparert).
text_issues_ref_in_commit_messages: Referering og retting av saker i innsendingsmelding text_issues_ref_in_commit_messages: Referering og retting av saker i innsendingsmelding
text_issue_added: "Issue %{id} has been reported by %{author}." text_issue_added: "Sak %{id} er innrapportert av %{author}."
text_issue_updated: "Issue %{id} has been updated by %{author}." text_issue_updated: "Sak %{id} er oppdatert av %{author}."
text_wiki_destroy_confirmation: Er du sikker på at du vil slette denne wikien og alt innholdet ? text_wiki_destroy_confirmation: Er du sikker på at du vil slette denne wikien og alt innholdet ?
text_issue_category_destroy_question: "Noen saker (%{count}) er lagt til i denne kategorien. Hva vil du gjøre ?" text_issue_category_destroy_question: "Noen saker (%{count}) er lagt til i denne kategorien. Hva vil du gjøre ?"
text_issue_category_destroy_assignments: Fjern bruk av kategorier text_issue_category_destroy_assignments: Fjern bruk av kategorier
@@ -695,12 +695,12 @@
default_tracker_feature: Funksjon default_tracker_feature: Funksjon
default_tracker_support: Support default_tracker_support: Support
default_issue_status_new: Ny default_issue_status_new: Ny
default_issue_status_in_progress: In Progress default_issue_status_in_progress: Pågår
default_issue_status_resolved: Avklart default_issue_status_resolved: Avklart
default_issue_status_feedback: Tilbakemelding default_issue_status_feedback: Tilbakemelding
default_issue_status_closed: Lukket default_issue_status_closed: Lukket
default_issue_status_rejected: Avvist default_issue_status_rejected: Avvist
default_doc_category_user: Bruker-dokumentasjon default_doc_category_user: Brukerdokumentasjon
default_doc_category_tech: Teknisk dokumentasjon default_doc_category_tech: Teknisk dokumentasjon
default_priority_low: Lav default_priority_low: Lav
default_priority_normal: Normal default_priority_normal: Normal
@@ -711,16 +711,16 @@
default_activity_development: Utvikling default_activity_development: Utvikling
enumeration_issue_priorities: Sakssprioriteringer enumeration_issue_priorities: Sakssprioriteringer
enumeration_doc_categories: Dokument-kategorier enumeration_doc_categories: Dokumentkategorier
enumeration_activities: Aktiviteter (tidssporing) enumeration_activities: Aktiviteter (tidsregistrering)
text_enumeration_category_reassign_to: 'Endre dem til denne verdien:' text_enumeration_category_reassign_to: 'Endre dem til denne verdien:'
text_enumeration_destroy_question: "%{count} objekter er endret til denne verdien." text_enumeration_destroy_question: "%{count} objekter er endret til denne verdien."
label_incoming_emails: Innkommende e-post label_incoming_emails: Innkommende e-post
label_generate_key: Generer en nøkkel label_generate_key: Generer en nøkkel
setting_mail_handler_api_enabled: Skru på WS for innkommende e-post setting_mail_handler_api_enabled: Skru på WS for innkommende epost
setting_mail_handler_api_key: API-nøkkel setting_mail_handler_api_key: API-nøkkel
text_email_delivery_not_configured: "Levering av e-post er ikke satt opp, og varsler er skrudd av.\nStill inn din SMTP-tjener i config/configuration.yml og start programmet på nytt for å skru det på." text_email_delivery_not_configured: "Levering av epost er ikke satt opp, og varsler er skrudd av.\nStill inn din SMTP-tjener i config/configuration.yml og start programmet på nytt for å skru det på."
field_parent_title: Foreldreside field_parent_title: Overordnet side
label_issue_watchers: Overvåkere label_issue_watchers: Overvåkere
button_quote: Sitat button_quote: Sitat
setting_sequential_project_identifiers: Generer sekvensielle prosjekt-IDer setting_sequential_project_identifiers: Generer sekvensielle prosjekt-IDer
@@ -731,39 +731,39 @@
permission_view_files: Vise filer permission_view_files: Vise filer
permission_edit_issues: Redigere saker permission_edit_issues: Redigere saker
permission_edit_own_time_entries: Redigere egne timelister permission_edit_own_time_entries: Redigere egne timelister
permission_manage_public_queries: Behandle delte søk permission_manage_public_queries: Administrere delte søk
permission_add_issues: Legge inn saker permission_add_issues: Legge inn saker
permission_log_time: Loggføre timer permission_log_time: Loggføre timer
permission_view_changesets: Vise endringssett permission_view_changesets: Vise endringssett
permission_view_time_entries: Vise brukte timer permission_view_time_entries: Vise brukte timer
permission_manage_versions: Behandle versjoner permission_manage_versions: Administrere versjoner
permission_manage_wiki: Behandle wiki permission_manage_wiki: Administrere wiki
permission_manage_categories: Behandle kategorier for saker permission_manage_categories: Administrere kategorier for saker
permission_protect_wiki_pages: Beskytte wiki-sider permission_protect_wiki_pages: Beskytte wiki-sider
permission_comment_news: Kommentere nyheter permission_comment_news: Kommentere nyheter
permission_delete_messages: Slette meldinger permission_delete_messages: Slette meldinger
permission_select_project_modules: Velge prosjekt-moduler permission_select_project_modules: Velge prosjektmoduler
permission_manage_documents: Behandle dokumenter permission_manage_documents: Administrere dokumenter
permission_edit_wiki_pages: Redigere wiki-sider permission_edit_wiki_pages: Redigere wiki-sider
permission_add_issue_watchers: Legge til overvåkere permission_add_issue_watchers: Legge til overvåkere
permission_view_gantt: Vise gantt-diagram permission_view_gantt: Vise gantt-diagram
permission_move_issues: Flytte saker permission_move_issues: Flytte saker
permission_manage_issue_relations: Behandle saksrelasjoner permission_manage_issue_relations: Administrere saksrelasjoner
permission_delete_wiki_pages: Slette wiki-sider permission_delete_wiki_pages: Slette wiki-sider
permission_manage_boards: Behandle forum permission_manage_boards: Administrere forum
permission_delete_wiki_pages_attachments: Slette vedlegg permission_delete_wiki_pages_attachments: Slette vedlegg
permission_view_wiki_edits: Vise wiki-historie permission_view_wiki_edits: Vise wiki-historie
permission_add_messages: Sende meldinger permission_add_messages: Sende meldinger
permission_view_messages: Vise meldinger permission_view_messages: Vise meldinger
permission_manage_files: Behandle filer permission_manage_files: Administrere filer
permission_edit_issue_notes: Redigere notater permission_edit_issue_notes: Redigere notater
permission_manage_news: Behandle nyheter permission_manage_news: Administrere nyheter
permission_view_calendar: Vise kalender permission_view_calendar: Vise kalender
permission_manage_members: Behandle medlemmer permission_manage_members: Administrere medlemmer
permission_edit_messages: Redigere meldinger permission_edit_messages: Redigere meldinger
permission_delete_issues: Slette saker permission_delete_issues: Slette saker
permission_view_issue_watchers: Vise liste over overvåkere permission_view_issue_watchers: Vise liste over overvåkere
permission_manage_repository: Behandle depot permission_manage_repository: Administrere depot
permission_commit_access: Tilgang til innsending permission_commit_access: Tilgang til innsending
permission_browse_repository: Bla gjennom depot permission_browse_repository: Bla gjennom depot
permission_view_documents: Vise dokumenter permission_view_documents: Vise dokumenter
@@ -777,189 +777,191 @@
setting_gravatar_enabled: Bruk Gravatar-brukerikoner setting_gravatar_enabled: Bruk Gravatar-brukerikoner
label_example: Eksempel label_example: Eksempel
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped." text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
permission_edit_own_messages: Edit own messages permission_edit_own_messages: Rediger egne meldinger
permission_delete_own_messages: Delete own messages permission_delete_own_messages: Slett egne meldinger
label_user_activity: "%{value}'s activity" label_user_activity: "%{value}s aktivitet"
label_updated_time_by: "Updated by %{author} %{age} ago" label_updated_time_by: "Oppdatert av %{author} for %{age} siden"
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.' text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
setting_diff_max_lines_displayed: Max number of diff lines displayed setting_diff_max_lines_displayed: Max number of diff lines displayed
text_plugin_assets_writable: Plugin assets directory writable text_plugin_assets_writable: Plugin assets directory writable
warning_attachments_not_saved: "%{count} file(s) could not be saved." warning_attachments_not_saved: "%{count} fil(er) kunne ikke lagres."
button_create_and_continue: Create and continue button_create_and_continue: Opprett og fortsett
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'En linje for hver verdi'
label_display: Display label_display: Visning
field_editable: Editable field_editable: Redigerbar
setting_repository_log_display_limit: Maximum number of revisions displayed on file log setting_repository_log_display_limit: Maks antall revisjoner vist i fil-loggen
setting_file_max_size_displayed: Max size of text files displayed inline setting_file_max_size_displayed: Max size of text files displayed inline
field_watcher: Watcher field_watcher: Overvåker
setting_openid: Allow OpenID login and registration setting_openid: Tillat OpenID innlogging og registrering
field_identity_url: OpenID URL field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID label_login_with_open_id_option: eller logg inn med OpenID
field_content: Content field_content: Innhold
label_descending: Descending label_descending: Synkende
label_sort: Sort label_sort: Sorter
label_ascending: Ascending label_ascending: Stigende
label_date_from_to: From %{start} to %{end} label_date_from_to: Fra %{start} til %{end}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? text_wiki_page_destroy_question: Denne siden har %{descendants} underside(r). Hva ønsker du å gjøre?
text_wiki_page_reassign_children: Reassign child pages to this parent page text_wiki_page_reassign_children: Tilknytt undersider til denne overordnede siden
text_wiki_page_nullify_children: Keep child pages as root pages text_wiki_page_nullify_children: Behold undersider som rotsider
text_wiki_page_destroy_children: Delete child pages and all their descendants text_wiki_page_destroy_children: Slett undersider og alle deres underliggende sider
setting_password_min_length: Minimum password length setting_password_min_length: Minimum passordlengde
field_group_by: Group results by field_group_by: Grupper resultater etter
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" mail_subject_wiki_content_updated: "Wiki-side '%{id}' er oppdatert"
label_wiki_content_added: Wiki page added label_wiki_content_added: Wiki-side opprettet
mail_subject_wiki_content_added: "'%{id}' wiki page has been added" mail_subject_wiki_content_added: "Wiki-side '%{id}' er opprettet"
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}. mail_body_wiki_content_added: Wiki-siden '%{id}' ble opprettet av %{author}.
label_wiki_content_updated: Wiki page updated label_wiki_content_updated: Wiki-side oppdatert
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}. mail_body_wiki_content_updated: Wiki-siden '%{id}' ble oppdatert av %{author}.
permission_add_project: Create project permission_add_project: Opprett prosjekt
setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_new_project_user_role_id: Rolle gitt en ikke-administratorbruker som oppretter et prosjekt
label_view_all_revisions: View all revisions label_view_all_revisions: Se alle revisjoner
label_tag: Tag label_tag: Tag
label_branch: Branch label_branch: Gren
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. error_no_tracker_in_project: Ingen sakstyper er tilknyttet dette prosjektet. Vennligst kontroller prosjektets innstillinger.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). error_no_default_issue_status: Ingen standard saksstatus er angitt. Vennligst kontroller konfigurasjonen (Gå til "Administrasjon -> Saksstatuser").
text_journal_changed: "%{label} changed from %{old} to %{new}" text_journal_changed: "%{label} endret fra %{old} til %{new}"
text_journal_set_to: "%{label} set to %{value}" text_journal_set_to: "%{label} satt til %{value}"
text_journal_deleted: "%{label} deleted (%{old})" text_journal_deleted: "%{label} slettet (%{old})"
label_group_plural: Groups label_group_plural: Grupper
label_group: Group label_group: Gruppe
label_group_new: New group label_group_new: Ny gruppe
label_time_entry_plural: Spent time label_time_entry_plural: Brukt tid
text_journal_added: "%{label} %{value} added" text_journal_added: "%{label} %{value} lagt til"
field_active: Active field_active: Aktiv
enumeration_system_activity: System Activity enumeration_system_activity: Systemaktivitet
permission_delete_issue_watchers: Delete watchers permission_delete_issue_watchers: Slett overvåkere
version_status_closed: closed version_status_closed: stengt
version_status_locked: locked version_status_locked: låst
version_status_open: open version_status_open: åpen
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened error_can_not_reopen_issue_on_closed_version: En sak tilknyttet en stengt versjon kan ikke gjenåpnes.
label_user_anonymous: Anonymous label_user_anonymous: Anonym
button_move_and_follow: Move and follow button_move_and_follow: Flytt og følg etter
setting_default_projects_modules: Default enabled modules for new projects setting_default_projects_modules: Standard aktiverte moduler for nye prosjekter
setting_gravatar_default: Default Gravatar image setting_gravatar_default: Standard Gravatar-bilde
field_sharing: Sharing field_sharing: Deling
label_version_sharing_hierarchy: With project hierarchy label_version_sharing_hierarchy: Med prosjekt-hierarki
label_version_sharing_system: With all projects label_version_sharing_system: Med alle prosjekter
label_version_sharing_descendants: With subprojects label_version_sharing_descendants: Med underprosjekter
label_version_sharing_tree: With project tree label_version_sharing_tree: Med prosjekt-tre
label_version_sharing_none: Not shared label_version_sharing_none: Ikke delt
error_can_not_archive_project: This project can not be archived error_can_not_archive_project: Dette prosjektet kan ikke arkiveres
button_duplicate: Duplicate button_duplicate: Duplikat
button_copy_and_follow: Copy and follow button_copy_and_follow: Kopier og følg etter
label_copy_source: Source label_copy_source: Kilde
setting_issue_done_ratio: Calculate the issue done ratio with setting_issue_done_ratio: Kalkuler ferdigstillingsprosent ut i fra
setting_issue_done_ratio_issue_status: Use the issue status setting_issue_done_ratio_issue_status: Bruk saksstatuser
error_issue_done_ratios_not_updated: Issue done ratios not updated. error_issue_done_ratios_not_updated: Ferdigstillingsprosent oppdateres ikke.
error_workflow_copy_target: Please select target tracker(s) and role(s) error_workflow_copy_target: Vennligst velg sakstype(r) og rolle(r)
setting_issue_done_ratio_issue_field: Use the issue field setting_issue_done_ratio_issue_field: Bruk felt fra saker
label_copy_same_as_target: Same as target label_copy_same_as_target: Samme som mål
label_copy_target: Target label_copy_target: Mål
notice_issue_done_ratios_updated: Issue done ratios updated. notice_issue_done_ratios_updated: Ferdigstillingsprosent oppdatert.
error_workflow_copy_source: Please select a source tracker or role error_workflow_copy_source: Vennligst velg en kilde-sakstype eller rolle.
label_update_issue_done_ratios: Update issue done ratios label_update_issue_done_ratios: Oppdatert ferdigstillingsprosent
setting_start_of_week: Start calendars on setting_start_of_week: Start kalender på
permission_view_issues: View Issues permission_view_issues: Se på saker
label_display_used_statuses_only: Only display statuses that are used by this tracker label_display_used_statuses_only: Vis kun statuser som brukes av denne sakstypen
label_revision_id: Revision %{value} label_revision_id: Revision %{value}
label_api_access_key: API access key label_api_access_key: API tilgangsnøkkel
label_api_access_key_created_on: API access key created %{value} ago label_api_access_key_created_on: API tilgangsnøkkel opprettet for %{value} siden
label_feeds_access_key: RSS access key label_feeds_access_key: RSS tilgangsnøkkel
notice_api_access_key_reseted: Your API access key was reset. notice_api_access_key_reseted: Din API tilgangsnøkkel ble resatt.
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Aktiver REST webservice
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Mangler en API tilgangsnøkkel
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Mangler en RSS tilgangsnøkkel
button_show: Show button_show: Vis
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Flere verdier er tillatt (en linje per verdi).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Avkort epost etter en av disse linjene
permission_add_subprojects: Create subprojects permission_add_subprojects: Opprett underprosjekt
label_subproject_new: New subproject label_subproject_new: Nytt underprosjekt
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that. Du er i ferd med å fjerne noen eller alle rettigheter og vil kanskje ikke være i stand til å redigere dette prosjektet etterpå.
Are you sure you want to continue? Er du sikker på at du vil fortsette?
label_close_versions: Close completed versions label_close_versions: Steng fullførte versjoner
label_board_sticky: Sticky label_board_sticky: Fast
label_board_locked: Locked label_board_locked: Låst
permission_export_wiki_pages: Export wiki pages permission_export_wiki_pages: Eksporter wiki-sider
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Mellomlagre formattert tekst
permission_manage_project_activities: Manage project activities permission_manage_project_activities: Administrere prosjektaktiviteter
error_unable_delete_issue_status: Unable to delete issue status error_unable_delete_issue_status: Kan ikke slette saksstatus
label_profile: Profile label_profile: Profil
permission_manage_subtasks: Manage subtasks permission_manage_subtasks: Administrere undersaker
field_parent_issue: Parent task field_parent_issue: Overordnet sak
label_subtask_plural: Subtasks label_subtask_plural: Undersaker
label_project_copy_notifications: Send email notifications during the project copy label_project_copy_notifications: Send epost-varslinger under prosjektkopiering
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Kan ikke slette eget felt
error_unable_to_connect: Unable to connect (%{value}) error_unable_to_connect: Kunne ikke koble til (%{value})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Denne rollen er i bruk og kan ikke slettes.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Denne sakstypen inneholder saker og kan ikke slettes.
field_principal: Principal field_principal: Principal
label_my_page_block: My page block label_my_page_block: Min side felt
notice_failed_to_save_members: "Failed to save member(s): %{errors}." notice_failed_to_save_members: "Feil ved lagring av medlem(mer): %{errors}."
text_zoom_out: Zoom out text_zoom_out: Zoom ut
text_zoom_in: Zoom in text_zoom_in: Zoom inn
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Kan ikke slette oppføring fra timeliste.
label_overall_spent_time: Overall spent time label_overall_spent_time: All tidsbruk
field_time_entries: Log time field_time_entries: Loggfør tid
project_module_gantt: Gantt project_module_gantt: Gantt
project_module_calendar: Calendar project_module_calendar: Kalender
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_edit_associated_wikipage: "Rediger tilhørende Wiki-side: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Slett sak og alle undersaker?
field_text: Text field field_text: Tekstfelt
label_user_mail_option_only_owner: Only for things I am the owner of label_user_mail_option_only_owner: Kun for ting jeg eier
setting_default_notification_option: Default notification option setting_default_notification_option: Standardvalg for varslinger
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_my_events: Kun for ting jeg overvåker eller er involvert i
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_assigned: Kun for ting jeg er tildelt
label_user_mail_option_none: No events label_user_mail_option_none: Ingen hendelser
field_member_of_group: Assignee's group field_member_of_group: Den tildeltes gruppe
field_assigned_to_role: Assignee's role field_assigned_to_role: Den tildeltes rolle
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: Prosjektet du forsøker å åpne er blitt arkivert.
label_principal_search: "Search for user or group:" label_principal_search: "Søk etter bruker eller gruppe:"
label_user_search: "Search for user:" label_user_search: "Søk etter bruker:"
field_visible: Visible field_visible: Synlig
setting_emails_header: Emails header setting_emails_header: Eposthode
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Aktivitet for logget tid.
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Lagt til i endringssett %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Muliggjør loggføring av tid
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: Diagrammet ble avkortet fordi det overstiger det maksimale antall elementer som kan vises (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Maksimalt antall elementer vist på gantt-diagrammet
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: Vis meg en advarsel når jeg forlater en side med ikke lagret tekst
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: Den gjeldende siden inneholder tekst som ikke er lagret, som vil bli tapt hvis du forlater denne siden.
label_my_queries: My custom queries label_my_queries: Mine egne spørringer
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} oppdatert"
label_news_comment_added: Comment added to a news label_news_comment_added: Kommentar lagt til en nyhet
button_expand_all: Expand all button_expand_all: Utvid alle
button_collapse_all: Collapse all button_collapse_all: Kollaps alle
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Ytterligere overganger tillatt når brukeren er sakens tildelte
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Ytterligere overganger tillatt når brukeren er den som har opprettet saken
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: Masserediger valgte timeliste-oppføringer
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: Er du sikker på du vil slette de(n) valgte timeliste-oppføringen(e)?
label_role_anonymous: Anonymous label_role_anonymous: Anonym
label_role_non_member: Non member label_role_non_member: Ikke medlem
label_issue_note_added: Note added label_issue_note_added: Notat lagt til
label_issue_status_updated: Status updated label_issue_status_updated: Status oppdatert
label_issue_priority_updated: Priority updated label_issue_priority_updated: Prioritet oppdatert
label_issues_visibility_own: Issues created by or assigned to the user label_issues_visibility_own: Saker opprettet av eller tildelt brukeren
field_issues_visibility: Issues visibility field_issues_visibility: Synlighet på saker
label_issues_visibility_all: All issues label_issues_visibility_all: Alle saker
permission_set_own_issues_private: Set own issues public or private permission_set_own_issues_private: Gjør egne saker offentlige eller private
field_is_private: Private field_is_private: Privat
permission_set_issues_private: Set issues public or private permission_set_issues_private: Gjør saker offentlige eller private
label_issues_visibility_public: All non private issues label_issues_visibility_public: Alle ikke-private saker
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: Dette vil også slette %{count} undersak(er).
field_commit_logs_encoding: Tegnkoding for innsendingsmeldinger field_commit_logs_encoding: Tegnkoding for innsendingsmeldinger
field_scm_path_encoding: Path encoding field_scm_path_encoding: Koding av sti
text_scm_path_encoding_note: "Default: UTF-8" text_scm_path_encoding_note: "Standard: UTF-8"
field_path_to_repository: Path to repository field_path_to_repository: Sti til depot
field_root_directory: Root directory field_root_directory: Rotkatalog
field_cvs_module: Module field_cvs_module: Modul
field_cvsroot: CVSROOT field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo) text_mercurial_repository_note: Lokalt depot (f.eks. /hgrepo, c:\hgrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) text_scm_command: Kommando
text_scm_command: Command text_scm_command_version: Versjon
text_scm_command_version: Version label_git_report_last_commit: Rapporter siste innsending for filer og kataloger
label_git_report_last_commit: Report last commit for files and directories text_scm_config: Du kan konfigurere scm kommandoer i config/configuration.yml. Vennligst restart applikasjonen etter å ha redigert filen.
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: Scm kommando er ikke tilgjengelig. Vennligst kontroller innstillingene i administrasjonspanelet.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_git_repository_note: Depot er bart og lokalt (f.eks. /gitrepo, c:\gitrepo)
+1 -1
View File
@@ -961,7 +961,7 @@ pt-BR:
setting_commit_logtime_enabled: Habilitar registro de horas setting_commit_logtime_enabled: Habilitar registro de horas
notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max}) notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max})
setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt
field_warn_on_leaving_unsaved: Alertar-me ao sarir de uma página sem salvar o texto field_warn_on_leaving_unsaved: Alertar-me ao sair de uma página sem salvar o texto
text_warn_on_leaving_unsaved: A página atual contem texto que não foi salvo e será perdido se você sair desta página. text_warn_on_leaving_unsaved: A página atual contem texto que não foi salvo e será perdido se você sair desta página.
label_my_queries: Minhas consultas personalizadas label_my_queries: Minhas consultas personalizadas
text_journal_changed_no_detail: "%{label} atualizado(a)" text_journal_changed_no_detail: "%{label} atualizado(a)"
+236 -234
View File
@@ -9,12 +9,12 @@ sl:
short: "%b %d" short: "%b %d"
long: "%B %d, %Y" long: "%B %d, %Y"
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] day_names: [Nedelja, Ponedeljek, Torek, Sreda, Četrtek, Petek, Sobota]
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] abbr_day_names: [Ned, Pon, To, Sr, Čet, Pet, Sob]
# Don't forget the nil at the beginning; there's no such thing as a 0th month # Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] month_names: [~, Januar, Februar, Marec, April, Maj, Junij, Julij, Avgust, September, Oktober, November, December]
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Aug, Sep, Okt, Nov, Dec]
# Used in date_select and datime_select. # Used in date_select and datime_select.
order: order:
- :year - :year
@@ -32,40 +32,40 @@ sl:
datetime: datetime:
distance_in_words: distance_in_words:
half_a_minute: "half a minute" half_a_minute: "pol minute"
less_than_x_seconds: less_than_x_seconds:
one: "less than 1 second" one: "manj kot 1. sekundo"
other: "less than %{count} seconds" other: "manj kot %{count} sekund"
x_seconds: x_seconds:
one: "1 second" one: "1. sekunda"
other: "%{count} seconds" other: "%{count} sekund"
less_than_x_minutes: less_than_x_minutes:
one: "less than a minute" one: "manj kot minuto"
other: "less than %{count} minutes" other: "manj kot %{count} minut"
x_minutes: x_minutes:
one: "1 minute" one: "1 minuta"
other: "%{count} minutes" other: "%{count} minut"
about_x_hours: about_x_hours:
one: "about 1 hour" one: "okrog 1. ure"
other: "about %{count} hours" other: "okrog %{count} ur"
x_days: x_days:
one: "1 day" one: "1 dan"
other: "%{count} days" other: "%{count} dni"
about_x_months: about_x_months:
one: "about 1 month" one: "okrog 1. mesec"
other: "about %{count} months" other: "okrog %{count} mesecev"
x_months: x_months:
one: "1 month" one: "1 mesec"
other: "%{count} months" other: "%{count} mesecev"
about_x_years: about_x_years:
one: "about 1 year" one: "okrog 1. leto"
other: "about %{count} years" other: "okrog %{count} let"
over_x_years: over_x_years:
one: "over 1 year" one: "več kot 1. leto"
other: "over %{count} years" other: "več kot %{count} let"
almost_x_years: almost_x_years:
one: "almost 1 year" one: "skoraj 1. leto"
other: "almost %{count} years" other: "skoraj %{count} let"
number: number:
format: format:
@@ -90,15 +90,15 @@ sl:
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
sentence_connector: "and" sentence_connector: "in"
skip_last_comma: false skip_last_comma: false
activerecord: activerecord:
errors: errors:
template: template:
header: header:
one: "1 error prohibited this %{model} from being saved" one: "1. napaka je preprečila temu %{model} da bi se shranil"
other: "%{count} errors prohibited this %{model} from being saved" other: "%{count} napak je preprečilo temu %{model} da bi se shranil"
messages: messages:
inclusion: "ni vključen na seznamu" inclusion: "ni vključen na seznamu"
exclusion: "je rezerviran" exclusion: "je rezerviran"
@@ -113,17 +113,17 @@ sl:
taken: "je že zaseden" taken: "je že zaseden"
not_a_number: "ni število" not_a_number: "ni število"
not_a_date: "ni veljaven datum" not_a_date: "ni veljaven datum"
greater_than: "must be greater than %{count}" greater_than: "mora biti večji kot %{count}"
greater_than_or_equal_to: "must be greater than or equal to %{count}" greater_than_or_equal_to: "mora biti večji ali enak kot %{count}"
equal_to: "must be equal to %{count}" equal_to: "mora biti enak kot %{count}"
less_than: "must be less than %{count}" less_than: "mora biti manjši kot %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}" less_than_or_equal_to: "mora biti manjši ali enak kot %{count}"
odd: "must be odd" odd: "mora biti sodo"
even: "must be even" even: "mora biti liho"
greater_than_start_date: "mora biti kasnejši kot začeten datum" greater_than_start_date: "mora biti kasnejši kot začetni datum"
not_same_project: "ne pripada istemu projektu" not_same_project: "ne pripada istemu projektu"
circular_dependency: "Ta odnos bi povzročil krožno odvisnost" circular_dependency: "Ta odnos bi povzročil krožno odvisnost"
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks" cant_link_an_issue_with_a_descendant: "Zahtevek ne more biti povezan s svojo podnalogo"
actionview_instancetag_blank_option: Prosimo izberite actionview_instancetag_blank_option: Prosimo izberite
@@ -372,9 +372,9 @@ sl:
label_project_new: Nov projekt label_project_new: Nov projekt
label_project_plural: Projekti label_project_plural: Projekti
label_x_projects: label_x_projects:
zero: no projects zero: ni projektov
one: 1 project one: 1 projekt
other: "%{count} projects" other: "%{count} projektov"
label_project_all: Vsi projekti label_project_all: Vsi projekti
label_project_latest: Zadnji projekti label_project_latest: Zadnji projekti
label_issue: Zahtevek label_issue: Zahtevek
@@ -476,22 +476,22 @@ sl:
label_export_to: 'Na razpolago tudi v:' label_export_to: 'Na razpolago tudi v:'
label_read: Preberi... label_read: Preberi...
label_public_projects: Javni projekti label_public_projects: Javni projekti
label_open_issues: odpri zahtevek label_open_issues: odprt zahtevek
label_open_issues_plural: odpri zahtevke label_open_issues_plural: odprti zahtevki
label_closed_issues: zapri zahtevek label_closed_issues: zaprt zahtevek
label_closed_issues_plural: zapri zahtevke label_closed_issues_plural: zaprti zahtevki
label_x_open_issues_abbr_on_total: label_x_open_issues_abbr_on_total:
zero: 0 open / %{total} zero: 0 odprtih / %{total}
one: 1 open / %{total} one: 1 odprt / %{total}
other: "%{count} open / %{total}" other: "%{count} odprtih / %{total}"
label_x_open_issues_abbr: label_x_open_issues_abbr:
zero: 0 open zero: 0 odprtih
one: 1 open one: 1 odprt
other: "%{count} open" other: "%{count} odprtih"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 closed zero: 0 zaprtih
one: 1 closed one: 1 zaprt
other: "%{count} closed" other: "%{count} zaprtih"
label_total: Skupaj label_total: Skupaj
label_permissions: Dovoljenja label_permissions: Dovoljenja
label_current_status: Trenutno stanje label_current_status: Trenutno stanje
@@ -507,7 +507,7 @@ sl:
label_per_page: Na stran label_per_page: Na stran
label_calendar: Koledar label_calendar: Koledar
label_months_from: mesecev od label_months_from: mesecev od
label_gantt: Gantt label_gantt: Gantogram
label_internal: Notranji label_internal: Notranji
label_last_changes: "zadnjih %{count} sprememb" label_last_changes: "zadnjih %{count} sprememb"
label_change_view_all: Poglej vse spremembe label_change_view_all: Poglej vse spremembe
@@ -515,9 +515,9 @@ sl:
label_comment: Komentar label_comment: Komentar
label_comment_plural: Komentarji label_comment_plural: Komentarji
label_x_comments: label_x_comments:
zero: no comments zero: ni komentarjev
one: 1 comment one: 1 komentar
other: "%{count} comments" other: "%{count} komentarjev"
label_comment_add: Dodaj komentar label_comment_add: Dodaj komentar
label_comment_added: Komentar dodan label_comment_added: Komentar dodan
label_comment_delete: Izbriši komentarje label_comment_delete: Izbriši komentarje
@@ -774,7 +774,7 @@ sl:
default_tracker_feature: Funkcija default_tracker_feature: Funkcija
default_tracker_support: Podpora default_tracker_support: Podpora
default_issue_status_new: Nov default_issue_status_new: Nov
default_issue_status_in_progress: In Progress default_issue_status_in_progress: V teku
default_issue_status_resolved: Rešen default_issue_status_resolved: Rešen
default_issue_status_feedback: Povratna informacija default_issue_status_feedback: Povratna informacija
default_issue_status_closed: Zaključen default_issue_status_closed: Zaključen
@@ -792,183 +792,185 @@ sl:
enumeration_issue_priorities: Prioritete zahtevkov enumeration_issue_priorities: Prioritete zahtevkov
enumeration_doc_categories: Kategorije dokumentov enumeration_doc_categories: Kategorije dokumentov
enumeration_activities: Aktivnosti (sledenje časa) enumeration_activities: Aktivnosti (sledenje časa)
warning_attachments_not_saved: "%{count} file(s) could not be saved." warning_attachments_not_saved: "%{count} datotek(e) ni bilo mogoče shraniti."
field_editable: Editable field_editable: Uredljivo
text_plugin_assets_writable: Plugin assets directory writable text_plugin_assets_writable: Zapisljiva mapa za vtičnike
label_display: Display label_display: Prikaz
button_create_and_continue: Create and continue button_create_and_continue: Ustvari in nadaljuj
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'Ena vrstica za vsako vrednost'
setting_repository_log_display_limit: Maximum number of revisions displayed on file log setting_repository_log_display_limit: Največje število prikazanih revizij v log datoteki
setting_file_max_size_displayed: Max size of text files displayed inline setting_file_max_size_displayed: Največja velikost besedilnih datotek v vključenem prikazu
field_watcher: Watcher field_watcher: Opazovalec
setting_openid: Allow OpenID login and registration setting_openid: Dovoli OpenID prijavo in registracijo
field_identity_url: OpenID URL field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID label_login_with_open_id_option: ali se prijavi z OpenID
field_content: Content field_content: Vsebina
label_descending: Descending label_descending: Padajoče
label_sort: Sort label_sort: Razvrsti
label_ascending: Ascending label_ascending: Naraščajoče
label_date_from_to: From %{start} to %{end} label_date_from_to: Od %{start} do %{end}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: This page has %{descendants} child page(s) and descendant(s). What do you want to do? text_wiki_page_destroy_question: Ta stran ima %{descendants} podstran(i) in naslednik(ov). Kaj želite storiti?
text_wiki_page_reassign_children: Reassign child pages to this parent page text_wiki_page_reassign_children: Znova dodeli podstrani tej glavni strani
text_wiki_page_nullify_children: Keep child pages as root pages text_wiki_page_nullify_children: Obdrži podstrani kot glavne strani
text_wiki_page_destroy_children: Delete child pages and all their descendants text_wiki_page_destroy_children: Izbriši podstrani in vse njihove naslednike
setting_password_min_length: Minimum password length setting_password_min_length: Minimalna dolžina gesla
field_group_by: Group results by field_group_by: Združi rezultate po
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated" mail_subject_wiki_content_updated: "'%{id}' wiki stran je bila posodobljena"
label_wiki_content_added: Wiki page added label_wiki_content_added: Wiki stran dodana
mail_subject_wiki_content_added: "'%{id}' wiki page has been added" mail_subject_wiki_content_added: "'%{id}' wiki stran je bila dodana"
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}. mail_body_wiki_content_added: %{author} je dodal '%{id}' wiki stran
label_wiki_content_updated: Wiki page updated label_wiki_content_updated: Wiki stran posodobljena
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}. mail_body_wiki_content_updated: %{author} je posodobil '%{id}' wiki stran.
permission_add_project: Create project permission_add_project: Ustvari projekt
setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_new_project_user_role_id: Vloga, dodeljena neadministratorskemu uporabniku, ki je ustvaril projekt
label_view_all_revisions: View all revisions label_view_all_revisions: Poglej vse revizije
label_tag: Tag label_tag: Oznaka
label_branch: Branch label_branch: Veja
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings. error_no_tracker_in_project: Noben sledilnik ni povezan s tem projektom. Prosimo preverite nastavitve projekta.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses"). error_no_default_issue_status: Privzeti zahtevek ni definiran. Prosimo preverite svoje nastavitve (Pojdite na "Administracija -> Stanje zahtevkov").
text_journal_changed: "%{label} changed from %{old} to %{new}" text_journal_changed: "%{label} se je spremenilo iz %{old} v %{new}"
text_journal_set_to: "%{label} set to %{value}" text_journal_set_to: "%{label} nastavljeno na %{value}"
text_journal_deleted: "%{label} deleted (%{old})" text_journal_deleted: "%{label} izbrisan (%{old})"
label_group_plural: Groups label_group_plural: Skupine
label_group: Group label_group: Skupina
label_group_new: New group label_group_new: Nova skupina
label_time_entry_plural: Spent time label_time_entry_plural: Porabljen čas
text_journal_added: "%{label} %{value} added" text_journal_added: "%{label} %{value} dodan"
field_active: Active field_active: Aktiven
enumeration_system_activity: System Activity enumeration_system_activity: Sistemska aktivnost
permission_delete_issue_watchers: Delete watchers permission_delete_issue_watchers: Izbriši opazovalce
version_status_closed: closed version_status_closed: zaprt
version_status_locked: locked version_status_locked: zaklenjen
version_status_open: open version_status_open: odprt
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened error_can_not_reopen_issue_on_closed_version: Zahtevek dodeljen zaprti verziji ne more biti ponovno odprt
label_user_anonymous: Anonymous label_user_anonymous: Anonimni
button_move_and_follow: Move and follow button_move_and_follow: Premakni in sledi
setting_default_projects_modules: Default enabled modules for new projects setting_default_projects_modules: Privzeti moduli za nove projekte
setting_gravatar_default: Default Gravatar image setting_gravatar_default: Privzeta Gravatar slika
field_sharing: Sharing field_sharing: Deljenje
label_version_sharing_hierarchy: With project hierarchy label_version_sharing_hierarchy: S projektno hierarhijo
label_version_sharing_system: With all projects label_version_sharing_system: Z vsemi projekti
label_version_sharing_descendants: With subprojects label_version_sharing_descendants: S podprojekti
label_version_sharing_tree: With project tree label_version_sharing_tree: Z drevesom projekta
label_version_sharing_none: Not shared label_version_sharing_none: Ni deljeno
error_can_not_archive_project: This project can not be archived error_can_not_archive_project: Ta projekt ne more biti arhiviran
button_duplicate: Duplicate button_duplicate: Podvoji
button_copy_and_follow: Copy and follow button_copy_and_follow: Kopiraj in sledi
label_copy_source: Source label_copy_source: Vir
setting_issue_done_ratio: Calculate the issue done ratio with setting_issue_done_ratio: Izračunaj razmerje opravljenega zahtevka z
setting_issue_done_ratio_issue_status: Use the issue status setting_issue_done_ratio_issue_status: Uporabi stanje zahtevka
error_issue_done_ratios_not_updated: Issue done ratios not updated. error_issue_done_ratios_not_updated: Razmerje opravljenega zahtevka ni bilo posodobljeno.
error_workflow_copy_target: Please select target tracker(s) and role(s) error_workflow_copy_target: Prosimo izberite ciljni(e) sledilnik(e) in vlogo(e)
setting_issue_done_ratio_issue_field: Use the issue field setting_issue_done_ratio_issue_field: Uporabi polje zahtevka
label_copy_same_as_target: Same as target label_copy_same_as_target: Enako kot cilj
label_copy_target: Target label_copy_target: Cilj
notice_issue_done_ratios_updated: Issue done ratios updated. notice_issue_done_ratios_updated: Razmerje opravljenega zahtevka posodobljeno.
error_workflow_copy_source: Please select a source tracker or role error_workflow_copy_source: Prosimo izberite vir zahtevka ali vlogo
label_update_issue_done_ratios: Update issue done ratios label_update_issue_done_ratios: Posodobi razmerje opravljenega zahtevka
setting_start_of_week: Start calendars on setting_start_of_week: Začni koledarje z
permission_view_issues: View Issues permission_view_issues: Poglej zahtevke
label_display_used_statuses_only: Only display statuses that are used by this tracker label_display_used_statuses_only: Prikaži samo stanja ki uporabljajo ta sledilnik
label_revision_id: Revision %{value} label_revision_id: Revizija %{value}
label_api_access_key: API access key label_api_access_key: API dostopni ključ
label_api_access_key_created_on: API access key created %{value} ago label_api_access_key_created_on: API dostopni ključ ustvarjen pred %{value}
label_feeds_access_key: RSS access key label_feeds_access_key: RSS dostopni ključ
notice_api_access_key_reseted: Your API access key was reset. notice_api_access_key_reseted: Vaš API dostopni ključ je bil ponastavljen.
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Omogoči REST spletni servis
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Manjkajoč API dostopni ključ
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Manjkajoč RSS dostopni ključ
button_show: Show button_show: Prikaži
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Dovoljenih več vrednosti (ena vrstica za vsako vrednost).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Odreži e-pošto po eni od teh vrstic
permission_add_subprojects: Create subprojects permission_add_subprojects: Ustvari podprojekte
label_subproject_new: New subproject label_subproject_new: Nov podprojekt
text_own_membership_delete_confirmation: |- text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that. Odstranili boste nekatere ali vse od dovoljenj zaradi česar morda ne boste mogli več urejati tega projekta.
Are you sure you want to continue? Ali ste prepričani, da želite nadaljevati?
label_close_versions: Close completed versions label_close_versions: Zapri dokončane verzije
label_board_sticky: Sticky label_board_sticky: Lepljivo
label_board_locked: Locked label_board_locked: Zaklenjeno
permission_export_wiki_pages: Export wiki pages permission_export_wiki_pages: Izvozi wiki strani
setting_cache_formatted_text: Cache formatted text setting_cache_formatted_text: Predpomni oblikovano besedilo
permission_manage_project_activities: Manage project activities permission_manage_project_activities: Uredi aktivnosti projekta
error_unable_delete_issue_status: Unable to delete issue status error_unable_delete_issue_status: Stanja zahtevka ni bilo možno spremeniti
label_profile: Profile label_profile: Profil
permission_manage_subtasks: Manage subtasks permission_manage_subtasks: Uredi podnaloge
field_parent_issue: Parent task field_parent_issue: Nadrejena naloga
label_subtask_plural: Subtasks label_subtask_plural: Podnaloge
label_project_copy_notifications: Send email notifications during the project copy label_project_copy_notifications: Med kopiranjem projekta pošlji e-poštno sporočilo
error_can_not_delete_custom_field: Unable to delete custom field error_can_not_delete_custom_field: Polja po meri ni mogoče izbrisati
error_unable_to_connect: Unable to connect (%{value}) error_unable_to_connect: Povezava ni mogoča (%{value})
error_can_not_remove_role: This role is in use and can not be deleted. error_can_not_remove_role: Ta vloga je v uporabi in je ni mogoče izbrisati.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted. error_can_not_delete_tracker: Ta sledilnik vsebuje zahtevke in se ga ne more izbrisati.
field_principal: Principal field_principal: Upravnik varnosti
label_my_page_block: My page block label_my_page_block: Moj gradnik strani
notice_failed_to_save_members: "Failed to save member(s): %{errors}." notice_failed_to_save_members: "Shranjevanje uporabnika(ov) ni uspelo: %{errors}."
text_zoom_out: Zoom out text_zoom_out: Približaj
text_zoom_in: Zoom in text_zoom_in: Oddalji
notice_unable_delete_time_entry: Unable to delete time log entry. notice_unable_delete_time_entry: Brisanje dnevnika porabljenaga časa ni mogoče.
label_overall_spent_time: Overall spent time label_overall_spent_time: Skupni porabljeni čas
field_time_entries: Log time field_time_entries: Beleži porabljeni čas
project_module_gantt: Gantt project_module_gantt: Gantogram
project_module_calendar: Calendar project_module_calendar: Koledear
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_edit_associated_wikipage: "Uredi povezano Wiki stran: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Izbriši zahtevek in vse podazahtevke?
field_text: Text field field_text: Besedilno polje
label_user_mail_option_only_owner: Only for things I am the owner of label_user_mail_option_only_owner: Samo za stvari katerih lastnik sem
setting_default_notification_option: Default notification option setting_default_notification_option: Privzeta možnost obveščanja
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_my_events: Samo za stvari, ki jih opazujem ali sem v njih vpleten
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_assigned: Samo za stvari, ki smo mi dodeljene
label_user_mail_option_none: No events label_user_mail_option_none: Noben dogodek
field_member_of_group: Assignee's group field_member_of_group: Pooblaščenčeva skupina
field_assigned_to_role: Assignee's role field_assigned_to_role: Pooblaščenčeva vloga
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: Projekt, do katerega poskušate dostopati, je bil arhiviran.
label_principal_search: "Search for user or group:" label_principal_search: "Poišči uporabnika ali skupino:"
label_user_search: "Search for user:" label_user_search: "Poišči uporabnikia:"
field_visible: Visible field_visible: Viden
setting_emails_header: Emails header setting_emails_header: Glava e-pošte
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Aktivnost zabeleženega časa
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Uporabljeno v spremembi %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Omogoči beleženje časa
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: Graf je bil odrezan, ker je prekoračil največje dovoljeno število elementov, ki se jih lahko prikaže (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Največje število elementov prikazano na gantogramu
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: Opozori me, kadar zapuščam stran z neshranjenim besedilom
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: Trenutna stran vsebuje neshranjeno besedilo ki bo izgubljeno, če zapustite to stran.
label_my_queries: My custom queries label_my_queries: Moje poizvedbe po meri
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} posodobljen"
label_news_comment_added: Comment added to a news label_news_comment_added: Komentar dodan novici
button_expand_all: Expand all button_expand_all: Razširi vse
button_collapse_all: Collapse all button_collapse_all: Skrči vse
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: Dovoljeni dodatni prehodi kadar je uporabnik pooblaščenec
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: Dovoljeni dodatni prehodi kadar je uporabnik avtor
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: Skupinsko urejanje izbranih časovnih zapisov
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: Ali ste prepričani, da želite izbristai izbran(e) časovn(i/e) zapis(e)?
label_role_anonymous: Anonymous label_role_anonymous: Anonimni
label_role_non_member: Non member label_role_non_member: Nečlan
label_issue_note_added: Note added label_issue_note_added: Dodan zaznamek
label_issue_status_updated: Status updated label_issue_status_updated: Status posodobljen
label_issue_priority_updated: Priority updated label_issue_priority_updated: Prioriteta posodobljena
label_issues_visibility_own: Issues created by or assigned to the user label_issues_visibility_own: Zahtevek ustvarjen s strani uporabnika ali dodeljen uporabniku
field_issues_visibility: Issues visibility field_issues_visibility: Vidljivost zahtevkov
label_issues_visibility_all: All issues label_issues_visibility_all: Vsi zahtevki
permission_set_own_issues_private: Set own issues public or private permission_set_own_issues_private: Nastavi lastne zahtevke kot javne ali zasebne
field_is_private: Private field_is_private: Zaseben
permission_set_issues_private: Set issues public or private permission_set_issues_private: Nastavi zahtevke kot javne ali zasebne
label_issues_visibility_public: All non private issues label_issues_visibility_public: Vsi nezasebni zahtevki
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: To bo izbrisalo tudi %{count} podnalog(o).
field_commit_logs_encoding: Kodiranje sporočil ob predaji field_commit_logs_encoding: Kodiranje sporočil ob predaji
field_scm_path_encoding: Path encoding field_scm_path_encoding: Pot do kodiranja
text_scm_path_encoding_note: "Default: UTF-8" text_scm_path_encoding_note: "Privzeto: UTF-8"
field_path_to_repository: Path to repository field_path_to_repository: Pot do shrambe
field_root_directory: Root directory field_root_directory: Korenska mapa
field_cvs_module: Module field_cvs_module: Modul
field_cvsroot: CVSROOT field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo) text_mercurial_repository_note: Lokalna shramba (npr. /hgrepo, c:\hgrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) text_scm_command: Ukaz
text_scm_command: Command text_scm_command_version: Verzija
text_scm_command_version: Version label_git_report_last_commit: Sporoči zadnje uveljavljanje datotek in map
label_git_report_last_commit: Report last commit for files and directories text_scm_config: Svoje SCM ukaze lahko nastavite v datoteki config/configuration.yml. Po urejanju prosimo ponovno zaženite aplikacijo.
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: SCM ukaz ni na voljo. Prosimo preverite nastavitve v upravljalskem podoknu.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_git_repository_note: Shramba je prazna in lokalna (npr. /gitrepo, c:\gitrepo)
+42 -41
View File
@@ -91,7 +91,6 @@ zh:
gb: "GB" gb: "GB"
tb: "TB" tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
@@ -241,7 +240,7 @@ zh:
field_is_default: 默认值 field_is_default: 默认值
field_tracker: 跟踪 field_tracker: 跟踪
field_subject: 主题 field_subject: 主题
field_due_date: 完成日期 field_due_date: 计划完成日期
field_assigned_to: 指派给 field_assigned_to: 指派给
field_priority: 优先级 field_priority: 优先级
field_fixed_version: 目标版本 field_fixed_version: 目标版本
@@ -273,7 +272,7 @@ zh:
field_attr_mail: 邮件属性 field_attr_mail: 邮件属性
field_onthefly: 即时用户生成 field_onthefly: 即时用户生成
field_start_date: 开始日期 field_start_date: 开始日期
field_done_ratio: % 完成 field_done_ratio: "% 完成"
field_auth_source: 认证模式 field_auth_source: 认证模式
field_hide_mail: 隐藏我的邮件地址 field_hide_mail: 隐藏我的邮件地址
field_comments: 注释 field_comments: 注释
@@ -402,7 +401,7 @@ zh:
permission_manage_files: 管理文件 permission_manage_files: 管理文件
permission_view_files: 查看文件 permission_view_files: 查看文件
permission_manage_wiki: 管理Wiki permission_manage_wiki: 管理Wiki
permission_rename_wiki_pages: 重命名Wiki页面 permission_rename_wiki_pages: 重定向/重命名Wiki页面
permission_delete_wiki_pages: 删除Wiki页面 permission_delete_wiki_pages: 删除Wiki页面
permission_view_wiki_pages: 查看Wiki permission_view_wiki_pages: 查看Wiki
permission_view_wiki_edits: 查看Wiki历史记录 permission_view_wiki_edits: 查看Wiki历史记录
@@ -832,7 +831,7 @@ zh:
button_archive: 存档 button_archive: 存档
button_unarchive: 取消存档 button_unarchive: 取消存档
button_reset: 重置 button_reset: 重置
button_rename: 重命名 button_rename: 重命名/重定向
button_change_password: 修改密码 button_change_password: 修改密码
button_copy: 复制 button_copy: 复制
button_copy_and_follow: 复制并转到新问题 button_copy_and_follow: 复制并转到新问题
@@ -910,8 +909,8 @@ zh:
text_wiki_page_destroy_children: 删除子页面及其所有下级页面 text_wiki_page_destroy_children: 删除子页面及其所有下级页面
text_wiki_page_reassign_children: 将子页面的上级页面设置为 text_wiki_page_reassign_children: 将子页面的上级页面设置为
text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗? text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗?
text_zoom_in: Zoom in text_zoom_in: 放大
text_zoom_out: Zoom out text_zoom_out: 缩小
default_role_manager: 管理人员 default_role_manager: 管理人员
default_role_developer: 开发人员 default_role_developer: 开发人员
@@ -940,42 +939,44 @@ zh:
enumeration_activities: 活动(时间跟踪) enumeration_activities: 活动(时间跟踪)
enumeration_system_activity: 系统活动 enumeration_system_activity: 系统活动
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text field_warn_on_leaving_unsaved: 当离开未保存内容的页面时,提示我
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page. text_warn_on_leaving_unsaved: 若离开当前页面,则该页面内未保存的内容将丢失。
label_my_queries: My custom queries label_my_queries: 我的自定义查询
text_journal_changed_no_detail: "%{label} updated" text_journal_changed_no_detail: "%{label} 已更新。"
label_news_comment_added: Comment added to a news label_news_comment_added: 添加到新闻的评论
button_expand_all: Expand all button_expand_all: 展开所有
button_collapse_all: Collapse all button_collapse_all: 合拢所有
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee label_additional_workflow_transitions_for_assignee: 当用户是问题的分配对象时所允许的问题状态转换
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author label_additional_workflow_transitions_for_author: 当用户是问题作者时所允许的问题状态转换
label_bulk_edit_selected_time_entries: Bulk edit selected time entries label_bulk_edit_selected_time_entries: 批量修改选定的时间条目
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)? text_time_entries_destroy_confirmation: 是否确定要删除选定的时间条目?
label_role_anonymous: Anonymous label_role_anonymous: Anonymous
label_role_non_member: Non member label_role_non_member: Non member
label_issue_note_added: Note added label_issue_note_added: 问题备注已添加
label_issue_status_updated: Status updated label_issue_status_updated: 问题状态更新
label_issue_priority_updated: Priority updated label_issue_priority_updated: 问题优先级更新
label_issues_visibility_own: Issues created by or assigned to the user label_issues_visibility_own: 创建或分配给用户的问题
field_issues_visibility: Issues visibility field_issues_visibility: 问题可见
label_issues_visibility_all: All issues label_issues_visibility_all: 全部问题
permission_set_own_issues_private: Set own issues public or private permission_set_own_issues_private: 设置自己的问题为公开或私有
field_is_private: Private field_is_private: 私有
permission_set_issues_private: Set issues public or private permission_set_issues_private: 设置问题为公开或私有
label_issues_visibility_public: All non private issues label_issues_visibility_public: 全部非私有问题
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s). text_issues_destroy_descendants_confirmation: 此操作同时会删除 %{count} 个子任务。
field_commit_logs_encoding: 提交注释的编码 field_commit_logs_encoding: 提交注释的编码
field_scm_path_encoding: Path encoding field_scm_path_encoding: 路径编码
text_scm_path_encoding_note: "Default: UTF-8" text_scm_path_encoding_note: "默认: UTF-8"
field_path_to_repository: Path to repository field_path_to_repository: 库路径
field_root_directory: Root directory field_root_directory: 根目录
field_cvs_module: Module field_cvs_module: CVS Module
field_cvsroot: CVSROOT field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo) text_mercurial_repository_note: 本地库 (e.g. /hgrepo, c:\hgrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo) text_scm_command: 命令
text_scm_command: Command text_scm_command_version: 版本
text_scm_command_version: Version label_git_report_last_commit: 报告最后一次文件/目录提交
label_git_report_last_commit: Report last commit for files and directories text_scm_config: 您可以在config/configuration.yml中配置您的SCM命令。 请在编辑后,重启Redmine应用。
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it. text_scm_command_not_available: Scm命令不可用。 请检查管理面板的配置。
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_git_repository_note: 库中无内容。(e.g. /gitrepo, c:\gitrepo)
+47 -7
View File
@@ -4,6 +4,46 @@ Redmine - project management software
Copyright (C) 2006-2011 Jean-Philippe Lang Copyright (C) 2006-2011 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2011-12-10 v1.2.3
* Defect #8707: Reposman: wrong constant name
* Defect #8809: Table in timelog report overflows
* Defect #9055: Version files in Files module cannot be downloaded if issue tracking is disabled
* Defect #9137: db:encrypt fails to handle repositories with blank password
* Defect #9394: Custom date field only validating on regex and not a valid date
* Defect #9405: Any user with :log_time permission can edit time entries via context menu
* Defect #9448: The attached images are not shown in documents
* Defect #9520: Copied private query not visible after project copy
* Defect #9552: Error when reading ciphered text from the database without cipher key configured
* Defect #9566: Redmine.pm considers all projects private when login_required is enabled
* Defect #9567: Redmine.pm potential security issue with cache credential enabled and subversion
* Defect #9577: Deleting a subtasks doesn't update parent's rgt & lft values
* Defect #9597: Broken version links in wiki annotate history
* Defect #9682: Wiki HTML Export only useful when Access history is accessible
* Defect #9737: Custom values deleted before issue submit
* Defect #9741: calendar-hr.js (Croatian) is not UTF-8
* Patch #9558: Simplified Chinese translation for 1.2.2 updated
* Patch #9695: Bulgarian translation (r7942)
== 2011-11-11 v1.2.2
* Defect #3276: Incorrect handling of anchors in Wiki to HTML export
* Defect #7215: Wiki formatting mangles links to internal headers
* Defect #7613: Generated test instances may share the same attribute value object
* Defect #8411: Can't remove "Project" column on custom query
* Defect #8615: Custom 'version' fields don't show shared versions
* Defect #8633: Pagination counts non visible issues
* Defect #8651: Email attachments are not added to issues any more in v1.2
* Defect #8825: JRuby + Windows: SCMs do not work on Redmine 1.2
* Defect #8836: Additional workflow transitions not available when set to both author and assignee
* Defect #8865: Custom field regular expression is not validated
* Defect #8880: Error deleting issue with grandchild
* Defect #8884: Assignee is cleared when updating issue with locked assignee
* Defect #8892: Unused fonts in rfpdf plugin folder
* Defect #9161: pt-BR field_warn_on_leaving_unsaved has a small gramatical error
* Defect #9308: Search fails when a role haven't "view wiki" permission
* Defect #9465: Mercurial: can't browse named branch below Mercurial 1.5
== 2011-07-11 v1.2.1 == 2011-07-11 v1.2.1
* Defect #5089: i18N error on truncated revision diff view * Defect #5089: i18N error on truncated revision diff view
@@ -417,7 +457,7 @@ http://www.redmine.org/
* #819: Add a body ID and class to all pages * #819: Add a body ID and class to all pages
* #871: Commit new CSS styles! * #871: Commit new CSS styles!
* #3301: Add favicon to base layout * #3301: Add favicon to base layout
* #4656: On Issue#show page, clicking on “Add related issue” should focus on the input * #4656: On Issue#show page, clicking on “Add related issueâ€� should focus on the input
* #4896: Project identifier should be a limited field * #4896: Project identifier should be a limited field
* #5084: Filter all isssues by projects * #5084: Filter all isssues by projects
* #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase * #5477: Replace Test::Unit::TestCase with ActiveSupport::TestCase
@@ -1426,7 +1466,7 @@ http://www.redmine.org/
* Search engines now supports pagination. Results are sorted in reverse chronological order * Search engines now supports pagination. Results are sorted in reverse chronological order
* Added "Estimated hours" attribute on issues * Added "Estimated hours" attribute on issues
* A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category * A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
* Forum notifications are now also sent to the authors of the thread, even if they don�t watch the board * Forum notifications are now also sent to the authors of the thread, even if they don�t watch the board
* Added an application setting to specify the application protocol (http or https) used to generate urls in emails * Added an application setting to specify the application protocol (http or https) used to generate urls in emails
* Gantt chart: now starts at the current month by default * Gantt chart: now starts at the current month by default
* Gantt chart: month count and zoom factor are automatically saved as user preferences * Gantt chart: month count and zoom factor are automatically saved as user preferences
@@ -1434,7 +1474,7 @@ http://www.redmine.org/
* Added wiki index by date * Added wiki index by date
* Added preview on add/edit issue form * Added preview on add/edit issue form
* Emails footer can now be customized from the admin interface (Admin -> Email notifications) * Emails footer can now be customized from the admin interface (Admin -> Email notifications)
* Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they�re properly displayed) * Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that they�re properly displayed)
* Calendar: first day of week can now be set in lang files * Calendar: first day of week can now be set in lang files
* Automatic closing of duplicate issues * Automatic closing of duplicate issues
* Added a cross-project issue list * Added a cross-project issue list
@@ -1446,7 +1486,7 @@ http://www.redmine.org/
* Added some accesskeys * Added some accesskeys
* Added "Float" as a custom field format * Added "Float" as a custom field format
* Added basic Theme support * Added basic Theme support
* Added the ability to set the �done ratio� of issues fixed by commit (Nikolay Solakov) * Added the ability to set the �done ratio� of issues fixed by commit (Nikolay Solakov)
* Added custom fields in issue related mail notifications * Added custom fields in issue related mail notifications
* Email notifications are now sent in plain text and html * Email notifications are now sent in plain text and html
* Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed. * Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
@@ -1479,7 +1519,7 @@ http://www.redmine.org/
* Added Korean translation (Choi Jong Yoon) * Added Korean translation (Choi Jong Yoon)
* Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations * Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
* Performance improvement on calendar and gantt * Performance improvement on calendar and gantt
* Fixed: wiki preview doesn�t work on long entries * Fixed: wiki preview doesn�t work on long entries
* Fixed: queries with multiple custom fields return no result * Fixed: queries with multiple custom fields return no result
* Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters * Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
* Fixed: URL with ~ broken in wiki formatting * Fixed: URL with ~ broken in wiki formatting
@@ -1490,7 +1530,7 @@ http://www.redmine.org/
* per project forums added * per project forums added
* added the ability to archive projects * added the ability to archive projects
* added �Watch� functionality on issues. It allows users to receive notifications about issue changes * added �Watch� functionality on issues. It allows users to receive notifications about issue changes
* custom fields for issues can now be used as filters on issue list * custom fields for issues can now be used as filters on issue list
* added per user custom queries * added per user custom queries
* commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings) * commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
@@ -1531,7 +1571,7 @@ http://www.redmine.org/
* added swedish translation (Thomas Habets) * added swedish translation (Thomas Habets)
* italian translation update (Alessio Spadaro) * italian translation update (Alessio Spadaro)
* japanese translation update (Satoru Kurashiki) * japanese translation update (Satoru Kurashiki)
* fixed: error on history atom feed when there�s no notes on an issue change * fixed: error on history atom feed when there�s no notes on an issue change
* fixed: error in journalizing an issue with longtext custom fields (Postgresql) * fixed: error in journalizing an issue with longtext custom fields (Postgresql)
* fixed: creation of Oracle schema * fixed: creation of Oracle schema
* fixed: last day of the month not included in project activity * fixed: last day of the month not included in project activity
+2 -1
View File
@@ -9,8 +9,9 @@ Running Tests
Run `rake --tasks test` to see available tests. Run `rake --tasks test` to see available tests.
`rake test` will run the entire testsuite. `rake test` will run the entire testsuite.
You can run `ruby test/unit/issue_test.rb` for an each test.
Before running `rake test` you need to configure both development Before running tests, you need to configure both development
and test databases. and test databases.
Creating test repositories Creating test repositories
+39 -13
View File
@@ -149,15 +149,16 @@ sub RedmineDSN {
$self->{RedmineDSN} = $arg; $self->{RedmineDSN} = $arg;
my $query = "SELECT my $query = "SELECT
hashed_password, salt, auth_source_id, permissions hashed_password, salt, auth_source_id, permissions
FROM members, projects, users, roles, member_roles FROM projects, users, roles
WHERE WHERE
projects.id=members.project_id users.login=?
AND member_roles.member_id=members.id AND projects.identifier=?
AND users.id=members.user_id
AND roles.id=member_roles.role_id
AND users.status=1 AND users.status=1
AND login=? AND (
AND identifier=? "; roles.id IN (SELECT member_roles.role_id FROM members, member_roles WHERE members.user_id = users.id AND members.project_id = projects.id AND members.id = member_roles.member_id)
OR
(roles.builtin=1 AND cast(projects.is_public as CHAR) IN ('t', '1'))
) ";
$self->{RedmineQuery} = trim($query); $self->{RedmineQuery} = trim($query);
} }
@@ -208,7 +209,7 @@ sub access_handler {
my $project_id = get_project_identifier($r); my $project_id = get_project_identifier($r);
$r->set_handlers(PerlAuthenHandler => [\&OK]) $r->set_handlers(PerlAuthenHandler => [\&OK])
if is_public_project($project_id, $r); if is_public_project($project_id, $r) && anonymous_role_allows_browse_repository($r);
return OK return OK
} }
@@ -280,6 +281,29 @@ sub is_public_project {
$ret; $ret;
} }
sub anonymous_role_allows_browse_repository {
my $r = shift;
my $dbh = connect_database($r);
my $sth = $dbh->prepare(
"SELECT permissions FROM roles WHERE builtin = 2;"
);
$sth->execute();
my $ret = 0;
if (my @row = $sth->fetchrow_array) {
if ($row[0] =~ /:browse_repository/) {
$ret = 1;
}
}
$sth->finish();
undef $sth;
$dbh->disconnect();
undef $dbh;
$ret;
}
# perhaps we should use repository right (other read right) to check public access. # perhaps we should use repository right (other read right) to check public access.
# it could be faster BUT it doesn't work for the moment. # it could be faster BUT it doesn't work for the moment.
# sub is_public_project_by_file { # sub is_public_project_by_file {
@@ -305,10 +329,12 @@ sub is_member {
my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass); my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
my $access_mode = defined $read_only_methods{$r->method} ? "R" : "W";
my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config); my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
my $usrprojpass; my $usrprojpass;
if ($cfg->{RedmineCacheCredsMax}) { if ($cfg->{RedmineCacheCredsMax}) {
$usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id); $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id.":".$access_mode);
return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest)); return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest));
} }
my $query = $cfg->{RedmineQuery}; my $query = $cfg->{RedmineQuery};
@@ -321,7 +347,7 @@ sub is_member {
unless ($auth_source_id) { unless ($auth_source_id) {
my $method = $r->method; my $method = $r->method;
my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest); my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest);
if ($hashed_password eq $salted_password && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) { if ($hashed_password eq $salted_password && (($access_mode eq "R" && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
$ret = 1; $ret = 1;
last; last;
} }
@@ -340,7 +366,7 @@ sub is_member {
filter => "(".$rowldap[6]."=%s)" filter => "(".$rowldap[6]."=%s)"
); );
my $method = $r->method; my $method = $r->method;
$ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass) && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/)); $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass) && (($access_mode eq "R" && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/));
} }
$sthldap->finish(); $sthldap->finish();
@@ -354,10 +380,10 @@ sub is_member {
if ($cfg->{RedmineCacheCredsMax} and $ret) { if ($cfg->{RedmineCacheCredsMax} and $ret) {
if (defined $usrprojpass) { if (defined $usrprojpass) {
$cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest); $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest);
} else { } else {
if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) { if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) {
$cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest); $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest);
$cfg->{RedmineCacheCredsCount}++; $cfg->{RedmineCacheCredsCount}++;
} else { } else {
$cfg->{RedmineCacheCreds}->clear(); $cfg->{RedmineCacheCreds}->clear();
+1 -1
View File
@@ -938,7 +938,7 @@ class RedCloth3 < String
stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8] stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8]
htmlesc title htmlesc title
atts = pba( atts ) atts = pba( atts )
atts = " src=\"#{ url }\"#{ atts }" atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"
atts << " title=\"#{ title }\"" if title atts << " title=\"#{ title }\"" if title
atts << " alt=\"#{ title }\"" atts << " alt=\"#{ title }\""
# size = @getimagesize($url); # size = @getimagesize($url);
+3 -3
View File
@@ -88,10 +88,10 @@ Redmine::AccessControl.map do |map|
end end
map.project_module :time_tracking do |map| map.project_module :time_tracking do |map|
map.permission :log_time, {:timelog => [:new, :create, :edit, :update, :bulk_edit, :bulk_update]}, :require => :loggedin map.permission :log_time, {:timelog => [:new, :create]}, :require => :loggedin
map.permission :view_time_entries, :timelog => [:index, :show], :time_entry_reports => [:report] map.permission :view_time_entries, :timelog => [:index, :show], :time_entry_reports => [:report]
map.permission :edit_time_entries, {:timelog => [:new, :create, :edit, :update, :destroy, :bulk_edit, :bulk_update]}, :require => :member map.permission :edit_time_entries, {:timelog => [:edit, :update, :destroy, :bulk_edit, :bulk_update]}, :require => :member
map.permission :edit_own_time_entries, {:timelog => [:new, :create, :edit, :update, :destroy,:bulk_edit, :bulk_update]}, :require => :loggedin map.permission :edit_own_time_entries, {:timelog => [:edit, :update, :destroy,:bulk_edit, :bulk_update]}, :require => :loggedin
map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member
end end
+9 -1
View File
@@ -23,7 +23,7 @@ module Redmine
class << self class << self
def encrypt_text(text) def encrypt_text(text)
if cipher_key.blank? if cipher_key.blank? || text.blank?
text text
else else
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
@@ -39,6 +39,10 @@ module Redmine
def decrypt_text(text) def decrypt_text(text)
if text && match = text.match(/\Aaes-256-cbc:(.+)\Z/) if text && match = text.match(/\Aaes-256-cbc:(.+)\Z/)
if cipher_key.blank?
logger.error "Attempt to decrypt a ciphered text with no cipher key configured in config/configuration.yml" if logger
return text
end
text = match[1] text = match[1]
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
e, iv = text.split("--").map {|s| Base64.decode64(s)} e, iv = text.split("--").map {|s| Base64.decode64(s)}
@@ -56,6 +60,10 @@ module Redmine
key = Redmine::Configuration['database_cipher_key'].to_s key = Redmine::Configuration['database_cipher_key'].to_s
key.blank? ? nil : Digest::SHA256.hexdigest(key) key.blank? ? nil : Digest::SHA256.hexdigest(key)
end end
def logger
RAILS_DEFAULT_LOGGER
end
end end
module ClassMethods module ClassMethods
+7
View File
@@ -11,6 +11,13 @@ module Redmine
str = str.encode("US-ASCII", :invalid => :replace, str = str.encode("US-ASCII", :invalid => :replace,
:undef => :replace, :replace => '?').encode("UTF-8") :undef => :replace, :replace => '?').encode("UTF-8")
end end
elsif RUBY_PLATFORM == 'java'
begin
ic = Iconv.new('UTF-8', 'UTF-8')
str = ic.iconv(str)
rescue
str = str.gsub(%r{[^\r\n\t\x20-\x7e]}, '?')
end
else else
ic = Iconv.new('UTF-8', 'UTF-8') ic = Iconv.new('UTF-8', 'UTF-8')
txtar = "" txtar = ""
+5 -5
View File
@@ -1,5 +1,5 @@
# Redmine - project management software # Redmine - project management software
# Copyright (C) 2006-2008 Jean-Philippe Lang # Copyright (C) 2006-2011 Jean-Philippe Lang
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@@ -115,17 +115,17 @@ module Redmine
end end
end end
# Helper module included in ApplicationHelper and ActionControllerso that # Helper module included in ApplicationHelper and ActionController so that
# hooks can be called in views like this: # hooks can be called in views like this:
# #
# <%= call_hook(:some_hook) %> # <%= call_hook(:some_hook) %>
# <%= call_hook(:another_hook, :foo => 'bar' %> # <%= call_hook(:another_hook, :foo => 'bar') %>
# #
# Or in controllers like: # Or in controllers like:
# call_hook(:some_hook) # call_hook(:some_hook)
# call_hook(:another_hook, :foo => 'bar' # call_hook(:another_hook, :foo => 'bar')
# #
# Hooks added to views will be concatenated into a string. Hooks added to # Hooks added to views will be concatenated into a string. Hooks added to
# controllers will return an array of results. # controllers will return an array of results.
# #
# Several objects are automatically added to the call context: # Several objects are automatically added to the call context:
+13 -1
View File
@@ -29,6 +29,14 @@ module Redmine
"" ""
end end
def shell_quote_command
if Redmine::Platform.mswin? && RUBY_PLATFORM == 'java'
client_command
else
shell_quote(client_command)
end
end
# Returns the version of the scm client # Returns the version of the scm client
# Eg: [1, 5, 0] or [] if unknown # Eg: [1, 5, 0] or [] if unknown
def client_version def client_version
@@ -216,7 +224,11 @@ module Redmine
io.close_write io.close_write
block.call(io) if block_given? block.call(io) if block_given?
end end
rescue Errno::ENOENT => e ## If scm command does not exist,
## Linux JRuby 1.6.2 (ruby-1.8.7-p330) raises java.io.IOException
## in production environment.
# rescue Errno::ENOENT => e
rescue Exception => e
msg = strip_credential(e.message) msg = strip_credential(e.message)
# The command failed, log it and re-raise # The command failed, log it and re-raise
logmsg = "SCM command failed, " logmsg = "SCM command failed, "
+1 -1
View File
@@ -31,7 +31,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(BZR_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
+6 -3
View File
@@ -34,7 +34,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(CVS_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
@@ -379,13 +379,16 @@ module Redmine
end end
def scm_cmd(*args, &block) def scm_cmd(*args, &block)
full_args = [CVS_BIN, '-d', root_url] full_args = ['-d', root_url]
full_args += args full_args += args
full_args_locale = [] full_args_locale = []
full_args.map do |e| full_args.map do |e|
full_args_locale << scm_iconv(@path_encoding, 'UTF-8', e) full_args_locale << scm_iconv(@path_encoding, 'UTF-8', e)
end end
ret = shellout(full_args_locale.map { |e| shell_quote e.to_s }.join(' '), &block) ret = shellout(
self.class.sq_bin + ' ' + full_args_locale.map { |e| shell_quote e.to_s }.join(' '),
&block
)
if $? && $?.exitstatus != 0 if $? && $?.exitstatus != 0
raise ScmCommandAborted, "cvs exited with non-zero status: #{$?.exitstatus}" raise ScmCommandAborted, "cvs exited with non-zero status: #{$?.exitstatus}"
end end
+1 -1
View File
@@ -31,7 +31,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(DARCS_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
+6 -3
View File
@@ -34,7 +34,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(GIT_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
@@ -359,13 +359,16 @@ module Redmine
def scm_cmd(*args, &block) def scm_cmd(*args, &block)
repo_path = root_url || url repo_path = root_url || url
full_args = [GIT_BIN, '--git-dir', repo_path] full_args = ['--git-dir', repo_path]
if self.class.client_version_above?([1, 7, 2]) if self.class.client_version_above?([1, 7, 2])
full_args << '-c' << 'core.quotepath=false' full_args << '-c' << 'core.quotepath=false'
full_args << '-c' << 'log.decorate=no' full_args << '-c' << 'log.decorate=no'
end end
full_args += args full_args += args
ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block) ret = shellout(
self.class.sq_bin + ' ' + full_args.map { |e| shell_quote e.to_s }.join(' '),
&block
)
if $? && $?.exitstatus != 0 if $? && $?.exitstatus != 0
raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}" raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}"
end end
@@ -1,12 +0,0 @@
changeset = 'This template must be used with --debug option\n'
changeset_quiet = 'This template must be used with --debug option\n'
changeset_verbose = 'This template must be used with --debug option\n'
changeset_debug = '<logentry revision="{rev}" node="{node|short}">\n<author>{author|escape}</author>\n<date>{date|isodate}</date>\n<paths>\n{files}{file_adds}{file_dels}{file_copies}</paths>\n<msg>{desc|escape}</msg>\n{tags}</logentry>\n\n'
file = '<path action="M">{file|urlescape}</path>\n'
file_add = '<path action="A">{file_add|urlescape}</path>\n'
file_del = '<path action="D">{file_del|urlescape}</path>\n'
file_copy = '<path-copied copyfrom-path="{source|urlescape}">{name|urlescape}</path-copied>\n'
tag = '<tag>{tag|escape}</tag>\n'
header='<?xml version="1.0" encoding="UTF-8" ?>\n<log>\n\n'
# footer="</log>"
@@ -46,7 +46,7 @@ Output example of rhmanifest::
</rhmanifest> </rhmanifest>
""" """
import re, time, cgi, urllib import re, time, cgi, urllib
from mercurial import cmdutil, commands, node, error from mercurial import cmdutil, commands, node, error, hg
_x = cgi.escape _x = cgi.escape
_u = lambda s: cgi.escape(urllib.quote(s)) _u = lambda s: cgi.escape(urllib.quote(s))
@@ -146,7 +146,10 @@ def rhlog(ui, repo, *pats, **opts):
bra = urllib.unquote_plus(opts.pop('rhbranch', None)) bra = urllib.unquote_plus(opts.pop('rhbranch', None))
from_rev = from_rev.replace('"', '\\"') from_rev = from_rev.replace('"', '\\"')
to_rev = to_rev.replace('"', '\\"') to_rev = to_rev.replace('"', '\\"')
opts['rev'] = ['"%s":"%s"' % (from_rev, to_rev)] if hg.util.version() >= '1.6':
opts['rev'] = ['"%s":"%s"' % (from_rev, to_rev)]
else:
opts['rev'] = ['%s:%s' % (from_rev, to_rev)]
opts['branch'] = [bra] opts['branch'] = [bra]
return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts) return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts)
@@ -196,21 +199,21 @@ cmdtable = {
[ [
('r', 'rev', [], 'show the specified revision'), ('r', 'rev', [], 'show the specified revision'),
('b', 'branch', [], ('b', 'branch', [],
'show changesets within the given named branch', 'BRANCH'), 'show changesets within the given named branch'),
('l', 'limit', '', ('l', 'limit', '',
'limit number of changes displayed', 'NUM'), 'limit number of changes displayed'),
('d', 'date', '', ('d', 'date', '',
'show revisions matching date spec', 'DATE'), 'show revisions matching date spec'),
('u', 'user', [], ('u', 'user', [],
'revisions committed by user', 'USER'), 'revisions committed by user'),
('', 'from', '', ('', 'from', '',
'', ''), ''),
('', 'to', '', ('', 'to', '',
'', ''), ''),
('', 'rhbranch', '', ('', 'rhbranch', '',
'', ''), ''),
('', 'template', '', ('', 'template', '',
'display with template', 'TEMPLATE')], 'display with template')],
'hg rhlog [OPTION]... [FILE]'), 'hg rhlog [OPTION]... [FILE]'),
'rhmanifest': (rhmanifest, 'rhmanifest': (rhmanifest,
[('r', 'rev', '', 'show the specified revision')], [('r', 'rev', '', 'show the specified revision')],
+8 -10
View File
@@ -39,7 +39,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(HG_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
@@ -47,7 +47,7 @@ module Redmine
end end
def client_available def client_available
client_version_above?([0, 9, 5]) client_version_above?([1, 2])
end end
def hgversion def hgversion
@@ -72,12 +72,7 @@ module Redmine
end end
def template_path_for(version) def template_path_for(version)
if ((version <=> [0,9,5]) > 0) || version.empty? "#{HELPERS_DIR}/#{TEMPLATE_NAME}-1.0.#{TEMPLATE_EXTENSION}"
ver = "1.0"
else
ver = "0.9.5"
end
"#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
end end
end end
@@ -294,11 +289,14 @@ module Redmine
# Runs 'hg' command with the given args # Runs 'hg' command with the given args
def hg(*args, &block) def hg(*args, &block)
repo_path = root_url || url repo_path = root_url || url
full_args = [HG_BIN, '-R', repo_path, '--encoding', 'utf-8'] full_args = ['-R', repo_path, '--encoding', 'utf-8']
full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}" full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}"
full_args << '--config' << 'diff.git=false' full_args << '--config' << 'diff.git=false'
full_args += args full_args += args
ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block) ret = shellout(
self.class.sq_bin + ' ' + full_args.map { |e| shell_quote e.to_s }.join(' '),
&block
)
if $? && $?.exitstatus != 0 if $? && $?.exitstatus != 0
raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}" raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}"
end end
@@ -32,7 +32,7 @@ module Redmine
end end
def sq_bin def sq_bin
@@sq_bin ||= shell_quote(SVN_BIN) @@sq_bin ||= shell_quote_command
end end
def client_version def client_version
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 1 MAJOR = 1
MINOR = 2 MINOR = 2
TINY = 1 TINY = 3
# Branch values: # Branch values:
# * official release: nil # * official release: nil
+2 -2
View File
@@ -100,14 +100,14 @@ Processed emails control options:
Examples: Examples:
# No project specified. Emails MUST contain the 'Project' keyword: # No project specified. Emails MUST contain the 'Project' keyword:
rake redmine:email:receive_iamp RAILS_ENV="production" \\ rake redmine:email:receive_imap RAILS_ENV="production" \\
host=imap.foo.bar username=redmine@example.net password=xxx host=imap.foo.bar username=redmine@example.net password=xxx
# Fixed project and default tracker specified, but emails can override # Fixed project and default tracker specified, but emails can override
# both tracker and priority attributes: # both tracker and priority attributes:
rake redmine:email:receive_iamp RAILS_ENV="production" \\ rake redmine:email:receive_imap RAILS_ENV="production" \\
host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\ host=imap.foo.bar username=redmine@example.net password=xxx ssl=1 \\
project=foo \\ project=foo \\
tracker=bug \\ tracker=bug \\
@@ -51,7 +51,7 @@ Calendar._FD = 0;
Calendar._MN = new Array Calendar._MN = new Array
("Sijecanj", ("Sijecanj",
"Veljaca", "Veljaca",
"Ožujak", "Ožujak",
"Travanj", "Travanj",
"Svibanj", "Svibanj",
"Lipanj", "Lipanj",
@@ -66,7 +66,7 @@ Calendar._MN = new Array
Calendar._SMN = new Array Calendar._SMN = new Array
("Sij", ("Sij",
"Velj", "Velj",
"Ožu", "Ožu",
"Tra", "Tra",
"Svi", "Svi",
"Lip", "Lip",
@@ -100,7 +100,7 @@ Calendar._TT["ABOUT_TIME"] = "\n\n" +
Calendar._TT["PREV_YEAR"] = "Prethodna godina (hold for menu)"; Calendar._TT["PREV_YEAR"] = "Prethodna godina (hold for menu)";
Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (hold for menu)"; Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (hold for menu)";
Calendar._TT["GO_TODAY"] = "Na današnji dan"; Calendar._TT["GO_TODAY"] = "Na današnji dan";
Calendar._TT["NEXT_MONTH"] = "Naredni mjesec (hold for menu)"; Calendar._TT["NEXT_MONTH"] = "Naredni mjesec (hold for menu)";
Calendar._TT["NEXT_YEAR"] = "Naredna godina (hold for menu)"; Calendar._TT["NEXT_YEAR"] = "Naredna godina (hold for menu)";
Calendar._TT["SEL_DATE"] = "Odaberite datum"; Calendar._TT["SEL_DATE"] = "Odaberite datum";
@@ -109,7 +109,7 @@ Calendar._TT["PART_TODAY"] = " (Danas)";
// the following is to inform that "%s" is to be the first day of week // the following is to inform that "%s" is to be the first day of week
// %s will be replaced with the day name. // %s will be replaced with the day name.
Calendar._TT["DAY_FIRST"] = "Prikaži %s prvo"; Calendar._TT["DAY_FIRST"] = "Prikaži %s prvo";
// This may be locale-dependent. It specifies the week-end days, as an array // This may be locale-dependent. It specifies the week-end days, as an array
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 // of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+1 -6
View File
@@ -1,9 +1,4 @@
class AuthSource < ActiveRecord::Base class AuthSource < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Auth0'
def self.next_name
@last_name ||= 'Auth0'
@last_name.succ!
@last_name
end
end end
+2 -14
View File
@@ -1,20 +1,8 @@
class Board < ActiveRecord::Base class Board < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'A Forum'
generator_for :description, :method => :next_description generator_for :description, :start => 'Some description here'
generator_for :project, :method => :generate_project generator_for :project, :method => :generate_project
def self.next_name
@last_name ||= 'A Forum'
@last_name.succ!
@last_name
end
def self.next_description
@last_description ||= 'Some description here'
@last_description.succ!
@last_description
end
def self.generate_project def self.generate_project
Project.generate! Project.generate!
end end
+1 -7
View File
@@ -1,14 +1,8 @@
class Change < ActiveRecord::Base class Change < ActiveRecord::Base
generator_for :action => 'A' generator_for :action => 'A'
generator_for :path, :method => :next_path generator_for :path, :start => 'test/dir/aaa0001'
generator_for :changeset, :method => :generate_changeset generator_for :changeset, :method => :generate_changeset
def self.next_path
@last_path ||= 'test/dir/aaa0001'
@last_path.succ!
@last_path
end
def self.generate_changeset def self.generate_changeset
Changeset.generate! Changeset.generate!
end end
+1 -7
View File
@@ -1,14 +1,8 @@
class Changeset < ActiveRecord::Base class Changeset < ActiveRecord::Base
generator_for :revision, :method => :next_revision generator_for :revision, :start => '1'
generator_for :committed_on => Date.today generator_for :committed_on => Date.today
generator_for :repository, :method => :generate_repository generator_for :repository, :method => :generate_repository
def self.next_revision
@last_revision ||= '1'
@last_revision.succ!
@last_revision
end
def self.generate_repository def self.generate_repository
Repository::Subversion.generate! Repository::Subversion.generate!
end end
+1 -6
View File
@@ -1,10 +1,5 @@
class CustomField < ActiveRecord::Base class CustomField < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'CustomField0'
generator_for :field_format => 'string' generator_for :field_format => 'string'
def self.next_name
@last_name ||= 'CustomField0'
@last_name.succ!
@last_name
end
end end
+1 -6
View File
@@ -1,10 +1,5 @@
class DocumentCategory < Enumeration class DocumentCategory < Enumeration
generator_for :name, :method => :next_name generator_for :name, :start => 'DocumentCategory0'
generator_for :type => 'DocumentCategory' generator_for :type => 'DocumentCategory'
def self.next_name
@last_name ||= 'DocumentCategory0'
@last_name.succ!
@last_name
end
end end
+1 -6
View File
@@ -1,9 +1,4 @@
class Document < ActiveRecord::Base class Document < ActiveRecord::Base
generator_for :title, :method => :next_title generator_for :title, :start => 'Document001'
def self.next_title
@last_title ||= 'Document001'
@last_title.succ!
@last_title
end
end end
+1 -7
View File
@@ -1,10 +1,4 @@
class EnabledModule < ActiveRecord::Base class EnabledModule < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'module_001'
def self.next_name
@last_name ||= 'module_001'
@last_name.succ!
@last_name
end
end end
+1 -6
View File
@@ -1,10 +1,5 @@
class Enumeration < ActiveRecord::Base class Enumeration < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Enumeration0'
generator_for :type => 'TimeEntryActivity' generator_for :type => 'TimeEntryActivity'
def self.next_name
@last_name ||= 'Enumeration0'
@last_name.succ!
@last_name
end
end end
+1 -7
View File
@@ -1,10 +1,4 @@
class Group < Principal class Group < Principal
generator_for :lastname, :method => :next_lastname generator_for :lastname, :start => 'Group'
def self.next_lastname
@last_lastname ||= 'Group'
@last_lastname.succ!
@last_lastname
end
end end
+1 -6
View File
@@ -1,9 +1,4 @@
class IssueCategory < ActiveRecord::Base class IssueCategory < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Category 0001'
def self.next_name
@last_name ||= 'Category 0001'
@last_name.succ!
@last_name
end
end end
+1 -8
View File
@@ -1,14 +1,8 @@
class Issue < ActiveRecord::Base class Issue < ActiveRecord::Base
generator_for :subject, :method => :next_subject generator_for :subject, :start => 'Subject 0'
generator_for :author, :method => :next_author generator_for :author, :method => :next_author
generator_for :priority, :method => :fetch_priority generator_for :priority, :method => :fetch_priority
def self.next_subject
@last_subject ||= 'Subject 0'
@last_subject.succ!
@last_subject
end
def self.next_author def self.next_author
User.generate_with_protected! User.generate_with_protected!
end end
@@ -16,5 +10,4 @@ class Issue < ActiveRecord::Base
def self.fetch_priority def self.fetch_priority
IssuePriority.first || IssuePriority.generate! IssuePriority.first || IssuePriority.generate!
end end
end end
+1 -6
View File
@@ -1,10 +1,5 @@
class IssuePriority < Enumeration class IssuePriority < Enumeration
generator_for :name, :method => :next_name generator_for :name, :start => 'IssuePriority0'
generator_for :type => 'IssuePriority' generator_for :type => 'IssuePriority'
def self.next_name
@last_name ||= 'IssuePriority0'
@last_name.succ!
@last_name
end
end end
+1 -6
View File
@@ -1,9 +1,4 @@
class IssueStatus < ActiveRecord::Base class IssueStatus < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Status 0'
def self.next_name
@last_name ||= 'Status 0'
@last_name.succ!
@last_name
end
end end
+2 -14
View File
@@ -1,20 +1,8 @@
class Message < ActiveRecord::Base class Message < ActiveRecord::Base
generator_for :subject, :method => :next_subject generator_for :subject, :start => 'A Message'
generator_for :content, :method => :next_content generator_for :content, :start => 'Some content here'
generator_for :board, :method => :generate_board generator_for :board, :method => :generate_board
def self.next_subject
@last_subject ||= 'A Message'
@last_subject.succ!
@last_subject
end
def self.next_content
@last_content ||= 'Some content here'
@last_content.succ!
@last_content
end
def self.generate_board def self.generate_board
Board.generate! Board.generate!
end end
+2 -13
View File
@@ -1,16 +1,5 @@
class News < ActiveRecord::Base class News < ActiveRecord::Base
generator_for :title, :method => :next_title generator_for :title, :start => 'A New Item'
generator_for :description, :method => :next_description generator_for :description, :start => 'Some content here'
def self.next_title
@last_title ||= 'A New Item'
@last_title.succ!
@last_title
end
def self.next_description
@last_description ||= 'Some content here'
@last_description.succ!
@last_description
end
end end
+2 -15
View File
@@ -1,22 +1,9 @@
class Project < ActiveRecord::Base class Project < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Project 0'
generator_for :identifier, :method => :next_identifier_from_object_daddy generator_for :identifier, :start => 'project-0000'
generator_for :enabled_modules, :method => :all_modules generator_for :enabled_modules, :method => :all_modules
generator_for :trackers, :method => :next_tracker generator_for :trackers, :method => :next_tracker
def self.next_name
@last_name ||= 'Project 0'
@last_name.succ!
@last_name
end
# Project#next_identifier is defined on Redmine
def self.next_identifier_from_object_daddy
@last_identifier ||= 'project-0000'
@last_identifier.succ!
@last_identifier
end
def self.all_modules def self.all_modules
[].tap do |modules| [].tap do |modules|
Redmine::AccessControl.available_project_modules.each do |name| Redmine::AccessControl.available_project_modules.each do |name|
+1 -6
View File
@@ -1,9 +1,4 @@
class Query < ActiveRecord::Base class Query < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Query 0'
def self.next_name
@last_name ||= 'Query 0'
@last_name.succ!
@last_name
end
end end
+1 -7
View File
@@ -1,11 +1,5 @@
class Repository < ActiveRecord::Base class Repository < ActiveRecord::Base
generator_for :type => 'Subversion' generator_for :type => 'Subversion'
generator_for :url, :method => :next_url generator_for :url, :start => 'file:///test/svn'
def self.next_url
@last_url ||= 'file:///test/svn'
@last_url.succ!
@last_url
end
end end
+1 -5
View File
@@ -1,8 +1,4 @@
class Role < ActiveRecord::Base class Role < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Role0'
def self.next_name
@last_name ||= 'Role0'
@last_name.succ!
end
end end
@@ -1,11 +1,5 @@
class Repository::Subversion < Repository class Repository::Subversion < Repository
generator_for :type, :method => 'Subversion' generator_for :type, :method => 'Subversion'
generator_for :url, :method => :next_url generator_for :url, :start => 'file:///test/svn'
def self.next_url
@last_url ||= 'file:///test/svn'
@last_url.succ!
@last_url
end
end end
+1 -6
View File
@@ -1,10 +1,5 @@
class TimeEntryActivity < Enumeration class TimeEntryActivity < Enumeration
generator_for :name, :method => :next_name generator_for :name, :start => 'TimeEntryActivity0'
generator_for :type => 'TimeEntryActivity' generator_for :type => 'TimeEntryActivity'
def self.next_name
@last_name ||= 'TimeEntryActivity0'
@last_name.succ!
@last_name
end
end end
-1
View File
@@ -6,5 +6,4 @@ class TimeEntry < ActiveRecord::Base
def self.generate_user def self.generate_user
User.generate_with_protected! User.generate_with_protected!
end end
end end
+1 -6
View File
@@ -1,9 +1,4 @@
class Tracker < ActiveRecord::Base class Tracker < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Tracker 0'
def self.next_name
@last_name ||= 'Tracker 0'
@last_name.succ!
@last_name
end
end end
+3 -21
View File
@@ -1,30 +1,12 @@
class User < Principal class User < Principal
generator_for :login, :method => :next_login generator_for :login, :start => 'user1'
generator_for :mail, :method => :next_email generator_for :mail, :method => :next_email
generator_for :firstname, :method => :next_firstname generator_for :firstname, :start => 'Bob'
generator_for :lastname, :method => :next_lastname generator_for :lastname, :start => 'Doe'
def self.next_login
@gen_login ||= 'user1'
@gen_login.succ!
@gen_login
end
def self.next_email def self.next_email
@last_email ||= 'user1' @last_email ||= 'user1'
@last_email.succ! @last_email.succ!
"#{@last_email}@example.com" "#{@last_email}@example.com"
end end
def self.next_firstname
@last_firstname ||= 'Bob'
@last_firstname.succ!
@last_firstname
end
def self.next_lastname
@last_lastname ||= 'Doe'
@last_lastname.succ!
@last_lastname
end
end end
+1 -7
View File
@@ -1,11 +1,5 @@
class Version < ActiveRecord::Base class Version < ActiveRecord::Base
generator_for :name, :method => :next_name generator_for :name, :start => 'Version 1.0.0'
generator_for :status => 'open' generator_for :status => 'open'
def self.next_name
@last_name ||= 'Version 1.0.0'
@last_name.succ!
@last_name
end
end end
+1 -7
View File
@@ -1,13 +1,7 @@
class WikiPage < ActiveRecord::Base class WikiPage < ActiveRecord::Base
generator_for :title, :method => :next_title generator_for :title, :start => 'AWikiPage'
generator_for :wiki, :method => :generate_wiki generator_for :wiki, :method => :generate_wiki
def self.next_title
@last_title ||= 'AWikiPage'
@last_title.succ!
@last_title
end
def self.generate_wiki def self.generate_wiki
Wiki.generate! Wiki.generate!
end end
+2 -14
View File
@@ -1,20 +1,8 @@
class WikiRedirect < ActiveRecord::Base class WikiRedirect < ActiveRecord::Base
generator_for :title, :method => :next_title generator_for :title, :start => 'AWikiPage'
generator_for :redirects_to, :method => :next_redirects_to generator_for :redirects_to, :start => '/a/path/000001'
generator_for :wiki, :method => :generate_wiki generator_for :wiki, :method => :generate_wiki
def self.next_title
@last_title ||= 'AWikiPage'
@last_title.succ!
@last_title
end
def self.next_redirects_to
@last_redirect ||= '/a/path/000001'
@last_redirect.succ!
@last_redirect
end
def self.generate_wiki def self.generate_wiki
Wiki.generate! Wiki.generate!
end end
+1 -1
View File
@@ -102,7 +102,7 @@ attachments_009:
container_type: Version container_type: Version
container_id: 1 container_id: 1
downloads: 0 downloads: 0
disk_filename: 060719210727_version_file.zip disk_filename: 060719210727_archive.zip
digest: b91e08d0cf966d5c6ff411bd8c4cc3a2 digest: b91e08d0cf966d5c6ff411bd8c4cc3a2
id: 9 id: 9
filesize: 452 filesize: 452
@@ -0,0 +1,240 @@
From JSmith@somenet.foo Mon Jun 27 06:55:56 2011
Return-Path: <JSmith@somenet.foo>
X-Original-To: redmine@somenet.foo
Delivered-To: redmine@somenet.foo
From: John Smith <JSmith@somenet.foo>
Mime-Version: 1.0 (Apple Message framework v1084)
Content-Type: multipart/alternative; boundary=Apple-Mail-3-163265085
Subject: Test attaching images to tickets by HTML mail
Date: Mon, 27 Jun 2011 16:55:46 +0300
To: redmine@somenet.foo
Message-Id: <7ABE3636-07E8-47C9-90A1-FCB1AA894DA1@somenet.foo>
X-Mailer: Apple Mail (2.1084)
--Apple-Mail-3-163265085
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=us-ascii
Yet another test!
--Apple-Mail-3-163265085
Content-Type: multipart/related;
type="text/html";
boundary=Apple-Mail-4-163265085
--Apple-Mail-4-163265085
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
charset=us-ascii
<html><head></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<br></body></html>=
--Apple-Mail-4-163265085
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename=paella.jpg
Content-Type: image/jpg;
x-unix-mode=0644;
name="paella.jpg"
Content-Id: <1207F0B5-9F9D-4AB4-B547-AF9033E82111>
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
cbis+/WpUqUcMZKdF44n/9k=
--Apple-Mail-4-163265085--
--Apple-Mail-3-163265085--
+15 -2
View File
@@ -104,6 +104,12 @@ class AttachmentsControllerTest < ActionController::TestCase
assert_equal 'application/x-ruby', @response.content_type assert_equal 'application/x-ruby', @response.content_type
end end
def test_download_version_file_with_issue_tracking_disabled
Project.find(1).disable_module! :issue_tracking
get :download, :id => 9
assert_response :success
end
def test_download_should_assign_content_type_if_blank def test_download_should_assign_content_type_if_blank
Attachment.find(4).update_attribute(:content_type, '') Attachment.find(4).update_attribute(:content_type, '')
@@ -123,6 +129,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_destroy_issue_attachment def test_destroy_issue_attachment
set_tmp_attachments_directory
issue = Issue.find(3) issue = Issue.find(3)
@request.session[:user_id] = 2 @request.session[:user_id] = 2
@@ -139,6 +146,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_destroy_wiki_page_attachment def test_destroy_wiki_page_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do assert_difference 'Attachment.count', -1 do
post :destroy, :id => 3 post :destroy, :id => 3
@@ -147,6 +155,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_destroy_project_attachment def test_destroy_project_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do assert_difference 'Attachment.count', -1 do
post :destroy, :id => 8 post :destroy, :id => 8
@@ -155,6 +164,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_destroy_version_attachment def test_destroy_version_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2 @request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do assert_difference 'Attachment.count', -1 do
post :destroy, :id => 9 post :destroy, :id => 9
@@ -163,8 +173,11 @@ class AttachmentsControllerTest < ActionController::TestCase
end end
def test_destroy_without_permission def test_destroy_without_permission
post :destroy, :id => 3 set_tmp_attachments_directory
assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fdestroy%2F3' assert_no_difference 'Attachment.count' do
delete :destroy, :id => 3
end
assert_response 302
assert Attachment.find_by_id(3) assert Attachment.find_by_id(3)
end end
end end
@@ -115,4 +115,23 @@ class ContextMenusControllerTest < ActionController::TestCase
assert_template 'context_menu' assert_template 'context_menu'
assert_equal [1], assigns(:issues).collect(&:id) assert_equal [1], assigns(:issues).collect(&:id)
end end
def test_time_entries_context_menu
@request.session[:user_id] = 2
get :time_entries, :ids => [1, 2]
assert_response :success
assert_template 'time_entries'
assert_tag 'a', :content => 'Edit'
assert_no_tag 'a', :content => 'Edit', :attributes => {:class => /disabled/}
end
def test_time_entries_context_menu_without_edit_permission
@request.session[:user_id] = 2
Role.find_by_name('Manager').remove_permission! :edit_time_entries
get :time_entries, :ids => [1, 2]
assert_response :success
assert_template 'time_entries'
assert_tag 'a', :content => 'Edit', :attributes => {:class => /disabled/}
end
end end
+38 -12
View File
@@ -78,17 +78,6 @@ class IssuesControllerTest < ActionController::TestCase
assert_tag :tag => 'a', :content => /Subproject issue/ assert_tag :tag => 'a', :content => /Subproject issue/
end end
def test_index_should_not_list_issues_when_module_disabled
EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
get :index
assert_response :success
assert_template 'index.rhtml'
assert_not_nil assigns(:issues)
assert_nil assigns(:project)
assert_no_tag :tag => 'a', :content => /Can't print recipes/
assert_tag :tag => 'a', :content => /Subproject issue/
end
def test_index_should_list_visible_issues_only def test_index_should_list_visible_issues_only
get :index, :per_page => 100 get :index, :per_page => 100
assert_response :success assert_response :success
@@ -296,6 +285,27 @@ class IssuesControllerTest < ActionController::TestCase
:parent => { :tag => 'select', :attributes => { :id => "selected_columns" } } :parent => { :tag => 'select', :attributes => { :id => "selected_columns" } }
end end
def test_index_without_project_should_implicitly_add_project_column_to_default_columns
Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
get :index, :set_filter => 1
# query should use specified columns
query = assigns(:query)
assert_kind_of Query, query
assert_equal [:project, :tracker, :subject, :assigned_to], query.columns.map(&:name)
end
def test_index_without_project_and_explicit_default_columns_should_not_add_project_column
Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
columns = ['tracker', 'subject', 'assigned_to']
get :index, :set_filter => 1, :c => columns
# query should use specified columns
query = assigns(:query)
assert_kind_of Query, query
assert_equal columns.map(&:to_sym), query.columns.map(&:name)
end
def test_index_with_custom_field_column def test_index_with_custom_field_column
columns = %w(tracker subject cf_2) columns = %w(tracker subject cf_2)
get :index, :set_filter => 1, :c => columns get :index, :set_filter => 1, :c => columns
@@ -862,6 +872,22 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal Issue.find(1), assigns(:issue) assert_equal Issue.find(1), assigns(:issue)
end end
def test_get_edit_should_display_the_time_entry_form_with_log_time_permission
@request.session[:user_id] = 2
Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time]
get :edit, :id => 1
assert_tag 'input', :attributes => {:name => 'time_entry[hours]'}
end
def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission
@request.session[:user_id] = 2
Role.find_by_name('Manager').remove_permission! :log_time
get :edit, :id => 1
assert_no_tag 'input', :attributes => {:name => 'time_entry[hours]'}
end
def test_get_edit_with_params def test_get_edit_with_params
@request.session[:user_id] = 2 @request.session[:user_id] = 2
get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 }, get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
@@ -1258,7 +1284,7 @@ class IssuesControllerTest < ActionController::TestCase
:attributes => {:name => "issue[custom_field_values][#{field.id}]"}, :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
:children => { :children => {
:only => {:tag => 'option'}, :only => {:tag => 'option'},
:count => Project.find(1).versions.count + 1 :count => Project.find(1).shared_versions.count + 1
} }
end end
@@ -30,6 +30,14 @@ class RepositoriesGitControllerTest < ActionController::TestCase
PRJ_ID = 3 PRJ_ID = 3
CHAR_1_HEX = "\xc3\x9c" CHAR_1_HEX = "\xc3\x9c"
## Git, Mercurial and CVS path encodings are binary.
## Subversion supports URL encoding for path.
## Redmine Mercurial adapter and extension use URL encoding.
## Git accepts only binary path in command line parameter.
## So, there is no way to use binary command line parameter in JRuby.
JRUBY_SKIP = (RUBY_PLATFORM == 'java')
JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
def setup def setup
@ruby19_non_utf8_pass = @ruby19_non_utf8_pass =
(RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8') (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
@@ -157,6 +165,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 JRUBY_SKIP
puts JRUBY_SKIP_STR
else else
with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1| ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|
@@ -313,6 +323,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 JRUBY_SKIP
puts JRUBY_SKIP_STR
else else
with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1| ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|
+12
View File
@@ -39,7 +39,10 @@ class SysControllerTest < ActionController::TestCase
assert_equal 'application/xml', @response.content_type assert_equal 'application/xml', @response.content_type
with_options :tag => 'projects' do |test| with_options :tag => 'projects' do |test|
test.assert_tag :children => { :count => Project.active.has_module(:repository).count } test.assert_tag :children => { :count => Project.active.has_module(:repository).count }
test.assert_tag 'project', :child => {:tag => 'identifier', :sibling => {:tag => 'is-public'}}
end end
assert_no_tag 'extra-info'
assert_no_tag 'extra_info'
end end
def test_create_project_repository def test_create_project_repository
@@ -49,10 +52,19 @@ class SysControllerTest < ActionController::TestCase
:vendor => 'Subversion', :vendor => 'Subversion',
:repository => { :url => 'file:///create/project/repository/subproject2'} :repository => { :url => 'file:///create/project/repository/subproject2'}
assert_response :created assert_response :created
assert_equal 'application/xml', @response.content_type
r = Project.find(4).repository r = Project.find(4).repository
assert r.is_a?(Repository::Subversion) assert r.is_a?(Repository::Subversion)
assert_equal 'file:///create/project/repository/subproject2', r.url assert_equal 'file:///create/project/repository/subproject2', r.url
assert_tag 'repository-subversion',
:child => {
:tag => 'id', :content => r.id.to_s,
:sibling => {:tag => 'url', :content => r.url}
}
assert_no_tag 'extra-info'
assert_no_tag 'extra_info'
end end
def test_fetch_changesets def test_fetch_changesets
@@ -115,6 +115,18 @@ class TimelogControllerTest < ActionController::TestCase
assert_equal 3, t.user_id assert_equal 3, t.user_id
end end
def test_create_without_log_time_permission_should_be_denied
@request.session[:user_id] = 2
Role.find_by_name('Manager').remove_permission! :log_time
post :create, :project_id => 1,
:time_entry => {:activity_id => '11',
:issue_id => '',
:spent_on => '2008-03-14',
:hours => '7.3'}
assert_response 403
end
def test_update def test_update
entry = TimeEntry.find(1) entry = TimeEntry.find(1)
assert_equal 1, entry.issue_id assert_equal 1, entry.issue_id
@@ -161,6 +173,9 @@ class TimelogControllerTest < ActionController::TestCase
def test_bulk_update_on_different_projects def test_bulk_update_on_different_projects
@request.session[:user_id] = 2 @request.session[:user_id] = 2
# makes user a manager on the other project
Member.create!(:user_id => 2, :project_id => 3, :role_ids => [1])
# update time entry activity # update time entry activity
post :bulk_update, :ids => [1, 2, 4], :time_entry => { :activity_id => 9 } post :bulk_update, :ids => [1, 2, 4], :time_entry => { :activity_id => 9 }
@@ -203,6 +218,14 @@ class TimelogControllerTest < ActionController::TestCase
assert_redirected_to :controller => 'timelog', :action => 'index', :project_id => Project.find(1).identifier assert_redirected_to :controller => 'timelog', :action => 'index', :project_id => Project.find(1).identifier
end end
def test_post_bulk_update_without_edit_permission_should_be_denied
@request.session[:user_id] = 2
Role.find_by_name('Manager').remove_permission! :edit_time_entries
post :bulk_update, :ids => [1,2]
assert_response 403
end
def test_destroy def test_destroy
@request.session[:user_id] = 2 @request.session[:user_id] = 2
delete :destroy, :id => 1 delete :destroy, :id => 1
+7
View File
@@ -44,6 +44,13 @@ class WikiControllerTest < ActionController::TestCase
:content => 'Page with an inline image' } } :content => 'Page with an inline image' } }
end end
def test_export_link
Role.anonymous.add_permission! :export_wiki_pages
get :show, :project_id => 'ecookbook'
assert_response :success
assert_tag 'a', :attributes => {:href => '/projects/ecookbook/wiki/CookBook_documentation.txt'}
end
def test_show_page_with_name def test_show_page_with_name
get :show, :project_id => 1, :id => 'Another_page' get :show, :project_id => 1, :id => 'Another_page'
assert_response :success assert_response :success
+11 -2
View File
@@ -1,5 +1,5 @@
# redMine - project management software # Redmine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang # Copyright (C) 2006-2011 Jean-Philippe Lang
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@@ -25,6 +25,15 @@ class CustomFieldTest < ActiveSupport::TestCase
assert field.save assert field.save
end end
def test_regexp_validation
field = IssueCustomField.new(:name => 'regexp', :field_format => 'text', :regexp => '[a-z0-9')
assert !field.save
assert_equal I18n.t('activerecord.errors.messages.invalid'), field.errors.on(:regexp)
field.regexp = '[a-z0-9]'
assert field.save
end
def test_possible_values_should_accept_an_array def test_possible_values_should_accept_an_array
field = CustomField.new field = CustomField.new
field.possible_values = ["One value", ""] field.possible_values = ["One value", ""]
@@ -0,0 +1,76 @@
# Redmine - project management software
# Copyright (C) 2006-2011 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 CustomFieldVersionFormatTest < ActiveSupport::TestCase
fixtures :custom_fields, :projects, :members, :users, :member_roles, :trackers, :issues, :versions
def setup
@field = IssueCustomField.create!(:name => 'Tester', :field_format => 'version')
end
def test_possible_values_with_no_arguments
assert_equal [], @field.possible_values
assert_equal [], @field.possible_values(nil)
end
def test_possible_values_with_project_resource
project = Project.find(1)
possible_values = @field.possible_values(project.issues.first)
assert possible_values.any?
assert_equal project.shared_versions.sort.collect(&:id).map(&:to_s), possible_values
end
def test_possible_values_with_nil_project_resource
assert_equal [], @field.possible_values(Issue.new)
end
def test_possible_values_options_with_no_arguments
assert_equal [], @field.possible_values_options
assert_equal [], @field.possible_values_options(nil)
end
def test_possible_values_options_with_project_resource
project = Project.find(1)
possible_values_options = @field.possible_values_options(project.issues.first)
assert possible_values_options.any?
assert_equal project.shared_versions.sort.map {|u| [u.name, u.id.to_s]}, possible_values_options
end
def test_possible_values_options_with_array
projects = Project.find([1, 2])
possible_values_options = @field.possible_values_options(projects)
assert possible_values_options.any?
assert_equal (projects.first.shared_versions & projects.last.shared_versions).sort.map {|u| [u.name, u.id.to_s]}, possible_values_options
end
def test_cast_blank_value
assert_equal nil, @field.cast_value(nil)
assert_equal nil, @field.cast_value("")
end
def test_cast_valid_value
version = @field.cast_value("2")
assert_kind_of Version, version
assert_equal Version.find(2), version
end
def test_cast_invalid_value
assert_equal nil, @field.cast_value("187")
end
end
+2
View File
@@ -64,6 +64,8 @@ class CustomValueTest < ActiveSupport::TestCase
assert v.valid? assert v.valid?
v.value = 'abc' v.value = 'abc'
assert !v.valid? assert !v.valid?
v.value = '1975-07-33'
assert !v.valid?
v.value = '1975-07-14' v.value = '1975-07-14'
assert v.valid? assert v.valid?
end end
@@ -375,6 +375,26 @@ RAW
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) } to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
end end
def test_wiki_links_within_local_file_generation_context
to_test = {
# link to a page
'[[CookBook documentation]]' => '<a href="CookBook_documentation.html" class="wiki-page">CookBook documentation</a>',
'[[CookBook documentation|documentation]]' => '<a href="CookBook_documentation.html" class="wiki-page">documentation</a>',
'[[CookBook documentation#One-section]]' => '<a href="CookBook_documentation.html#One-section" class="wiki-page">CookBook documentation</a>',
'[[CookBook documentation#One-section|documentation]]' => '<a href="CookBook_documentation.html#One-section" class="wiki-page">documentation</a>',
# page that doesn't exist
'[[Unknown page]]' => '<a href="Unknown_page.html" class="wiki-page new">Unknown page</a>',
'[[Unknown page|404]]' => '<a href="Unknown_page.html" class="wiki-page new">404</a>',
'[[Unknown page#anchor]]' => '<a href="Unknown_page.html#anchor" class="wiki-page new">Unknown page</a>',
'[[Unknown page#anchor|404]]' => '<a href="Unknown_page.html#anchor" class="wiki-page new">404</a>',
}
@project = Project.find(1)
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text, :wiki_links => :local) }
end
def test_html_tags def test_html_tags
to_test = { to_test = {
"<div>content</div>" => "<p>&lt;div&gt;content&lt;/div&gt;</p>", "<div>content</div>" => "<p>&lt;div&gt;content&lt;/div&gt;</p>",
@@ -533,6 +553,43 @@ EXPECTED
assert_equal expected, textilizable(raw) assert_equal expected, textilizable(raw)
end end
def test_headings_with_special_chars
# This test makes sure that the generated anchor names match the expected
# ones even if the heading text contains unconventional characters
raw = 'h1. Some heading related to version 0.5'
anchor = sanitize_anchor_name("Some-heading-related-to-version-0.5")
expected = %|<a name="#{anchor}"></a>\n<h1 >Some heading related to version 0.5<a href="##{anchor}" class="wiki-anchor">&para;</a></h1>|
assert_equal expected, textilizable(raw)
end
def test_wiki_links_within_wiki_page_context
page = WikiPage.find_by_title('Another_page' )
to_test = {
# link to another page
'[[CookBook documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">CookBook documentation</a>',
'[[CookBook documentation|documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation" class="wiki-page">documentation</a>',
'[[CookBook documentation#One-section]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">CookBook documentation</a>',
'[[CookBook documentation#One-section|documentation]]' => '<a href="/projects/ecookbook/wiki/CookBook_documentation#One-section" class="wiki-page">documentation</a>',
# link to the current page
'[[Another page]]' => '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Another page</a>',
'[[Another page|Page]]' => '<a href="/projects/ecookbook/wiki/Another_page" class="wiki-page">Page</a>',
'[[Another page#anchor]]' => '<a href="#anchor" class="wiki-page">Another page</a>',
'[[Another page#anchor|Page]]' => '<a href="#anchor" class="wiki-page">Page</a>',
# page that doesn't exist
'[[Unknown page]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">Unknown page</a>',
'[[Unknown page|404]]' => '<a href="/projects/ecookbook/wiki/Unknown_page" class="wiki-page new">404</a>',
'[[Unknown page#anchor]]' => '<a href="/projects/ecookbook/wiki/Unknown_page#anchor" class="wiki-page new">Unknown page</a>',
'[[Unknown page#anchor|404]]' => '<a href="/projects/ecookbook/wiki/Unknown_page#anchor" class="wiki-page new">404</a>',
}
@project = Project.find(1)
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(WikiContent.generate!( :text => text, :page => page ), :text) }
end
def test_table_of_content def test_table_of_content
raw = <<-RAW raw = <<-RAW
{{toc}} {{toc}}
+28
View File
@@ -223,6 +223,20 @@ class IssueNestedSetTest < ActiveSupport::TestCase
assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt] assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt]
end end
def test_destroy_child_should_update_parent
issue = create_issue!
child1 = create_issue!(:parent_issue_id => issue.id)
child2 = create_issue!(:parent_issue_id => issue.id)
issue.reload
assert_equal [issue.id, 1, 6], [issue.root_id, issue.lft, issue.rgt]
child2.reload.destroy
issue.reload
assert_equal [issue.id, 1, 4], [issue.root_id, issue.lft, issue.rgt]
end
def test_destroy_parent_issue_updated_during_children_destroy def test_destroy_parent_issue_updated_during_children_destroy
parent = create_issue! parent = create_issue!
create_issue!(:start_date => Date.today, :parent_issue_id => parent.id) create_issue!(:start_date => Date.today, :parent_issue_id => parent.id)
@@ -253,6 +267,20 @@ class IssueNestedSetTest < ActiveSupport::TestCase
assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})" assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})"
end end
def test_destroy_issue_with_grand_child
parent = create_issue!
issue = create_issue!(:parent_issue_id => parent.id)
child = create_issue!(:parent_issue_id => issue.id)
grandchild1 = create_issue!(:parent_issue_id => child.id)
grandchild2 = create_issue!(:parent_issue_id => child.id)
assert_difference 'Issue.count', -4 do
Issue.find(issue.id).destroy
parent.reload
assert_equal [1, 2], [parent.lft, parent.rgt]
end
end
def test_parent_priority_should_be_the_highest_child_priority def test_parent_priority_should_be_the_highest_child_priority
parent = create_issue!(:priority => IssuePriority.find_by_name('Normal')) parent = create_issue!(:priority => IssuePriority.find_by_name('Normal'))
# Create children # Create children
+4 -4
View File
@@ -83,11 +83,11 @@ class IssueStatusTest < ActiveSupport::TestCase
assert_equal [2], status.new_statuses_allowed_to([role], tracker, false, false).map(&:id) assert_equal [2], status.new_statuses_allowed_to([role], tracker, false, false).map(&:id)
assert_equal [2], status.find_new_statuses_allowed_to([role], tracker, false, false).map(&:id) assert_equal [2], status.find_new_statuses_allowed_to([role], tracker, false, false).map(&:id)
assert_equal [2, 3], status.new_statuses_allowed_to([role], tracker, true, false).map(&:id) assert_equal [2, 3, 5], status.new_statuses_allowed_to([role], tracker, true, false).map(&:id)
assert_equal [2, 3], status.find_new_statuses_allowed_to([role], tracker, true, false).map(&:id) assert_equal [2, 3, 5], status.find_new_statuses_allowed_to([role], tracker, true, false).map(&:id)
assert_equal [2, 4], status.new_statuses_allowed_to([role], tracker, false, true).map(&:id) assert_equal [2, 4, 5], status.new_statuses_allowed_to([role], tracker, false, true).map(&:id)
assert_equal [2, 4], status.find_new_statuses_allowed_to([role], tracker, false, true).map(&:id) assert_equal [2, 4, 5], status.find_new_statuses_allowed_to([role], tracker, false, true).map(&:id)
assert_equal [2, 3, 4, 5], status.new_statuses_allowed_to([role], tracker, true, true).map(&:id) assert_equal [2, 3, 4, 5], status.new_statuses_allowed_to([role], tracker, true, true).map(&:id)
assert_equal [2, 3, 4, 5], status.find_new_statuses_allowed_to([role], tracker, true, true).map(&:id) assert_equal [2, 3, 4, 5], status.find_new_statuses_allowed_to([role], tracker, true, true).map(&:id)
+27 -2
View File
@@ -232,6 +232,22 @@ class IssueTest < ActiveSupport::TestCase
assert_equal custom_value.id, issue.custom_value_for(field).id assert_equal custom_value.id, issue.custom_value_for(field).id
end end
def test_should_not_update_custom_fields_on_changing_tracker_with_different_custom_fields
issue = Issue.new(:project_id => 1)
issue.attributes = {:tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'Test', :custom_field_values => {'2' => 'Test'}}
issue.save!
assert !Tracker.find(2).custom_field_ids.include?(2)
issue = Issue.find(issue.id)
issue.attributes = {:tracker_id => 2, :custom_field_values => {'1' => ''}}
issue = Issue.find(issue.id)
custom_value = issue.custom_value_for(2)
assert_not_nil custom_value
assert_equal 'Test', custom_value.value
end
def test_assigning_tracker_id_should_reload_custom_fields_values def test_assigning_tracker_id_should_reload_custom_fields_values
issue = Issue.new(:project => Project.find(1)) issue = Issue.new(:project => Project.find(1))
assert issue.custom_field_values.empty? assert issue.custom_field_values.empty?
@@ -293,10 +309,10 @@ class IssueTest < ActiveSupport::TestCase
assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id) assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id)
issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user) issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user)
assert_equal [1, 2, 3], issue.new_statuses_allowed_to(user).map(&:id) assert_equal [1, 2, 3, 5], issue.new_statuses_allowed_to(user).map(&:id)
issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user) issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user)
assert_equal [1, 2, 4], issue.new_statuses_allowed_to(user).map(&:id) assert_equal [1, 2, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user) issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user)
assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id) assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
@@ -674,6 +690,15 @@ class IssueTest < ActiveSupport::TestCase
assert issue.assignable_users.include?(non_project_member) assert issue.assignable_users.include?(non_project_member)
end end
should "include the current assignee" do
project = Project.find(1)
user = User.generate!
issue = Issue.generate_for_project!(project, :assigned_to => user)
user.lock!
assert Issue.find(issue.id).assignable_users.include?(user)
end
should "not show the issue author twice" do should "not show the issue author twice" do
assignable_user_ids = Issue.find(1).assignable_users.collect(&:id) assignable_user_ids = Issue.find(1).assignable_users.collect(&:id)
assert_equal 2, assignable_user_ids.length assert_equal 2, assignable_user_ids.length
+22
View File
@@ -43,6 +43,14 @@ class Redmine::CipheringTest < ActiveSupport::TestCase
end end
end end
def test_blank_password_should_be_clear
Redmine::Configuration.with 'database_cipher_key' => 'secret' do
r = Repository::Subversion.generate!(:password => '')
assert_equal '', r.password
assert_equal '', r.read_attribute(:password)
end
end
def test_unciphered_password_should_be_readable def test_unciphered_password_should_be_readable
Redmine::Configuration.with 'database_cipher_key' => nil do Redmine::Configuration.with 'database_cipher_key' => nil do
r = Repository::Subversion.generate!(:password => 'clear') r = Repository::Subversion.generate!(:password => 'clear')
@@ -54,6 +62,20 @@ class Redmine::CipheringTest < ActiveSupport::TestCase
end end
end end
def test_ciphered_password_with_no_cipher_key_configured_should_be_returned_ciphered
Redmine::Configuration.with 'database_cipher_key' => 'secret' do
r = Repository::Subversion.generate!(:password => 'clear')
end
Redmine::Configuration.with 'database_cipher_key' => '' do
r = Repository.first(:order => 'id DESC')
# password can not be deciphered
assert_nothing_raised do
assert r.password.match(/\Aaes-256-cbc:.+\Z/)
end
end
end
def test_encrypt_all def test_encrypt_all
Repository.delete_all Repository.delete_all
Redmine::Configuration.with 'database_cipher_key' => nil do Redmine::Configuration.with 'database_cipher_key' => nil do
@@ -20,6 +20,14 @@ begin
# WINDOWS_PASS = Redmine::Platform.mswin? # WINDOWS_PASS = Redmine::Platform.mswin?
WINDOWS_PASS = false WINDOWS_PASS = false
## Git, Mercurial and CVS path encodings are binary.
## Subversion supports URL encoding for path.
## Redmine Mercurial adapter and extension use URL encoding.
## Git accepts only binary path in command line parameter.
## So, there is no way to use binary command line parameter in JRuby.
JRUBY_SKIP = (RUBY_PLATFORM == 'java')
JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
def setup def setup
adapter_class = Redmine::Scm::Adapters::GitAdapter adapter_class = Redmine::Scm::Adapters::GitAdapter
@@ -262,6 +270,8 @@ begin
def test_latin_1_path def test_latin_1_path
if WINDOWS_PASS if WINDOWS_PASS
# #
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else else
p2 = "latin-1-dir/test-#{@char_1}-2.txt" p2 = "latin-1-dir/test-#{@char_1}-2.txt"
['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1| ['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1|
@@ -322,6 +332,8 @@ begin
def test_entries_latin_1_dir def test_entries_latin_1_dir
if WINDOWS_PASS if WINDOWS_PASS
# #
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else else
entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir", entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir",
'1ca7f5ed') '1ca7f5ed')
@@ -56,12 +56,14 @@ begin
end end
def test_template_path def test_template_path
to_test = { [0,9,5] => "0.9.5", to_test = {
[1,0] => "1.0", [1,2] => "1.0",
[] => "1.0", [] => "1.0",
[1,0,1] => "1.0", [1,2,1] => "1.0",
[1,7] => "1.0", [1,7] => "1.0",
[1,7,1] => "1.0" } [1,7,1] => "1.0",
[2,0] => "1.0",
}
to_test.each do |v, template| to_test.each do |v, template|
test_template_path_for(v, template) test_template_path_for(v, template)
end end
@@ -317,17 +319,21 @@ begin
assert_equal 1, nib1.size assert_equal 1, nib1.size
case bra case bra
when 'branch (1)[2]&,%.-3_4' when 'branch (1)[2]&,%.-3_4'
assert_equal 3, nib0.size if @adapter.class.client_version_above?([1, 6])
assert_equal nib0[0], 'afc61e85bde7' assert_equal 3, nib0.size
nib2 = @adapter.nodes_in_branch(bra, :limit => 2) assert_equal nib0[0], 'afc61e85bde7'
assert_equal 2, nib2.size nib2 = @adapter.nodes_in_branch(bra, :limit => 2)
assert_equal nib2[1], '933ca60293d7' assert_equal 2, nib2.size
assert_equal nib2[1], '933ca60293d7'
end
when @branch_char_1 when @branch_char_1
assert_equal 2, nib0.size if @adapter.class.client_version_above?([1, 6])
assert_equal nib0[1], '08ff3227303e' assert_equal 2, nib0.size
nib2 = @adapter.nodes_in_branch(bra, :limit => 1) assert_equal nib0[1], '08ff3227303e'
assert_equal 1, nib2.size nib2 = @adapter.nodes_in_branch(bra, :limit => 1)
assert_equal nib2[0], '7bbf4c738e71' assert_equal 1, nib2.size
assert_equal nib2[0], '7bbf4c738e71'
end
end end
end end
end end
@@ -1,5 +1,5 @@
# Redmine - project management software # Redmine - project management software
# Copyright (C) 2006-2010 Jean-Philippe Lang # Copyright (C) 2006-2011 Jean-Philippe Lang
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@@ -197,6 +197,13 @@ EXPECTED
assert_equal '<p>[msg1][msg2]</p>', to_html('[msg1][msg2]') assert_equal '<p>[msg1][msg2]</p>', to_html('[msg1][msg2]')
end end
def test_textile_should_escape_image_urls
# this is onclick="alert('XSS');" in encoded form
raw = '!/images/comment.png"onclick=&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;;&#x22;!'
expected = '<p><img src="/images/comment.png&quot;onclick=&amp;#x61;&amp;#x6c;&amp;#x65;&amp;#x72;&amp;#x74;&amp;#x28;&amp;#x27;&amp;#x58;&amp;#x53;&amp;#x53;&amp;#x27;&amp;#x29;;&amp;#x22;" alt="" /></p>'
assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '')
end
private private
def assert_html_output(to_test, expect_paragraph = true) def assert_html_output(to_test, expect_paragraph = true)
+10
View File
@@ -279,6 +279,16 @@ class MailHandlerTest < ActiveSupport::TestCase
assert_equal tracker, issue.tracker assert_equal tracker, issue.tracker
end end
def test_add_issue_from_apple_mail
issue = submit_email('apple_mail_with_attachment.eml', :issue => {:project => 'ecookbook'})
assert_kind_of Issue, issue
assert_equal 1, issue.attachments.size
attachment = issue.attachments.first
assert_equal 'paella.jpg', attachment.filename
assert_equal 10790, attachment.filesize
end
def test_should_ignore_emails_from_emission_address def test_should_ignore_emails_from_emission_address
Role.anonymous.add_permission!(:add_issues) Role.anonymous.add_permission!(:add_issues)
assert_no_difference 'User.count' do assert_no_difference 'User.count' do

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