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

View File

@@ -48,9 +48,8 @@ class ContextMenusController < ApplicationController
@projects = @time_entries.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@activities = TimeEntryActivity.shared.active
@can = {:edit => User.current.allowed_to?(:log_time, @projects),
:update => User.current.allowed_to?(:log_time, @projects),
:delete => User.current.allowed_to?(:log_time, @projects)
@can = {:edit => User.current.allowed_to?(:edit_time_entries, @projects),
:delete => User.current.allowed_to?(:edit_time_entries, @projects)
}
@back = back_url
render :layout => false

View File

@@ -20,7 +20,8 @@ class SysController < ActionController::Base
def projects
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
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}."
project.repository = Repository.factory(params[:vendor], params[:repository])
if project.repository && project.repository.save
render :xml => project.repository, :status => 201
render :xml => project.repository.to_xml(:only => [:id, :url]), :status => 201
else
render :nothing => true, :status => 422
end

View File

@@ -550,15 +550,20 @@ module ApplicationHelper
if page =~ /^(.+?)\#(.+)$/
page, anchor = $1, $2
end
anchor = sanitize_anchor_name(anchor) if anchor.present?
# check if page exists
wiki_page = link_project.wiki.find_page(page)
url = case options[:wiki_links]
when :local; "#{title}.html"
url = if anchor.present? && wiki_page.present? && (obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version)) && obj.page == wiki_page
"##{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
else
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)
end
end
link_to((title || page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
else
# project or wiki doesn't exist
@@ -703,7 +708,7 @@ module ApplicationHelper
text.gsub!(HEADING_RE) do
level, attrs, content = $1.to_i, $2, $3
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]
"<a name=\"#{anchor}\"></a>\n<h#{level} #{attrs}>#{content}<a href=\"##{anchor}\" class=\"wiki-anchor\">&para;</a></h#{level}>"
end
@@ -889,6 +894,10 @@ module ApplicationHelper
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
def javascript_heads
tags = javascript_include_tag(:defaults)

View File

@@ -193,7 +193,7 @@ class Changeset < ActiveRecord::Base
def fix_issue(issue)
status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i)
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
end

View File

@@ -42,6 +42,14 @@ class CustomField < ActiveRecord::Base
errors.add(:possible_values, :invalid) unless self.possible_values.is_a? Array
end
if regexp.present?
begin
Regexp.new(regexp)
rescue
errors.add(:regexp, :invalid)
end
end
# validate default value
v = CustomValue.new(:custom_field => self.clone, :value => default_value, :customized => nil)
v.custom_field.is_required = false
@@ -56,7 +64,7 @@ class CustomField < ActiveRecord::Base
when 'user'
obj.project.users.sort.collect {|u| [u.to_s, u.id.to_s]}
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
elsif obj.is_a?(Array)
obj.collect {|o| possible_values_options(o)}.inject {|memo, v| memo & v}

View File

@@ -62,7 +62,7 @@ protected
when 'float'
begin; Kernel.Float(value); rescue; errors.add(:value, :invalid) end
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'
errors.add(:value, :inclusion) unless custom_field.possible_values.include?(value)
end

View File

@@ -449,6 +449,7 @@ class Issue < ActiveRecord::Base
def assignable_users
users = project.assignable_users
users << author if author
users << assigned_to if assigned_to
users.uniq.sort
end

View File

@@ -58,8 +58,7 @@ class IssueStatus < ActiveRecord::Base
transitions = workflows.select do |w|
role_ids.include?(w.role_id) &&
w.tracker_id == tracker.id &&
(author || !w.author) &&
(assignee || !w.assignee)
((!w.author && !w.assignee) || (author && w.author) || (assignee && w.assignee))
end
transitions.collect{|w| w.new_status}.compact.sort
else
@@ -70,14 +69,17 @@ class IssueStatus < ActiveRecord::Base
# Same thing as above but uses a database query
# More efficient than the previous method if called just once
def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
if roles && tracker
conditions = {:role_id => roles.collect(&:id), :tracker_id => tracker.id}
conditions[:author] = false unless author
conditions[:assignee] = false unless assignee
if roles.present? && tracker
conditions = "(author = :false AND assignee = :false)"
conditions << " OR author = :true" if author
conditions << " OR assignee = :true" if assignee
workflows.find(:all,
:include => :new_status,
:conditions => conditions).collect{|w| w.new_status}.compact.sort
:include => :new_status,
: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
[]
end

View File

@@ -198,7 +198,7 @@ class MailHandler < ActionMailer::Base
end
def add_attachments(obj)
if email.has_attachments?
if email.attachments && email.attachments.any?
email.attachments.each do |attachment|
Attachment.create(:container => obj,
:file => attachment,

View File

@@ -809,6 +809,7 @@ class Project < ActiveRecord::Base
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.project = self
new_query.user_id = query.user_id
self.queries << new_query
end
end

View File

@@ -333,14 +333,17 @@ class Query < ActiveRecord::Base
end
def columns
if has_default_columns?
available_columns.select do |c|
# Adds the project column by default for cross-project lists
Setting.issue_list_default_columns.include?(c.name.to_s) || (c.name == :project && project.nil?)
end
else
# preserve the column_names order
column_names.collect {|name| available_columns.find {|col| col.name == name}}.compact
# preserve the column_names order
(has_default_columns? ? default_columns_names : column_names).collect do |name|
available_columns.find { |col| col.name == name }
end.compact
end
def default_columns_names
@default_columns_names ||= begin
default_columns = Setting.issue_list_default_columns.map(&:to_sym)
project.present? ? default_columns : [:project] | default_columns
end
end
@@ -349,7 +352,7 @@ class Query < ActiveRecord::Base
names = names.select {|n| n.is_a?(Symbol) || !n.blank? }
names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym }
# 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
end
end
@@ -518,7 +521,7 @@ class Query < ActiveRecord::Base
# Returns the issue count
def issue_count
Issue.count(:include => [:status, :project], :conditions => statement)
Issue.visible.count(:include => [:status, :project], :conditions => statement)
rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
end

View File

@@ -92,6 +92,17 @@ class Repository::Git < Repository
options = {:report_last_commit => extra_report_last_commit})
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.
# Redmine Mercurial fixed issues.
# * Redmine Takes Too Long On Large Mercurial Repository

View File

@@ -43,6 +43,11 @@ class Version < ActiveRecord::Base
user.allowed_to?(:view_issues, self.project)
end
# Version files have same visibility as project files
def attachments_visible?(*args)
project.present? && project.attachments_visible?(*args)
end
def start_date
@start_date ||= fixed_issues.minimum('start_date')
end

View File

@@ -30,7 +30,7 @@ class WikiPage < ActiveRecord::Base
:datetime => :created_on,
: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],
:permission => :view_wiki_pages,
:project_key => "#{Wiki.table_name}.project_id"

View File

@@ -15,13 +15,13 @@
<ul>
<% @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,
:selected => (@time_entry && u == @time_entry.activity), :disabled => !@can[:update] %></li>
:selected => (@time_entry && u == @time_entry.activity), :disabled => !@can[:edit] %></li>
<% 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,
:selected => (@time_entry && @time_entry.activity.nil?), :disabled => !@can[:update] %></li>
:selected => (@time_entry && @time_entry.activity.nil?), :disabled => !@can[:edit] %></li>
</ul>
</li>
<% end %>
<% end %>
<%= call_hook(:view_time_entries_context_menu_end, {:time_entries => @time_entries, :can => @can, :back => @back }) %>

View File

@@ -2,5 +2,5 @@
<p><em><%= format_time(document.updated_on) %></em></p>
<div class="wiki">
<%= textilizable(truncate_lines(document.description)) %>
<%= textilizable(truncate_lines(document.description), :object => document) %>
</div>

View File

@@ -15,7 +15,7 @@
<%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %>
</fieldset>
<% end %>
<% if authorize_for('timelog', 'edit') %>
<% if User.current.allowed_to?(:log_time, @project) %>
<fieldset class="tabular"><legend><%= l(:button_log_time) %></legend>
<% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
<div class="splitcontentleft">

View File

@@ -32,6 +32,7 @@
</div>
<% unless @hours.empty? %>
<div class="autoscroll">
<table class="list" id="time-report">
<thead>
<tr>
@@ -59,6 +60,7 @@
</tr>
</tbody>
</table>
</div>
<% other_formats_links do |f| %>
<%= f.link_to 'CSV', :url => params %>

View File

@@ -1,5 +1,6 @@
<% form_tag({}) do -%>
<%= hidden_field_tag 'back_url', url_for(params) %>
<div class="autoscroll">
<table class="list time-entries">
<thead>
<tr>
@@ -48,6 +49,7 @@
<% end -%>
</tbody>
</table>
</div>
<% end -%>
<%= context_menu time_entries_context_menu_path %>

View File

@@ -6,7 +6,7 @@
<h2><%= @page.pretty_title %></h2>
<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>
</p>

View File

@@ -46,8 +46,8 @@
<% end %>
<% other_formats_links do |f| %>
<%= f.link_to 'HTML', :url => {:id => @page.title, :version => @content.version} %>
<%= f.link_to 'TXT', :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 => params[:version]} %>
<% end if User.current.allowed_to?(:export_wiki_pages, @project) %>
<% content_for :header_tags do %>

View File

@@ -89,7 +89,7 @@ default:
authentication: :login
user_name: "redmine@example.net"
password: "redmine"
# Absolute path to the directory where attachments are stored.
# The default is the 'files' directory in your Redmine instance.
# Your Redmine instance needs to have write permission on this
@@ -98,7 +98,7 @@ default:
# attachments_storage_path: /var/redmine/files
# attachments_storage_path: D:/redmine/files
attachments_storage_path:
# Configuration of the autologin cookie.
# autologin_cookie_name: the name of the cookie (default: autologin)
# autologin_cookie_path: the cookie path (default: /)
@@ -106,10 +106,17 @@ default:
autologin_cookie_name:
autologin_cookie_path:
autologin_cookie_secure:
# Configuration of SCM executable command.
#
# 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:
# scm_subversion_command: svn # (default: svn)
# scm_mercurial_command: C:\Program Files\TortoiseHg\hg.exe # (default: hg)
@@ -117,13 +124,14 @@ default:
# scm_cvs_command: cvs # (default: cvs)
# scm_bazaar_command: bzr.exe # (default: bzr)
# scm_darcs_command: darcs-1.0.9-i386-linux # (default: darcs)
#
scm_subversion_command:
scm_mercurial_command:
scm_git_command:
scm_cvs_command:
scm_bazaar_command:
scm_darcs_command:
# Key used to encrypt sensitive data in the database (SCM and LDAP passwords).
# If you don't want to enable data encryption, just leave it blank.
# WARNING: losing/changing this key will make encrypted data unreadable.
@@ -136,8 +144,8 @@ default:
# * decrypt data using 'rake db:decrypt RAILS_ENV=production' first
# * change the cipher key here in your configuration file
# * encrypt data using 'rake db:encrypt RAILS_ENV=production'
database_cipher_key:
database_cipher_key:
# specific configuration options for production environment
# that overrides the default ones
production:

View File

@@ -368,7 +368,7 @@ bg:
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
setting_start_of_week: Първи ден на седмицата
setting_rest_api_enabled: Разрешаване на REST web сървис
setting_cache_formatted_text: Cache formatted text
setting_cache_formatted_text: Кещиране на форматираните текстове
setting_default_notification_option: Подразбиращ се начин за известяване
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
setting_commit_logtime_activity_id: Дейност при отчитане на работното време

View File

@@ -132,7 +132,7 @@ es:
greater_than_start_date: "debe ser posterior a la fecha de comienzo"
not_same_project: "no pertenece al mismo proyecto"
circular_dependency: "Esta relación podría crear una dependencia circular"
cant_link_an_issue_with_a_descendant: "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.

View File

@@ -34,40 +34,40 @@
distance_in_words:
half_a_minute: 'fél perc'
less_than_x_seconds:
# zero: 'kevesebb, mint 1 másodperc'
one: 'kevesebb, mint 1 másodperc'
other: 'kevesebb, mint %{count} másodperc'
# zero: 'kevesebb, mint 1 másodperce'
one: 'kevesebb, mint 1 másodperce'
other: 'kevesebb, mint %{count} másodperce'
x_seconds:
one: '1 másodperc'
other: '%{count} másodperc'
one: '1 másodperce'
other: '%{count} másodperce'
less_than_x_minutes:
# zero: 'kevesebb, mint 1 perc'
one: 'kevesebb, mint 1 perc'
other: 'kevesebb, mint %{count} perc'
# zero: 'kevesebb, mint 1 perce'
one: 'kevesebb, mint 1 perce'
other: 'kevesebb, mint %{count} perce'
x_minutes:
one: '1 perc'
other: '%{count} perc'
one: '1 perce'
other: '%{count} perce'
about_x_hours:
one: 'majdnem 1 óra'
other: 'majdnem %{count} óra'
one: 'csaknem 1 órája'
other: 'csaknem %{count} órája'
x_days:
one: '1 nap'
other: '%{count} nap'
one: '1 napja'
other: '%{count} napja'
about_x_months:
one: 'majdnem 1 hónap'
other: 'majdnem %{count} hónap'
one: 'csaknem 1 hónapja'
other: 'csaknem %{count} hónapja'
x_months:
one: '1 hónap'
other: '%{count} hónap'
one: '1 hónapja'
other: '%{count} hónapja'
about_x_years:
one: 'majdnem 1 év'
other: 'majdnem %{count} év'
one: 'csaknem 1 éve'
other: 'csaknem %{count} éve'
over_x_years:
one: 'több, mint 1 év'
other: 'több, mint %{count} év'
one: 'több, mint 1 éve'
other: 'több, mint %{count} éve'
almost_x_years:
one: "közel 1 év"
other: "közel %{count} év"
one: "csaknem 1 éve"
other: "csaknem %{count} éve"
prompts:
year: "Év"
month: "Hónap"
@@ -264,7 +264,7 @@
field_attr_mail: E-mail
field_onthefly: On-the-fly felhasználó létrehozás
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_hide_mail: Rejtse el az e-mail címem
field_comments: Megjegyzés
@@ -280,7 +280,7 @@
field_delay: Késés
field_assignable: Feladat rendelhető ehhez a szerepkörhöz
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_time_zone: Időzóna
field_searchable: Kereshető
@@ -326,7 +326,7 @@
project_module_documents: Dokumentumok
project_module_files: Fájlok
project_module_wiki: Wiki
project_module_repository: Tároló
project_module_repository: Forráskód
project_module_boards: Fórumok
label_user: Felhasználó
@@ -391,7 +391,7 @@
label_assigned_to_me_issues: A nekem kiosztott feladatok
label_last_login: Utolsó bejelentkezés
label_registered_on: Regisztrált
label_activity: Tevékenységek
label_activity: Történések
label_overall_activity: Teljes aktivitás
label_new: Új
label_logged_as: Bejelentkezve, mint
@@ -510,8 +510,8 @@
label_contains: tartalmazza
label_not_contains: nem tartalmazza
label_day_plural: nap
label_repository: Tároló
label_repository_plural: Tárolók
label_repository: Forráskód
label_repository_plural: Forráskódok
label_browse: Tallóz
label_modification: "%{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_sort_by: "%{value} szerint rendezve"
label_send_test_email: Teszt e-mail küldése
label_feeds_access_key_created_on: "RSS hozzáférési kulcs létrehozva ennyivel ezelőtt: %{value}"
label_feeds_access_key_created_on: "RSS hozzáférési kulcs létrehozva %{value}"
label_module_plural: Modulok
label_added_time_by: "%{author} adta hozzá ennyivel ezelőtt: %{age}"
label_updated_time: "Utolsó módosítás ennyivel ezelőtt: %{value}"
label_added_time_by: "%{author} adta hozzá %{age}"
label_updated_time: "Utolsó módosítás %{value}"
label_jump_to_a_project: Ugrás projekthez...
label_file_plural: Fájlok
label_changeset_plural: Changesets
@@ -695,11 +695,11 @@
text_unallowed_characters: Tiltott karakterek
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_issue_added: "A feladatot %{id} bejelentette: %{author}."
text_issue_updated: "A feladatot %{id} módosította: %{author}."
text_issue_added: "%{author} új feladatot hozott létre %{id} sorszámmal."
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_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_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_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_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_default_administrator_account_changed: Alapértelmezett adminisztrátor fiók megváltoztatva
text_file_repository_writable: Fájl tároló írható
text_rmagick_available: RMagick elérhető (opcionális)
text_destroy_time_entries_question: "%{hours} órányi munka van rögzítve a feladatokon, amiket törölni szeretne. Mit szeretne tenni ?"
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: 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_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_tracker_bug: Hiba
default_tracker_feature: Fejlesztés
default_tracker_support: Support
default_tracker_support: Támogatás
default_issue_status_new: Új
default_issue_status_in_progress: Folyamatban
default_issue_status_resolved: Megoldva
@@ -741,7 +741,7 @@
enumeration_doc_categories: Dokumentum kategóriák
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_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:"
label_duplicated_by: duplikálta
setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése
@@ -812,14 +812,14 @@
permission_edit_own_messages: Saját üzenetek szerkesztése
permission_delete_own_messages: Saját üzenetek törlése
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.'
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ó
warning_attachments_not_saved: "%{count} fájl mentése nem sikerült."
button_create_and_continue: Létrehozás és folytatás
text_custom_field_possible_values_info: 'Értékenként egy sor'
label_display: Megjelenés
label_display: Megmutat
field_editable: Szerkeszthető
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
@@ -835,40 +835,40 @@
label_greater_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_reassign_children: Az aloldalak hozzárendelése ehhez a szülő oldalhoz
text_wiki_page_nullify_children: Az aloldalak megtartása, mint főoldalak
text_wiki_page_reassign_children: Aloldalak hozzárendelése ehhez a szülő oldalhoz
text_wiki_page_nullify_children: Aloldalak átalakítása főoldal
text_wiki_page_destroy_children: Minden aloldal és leszármazottjának törlése
setting_password_min_length: Minimum jelszó hosszúság
field_group_by: Szerint csoportosítva
mail_subject_wiki_content_updated: "'%{id}' wiki oldal frissítve"
label_wiki_content_added: Wiki oldal hozzáadva
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
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
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_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_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_deleted: "%{label} törölve (%{old})"
text_journal_deleted: "%{label} törölve lett (%{old})"
label_group_plural: Csoportok
label_group: 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"
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
version_status_closed: lezárt
version_status_locked: zárolt
version_status_open: nyitott
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
setting_default_projects_modules: Alapértelmezett modulok az új projektekhez
setting_gravatar_default: Alapértelmezett Gravatar kép

View File

@@ -939,41 +939,41 @@ it:
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
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
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous
label_role_non_member: Non member
label_issue_note_added: Note added
label_issue_status_updated: Status updated
label_issue_priority_updated: Priority updated
label_issues_visibility_own: Issues created by or assigned to the user
field_issues_visibility: Issues visibility
label_issues_visibility_all: All issues
permission_set_own_issues_private: Set own issues public or private
field_is_private: Private
permission_set_issues_private: Set issues public or private
label_issues_visibility_public: All non private issues
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
field_warn_on_leaving_unsaved: Avvisami quando lascio una pagina con testo non salvato
text_warn_on_leaving_unsaved: La pagina corrente contiene del testo non salvato che verrà perso se lasci questa pagina.
label_my_queries: Le mie queries personalizzate
text_journal_changed_no_detail: "%{label} aggiornato"
label_news_comment_added: Commento aggiunto a una notizia
button_expand_all: Espandi tutto
button_collapse_all: Comprimi tutto
label_additional_workflow_transitions_for_assignee: Transizioni supplementari consentite quando l'utente è l'assegnatario
label_additional_workflow_transitions_for_author: Transizioni supplementari consentite quando l'utente è l'autore
label_bulk_edit_selected_time_entries: Modifica massiva delle ore segnalate selezionate
text_time_entries_destroy_confirmation: Sei sicuro di voler eliminare l'ora\e selezionata\e?
label_role_anonymous: Anonimo
label_role_non_member: Non membro
label_issue_note_added: Nota aggiunta
label_issue_status_updated: Stato aggiornato
label_issue_priority_updated: Priorità aggiornata
label_issues_visibility_own: Segnalazioni create o assegnate all'utente
field_issues_visibility: Visibilità segnalazioni
label_issues_visibility_all: Tutte le segnalazioni
permission_set_own_issues_private: Imposta le proprie segnalazioni pubbliche o private
field_is_private: Privato
permission_set_issues_private: Imposta le segnalazioni pubbliche o private
label_issues_visibility_public: Tutte le segnalazioni non private
text_issues_destroy_descendants_confirmation: Questo eliminerà anche %{count} sottoattività.
field_commit_logs_encoding: Codifica dei messaggi di commit
field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8"
field_path_to_repository: Path to repository
field_root_directory: Root directory
field_cvs_module: Module
field_scm_path_encoding: Codifica del percorso
text_scm_path_encoding_note: "Predefinito: UTF-8"
field_path_to_repository: Percorso del repository
field_root_directory: Directory radice
field_cvs_module: Modulo
field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command
text_scm_command_version: Version
label_git_report_last_commit: Report last commit for files and directories
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_git_repository_note: Repository centrale e locale (es. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Repository locale (es. /hgrepo, c:\hgrepo)
text_scm_command: Comando
text_scm_command_version: Versione
label_git_report_last_commit: Riporta l'ultimo commit per files e directories
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: Il comando scm non è disponibile. Controllare le impostazioni nel pannello di amministrazione.

View File

@@ -123,7 +123,7 @@ nl:
greater_than_start_date: "moet na de startdatum liggen"
not_same_project: "hoort niet bij hetzelfde project"
circular_dependency: "Deze relatie zou een circulaire afhankelijkheid tot gevolg hebben"
cant_link_an_issue_with_a_descendant: "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
@@ -703,7 +703,7 @@ nl:
setting_bcc_recipients: Blind carbon copy ontvangers (bcc)
setting_commit_fix_keywords: Gefixeerde 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_default_language: Standaard taal
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_assigned: Alleen voor dingen die aan mij zijn toegewezen
label_user_mail_option_none: Bij geen enkele gebeurtenis
field_member_of_group: Assignee's group
field_assigned_to_role: Assignee's role
field_member_of_group: Groep van toegewezene
field_assigned_to_role: Rol van toegewezene
notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd.
label_principal_search: "Zoek naar gebruiker of groep:"
label_user_search: "Zoek naar gebruiker:"
@@ -925,10 +925,10 @@ nl:
label_my_queries: Mijn aangepaste zoekopdrachten
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Commentaar toegevoegd aan een nieuwsitem
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
button_expand_all: Klap uit
button_collapse_all: Klap in
label_additional_workflow_transitions_for_assignee: Aanvullende veranderingen toegestaan wanneer de gebruiker de toegewezene is
label_additional_workflow_transitions_for_author: Aanvullende veranderingen toegestaan wanneer de gebruiker de auteur is
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous
@@ -946,7 +946,7 @@ nl:
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
field_commit_logs_encoding: Encodering van commit berichten
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_root_directory: Root directory
field_cvs_module: Module

View File

@@ -114,7 +114,7 @@
greater_than_start_date: "må være større enn startdato"
not_same_project: "hører ikke til samme prosjekt"
circular_dependency: "Denne relasjonen ville lagd en sirkulær avhengighet"
cant_link_an_issue_with_a_descendant: "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
@@ -212,7 +212,7 @@
field_role: Rolle
field_homepage: Hjemmeside
field_is_public: Offentlig
field_parent: Underprosjekt til
field_parent: Underprosjekt av
field_is_in_roadmap: Vises i veikart
field_login: Brukernavn
field_mail_notification: E-post-varsling
@@ -236,8 +236,8 @@
field_onthefly: On-the-fly brukeropprettelse
field_start_date: Start
field_done_ratio: "% Ferdig"
field_auth_source: Autentifikasjonsmodus
field_hide_mail: Skjul min e-post-adresse
field_auth_source: Autentiseringskilde
field_hide_mail: Skjul min epost-adresse
field_comments: Kommentarer
field_url: URL
field_start_page: Startside
@@ -247,7 +247,7 @@
field_spent_on: Dato
field_identifier: Identifikasjon
field_is_filter: Brukes som filter
field_issue_to: Relatert saker
field_issue_to: Relaterte saker
field_delay: Forsinkelse
field_assignable: Saker kan tildeles denne rollen
field_redirect_existing_links: Viderekoble eksisterende lenker
@@ -266,24 +266,24 @@
setting_self_registration: Selvregistrering
setting_attachment_max_size: Maks. størrelse vedlegg
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_host_name: Vertsnavn
setting_text_formatting: Tekstformattering
setting_wiki_compression: Komprimering av Wiki-historikk
setting_feeds_limit: Innholdsgrense for Feed
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_commit_ref_keywords: Nøkkelord for referanse
setting_commit_fix_keywords: Nøkkelord for retting
setting_autologin: Autoinnlogging
setting_date_format: Datoformat
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_repositories_encodings: Depot-tegnsett
setting_emails_footer: E-post-signatur
setting_emails_footer: Epost-signatur
setting_protocol: Protokoll
setting_per_page_options: Alternativer, objekter pr. side
setting_user_format: Visningsformat, brukere
@@ -291,8 +291,8 @@
setting_display_subprojects_issues: Vis saker fra underprosjekter på hovedprosjekt som standard
setting_enabled_scm: Aktiviserte SCM
project_module_issue_tracking: Sakssporing
project_module_time_tracking: Tidssporing
project_module_issue_tracking: Sakshåndtering
project_module_time_tracking: Tidsregistrering
project_module_news: Nyheter
project_module_documents: Dokumenter
project_module_files: Filer
@@ -326,7 +326,7 @@
label_role: Rolle
label_role_plural: Roller
label_role_new: Ny rolle
label_role_and_permissions: Roller og tillatelser
label_role_and_permissions: Roller og rettigheter
label_member: Medlem
label_member_new: Nytt medlem
label_member_plural: Medlemmer
@@ -343,7 +343,7 @@
label_custom_field: Eget felt
label_custom_field_plural: Egne felt
label_custom_field_new: Nytt eget felt
label_enumerations: Kodelister
label_enumerations: Listeverdier
label_enumeration_new: Ny verdi
label_information: Informasjon
label_information_plural: Informasjon
@@ -367,10 +367,10 @@
label_new: Ny
label_logged_as: Innlogget som
label_environment: Miljø
label_authentication: Autentifikasjon
label_auth_source: Autentifikasjonsmodus
label_auth_source_new: Ny autentifikasjonmodus
label_auth_source_plural: Autentifikasjonsmoduser
label_authentication: Autentisering
label_auth_source: Autentiseringskilde
label_auth_source_new: Ny autentiseringskilde
label_auth_source_plural: Autentiseringskilder
label_subproject_plural: Underprosjekter
label_and_its_subprojects: "%{value} og dets underprosjekter"
label_min_max_length: Min.-maks. lengde
@@ -423,13 +423,13 @@
one: 1 åpen
other: "%{count} åpne"
label_x_closed_issues_abbr:
zero: 0 lukka
one: 1 lukka
other: "%{count} lukka"
zero: 0 lukket
one: 1 lukket
other: "%{count} lukket"
label_total: Totalt
label_permissions: Godkjenninger
label_permissions: Rettigheter
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_none: ingen
label_nobody: ingen
@@ -437,7 +437,7 @@
label_previous: Forrige
label_used_by: Brukt av
label_details: Detaljer
label_add_note: Legg til notis
label_add_note: Legg til notat
label_per_page: Pr. side
label_calendar: Kalender
label_months_from: måneder fra
@@ -449,7 +449,7 @@
label_comment: Kommentar
label_comment_plural: Kommentarer
label_x_comments:
zero: no kommentarer
zero: ingen kommentarer
one: 1 kommentar
other: "%{count} kommentarer"
label_comment_add: Legg til kommentar
@@ -518,11 +518,11 @@
label_preview: Forhåndsvis
label_feed_plural: Feeder
label_changes_details: Detaljer om alle endringer
label_issue_tracking: Sakssporing
label_issue_tracking: Sakshåndtering
label_spent_time: Brukt tid
label_f_hour: "%{value} time"
label_f_hour_plural: "%{value} timer"
label_time_tracking: Tidssporing
label_time_tracking: Tidsregistrering
label_change_plural: Endringer
label_statistics: Statistikk
label_commits_per_month: Innsendinger pr. måned
@@ -532,7 +532,7 @@
label_diff_side_by_side: side ved side
label_options: Alternativer
label_copy_workflow_from: Kopier arbeidsflyt fra
label_permissions_report: Godkjenningsrapport
label_permissions_report: Rettighetsrapport
label_watched_issues: Overvåkede saker
label_related_issues: Relaterte saker
label_applied_status: Gitt status
@@ -571,7 +571,7 @@
label_date_to: Til
label_language_based: Basert på brukerens språk
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_module_plural: Moduler
label_added_time_by: "Lagt til av %{author} for %{age} siden"
@@ -598,7 +598,7 @@
label_more: Mer
label_scm: SCM
label_plugins: Tillegg
label_ldap_authentication: LDAP-autentifikasjon
label_ldap_authentication: LDAP-autentisering
label_downloads_abbr: Nedl.
label_optional_description: Valgfri beskrivelse
label_add_another_file: Legg til en fil til
@@ -650,7 +650,7 @@
status_locked: låst
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_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."
@@ -667,8 +667,8 @@
text_unallowed_characters: Ugyldige tegn
text_comma_separated: Flere verdier tillat (kommaseparert).
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_updated: "Issue %{id} has been updated by %{author}."
text_issue_added: "Sak %{id} er innrapportert av %{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_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
@@ -695,12 +695,12 @@
default_tracker_feature: Funksjon
default_tracker_support: Support
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_feedback: Tilbakemelding
default_issue_status_closed: Lukket
default_issue_status_rejected: Avvist
default_doc_category_user: Bruker-dokumentasjon
default_doc_category_user: Brukerdokumentasjon
default_doc_category_tech: Teknisk dokumentasjon
default_priority_low: Lav
default_priority_normal: Normal
@@ -711,16 +711,16 @@
default_activity_development: Utvikling
enumeration_issue_priorities: Sakssprioriteringer
enumeration_doc_categories: Dokument-kategorier
enumeration_activities: Aktiviteter (tidssporing)
enumeration_doc_categories: Dokumentkategorier
enumeration_activities: Aktiviteter (tidsregistrering)
text_enumeration_category_reassign_to: 'Endre dem til denne verdien:'
text_enumeration_destroy_question: "%{count} objekter er endret til denne verdien."
label_incoming_emails: Innkommende e-post
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
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å."
field_parent_title: Foreldreside
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: Overordnet side
label_issue_watchers: Overvåkere
button_quote: Sitat
setting_sequential_project_identifiers: Generer sekvensielle prosjekt-IDer
@@ -731,39 +731,39 @@
permission_view_files: Vise filer
permission_edit_issues: Redigere saker
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_log_time: Loggføre timer
permission_view_changesets: Vise endringssett
permission_view_time_entries: Vise brukte timer
permission_manage_versions: Behandle versjoner
permission_manage_wiki: Behandle wiki
permission_manage_categories: Behandle kategorier for saker
permission_manage_versions: Administrere versjoner
permission_manage_wiki: Administrere wiki
permission_manage_categories: Administrere kategorier for saker
permission_protect_wiki_pages: Beskytte wiki-sider
permission_comment_news: Kommentere nyheter
permission_delete_messages: Slette meldinger
permission_select_project_modules: Velge prosjekt-moduler
permission_manage_documents: Behandle dokumenter
permission_select_project_modules: Velge prosjektmoduler
permission_manage_documents: Administrere dokumenter
permission_edit_wiki_pages: Redigere wiki-sider
permission_add_issue_watchers: Legge til overvåkere
permission_view_gantt: Vise gantt-diagram
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_manage_boards: Behandle forum
permission_manage_boards: Administrere forum
permission_delete_wiki_pages_attachments: Slette vedlegg
permission_view_wiki_edits: Vise wiki-historie
permission_add_messages: Sende meldinger
permission_view_messages: Vise meldinger
permission_manage_files: Behandle filer
permission_manage_files: Administrere filer
permission_edit_issue_notes: Redigere notater
permission_manage_news: Behandle nyheter
permission_manage_news: Administrere nyheter
permission_view_calendar: Vise kalender
permission_manage_members: Behandle medlemmer
permission_manage_members: Administrere medlemmer
permission_edit_messages: Redigere meldinger
permission_delete_issues: Slette saker
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_browse_repository: Bla gjennom depot
permission_view_documents: Vise dokumenter
@@ -777,189 +777,191 @@
setting_gravatar_enabled: Bruk Gravatar-brukerikoner
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."
permission_edit_own_messages: Edit own messages
permission_delete_own_messages: Delete own messages
label_user_activity: "%{value}'s activity"
label_updated_time_by: "Updated by %{author} %{age} ago"
permission_edit_own_messages: Rediger egne meldinger
permission_delete_own_messages: Slett egne meldinger
label_user_activity: "%{value}s aktivitet"
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.'
setting_diff_max_lines_displayed: Max number of diff lines displayed
text_plugin_assets_writable: Plugin assets directory writable
warning_attachments_not_saved: "%{count} file(s) could not be saved."
button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value'
label_display: Display
field_editable: Editable
setting_repository_log_display_limit: Maximum number of revisions displayed on file log
warning_attachments_not_saved: "%{count} fil(er) kunne ikke lagres."
button_create_and_continue: Opprett og fortsett
text_custom_field_possible_values_info: 'En linje for hver verdi'
label_display: Visning
field_editable: Redigerbar
setting_repository_log_display_limit: Maks antall revisjoner vist i fil-loggen
setting_file_max_size_displayed: Max size of text files displayed inline
field_watcher: Watcher
setting_openid: Allow OpenID login and registration
field_watcher: Overvåker
setting_openid: Tillat OpenID innlogging og registrering
field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID
field_content: Content
label_descending: Descending
label_sort: Sort
label_ascending: Ascending
label_date_from_to: From %{start} to %{end}
label_login_with_open_id_option: eller logg inn med OpenID
field_content: Innhold
label_descending: Synkende
label_sort: Sorter
label_ascending: Stigende
label_date_from_to: Fra %{start} til %{end}
label_greater_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_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
text_wiki_page_destroy_question: Denne siden har %{descendants} underside(r). Hva ønsker du å gjøre?
text_wiki_page_reassign_children: Tilknytt undersider til denne overordnede siden
text_wiki_page_nullify_children: Behold undersider som rotsider
text_wiki_page_destroy_children: Slett undersider og alle deres underliggende sider
setting_password_min_length: Minimum passordlengde
field_group_by: Grupper resultater etter
mail_subject_wiki_content_updated: "Wiki-side '%{id}' er oppdatert"
label_wiki_content_added: Wiki-side opprettet
mail_subject_wiki_content_added: "Wiki-side '%{id}' er opprettet"
mail_body_wiki_content_added: Wiki-siden '%{id}' ble opprettet av %{author}.
label_wiki_content_updated: Wiki-side oppdatert
mail_body_wiki_content_updated: Wiki-siden '%{id}' ble oppdatert av %{author}.
permission_add_project: Opprett prosjekt
setting_new_project_user_role_id: Rolle gitt en ikke-administratorbruker som oppretter et prosjekt
label_view_all_revisions: Se alle revisjoner
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "%{label} changed from %{old} to %{new}"
text_journal_set_to: "%{label} set to %{value}"
text_journal_deleted: "%{label} deleted (%{old})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "%{label} %{value} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_branch: Gren
error_no_tracker_in_project: Ingen sakstyper er tilknyttet dette prosjektet. Vennligst kontroller prosjektets innstillinger.
error_no_default_issue_status: Ingen standard saksstatus er angitt. Vennligst kontroller konfigurasjonen (Gå til "Administrasjon -> Saksstatuser").
text_journal_changed: "%{label} endret fra %{old} til %{new}"
text_journal_set_to: "%{label} satt til %{value}"
text_journal_deleted: "%{label} slettet (%{old})"
label_group_plural: Grupper
label_group: Gruppe
label_group_new: Ny gruppe
label_time_entry_plural: Brukt tid
text_journal_added: "%{label} %{value} lagt til"
field_active: Aktiv
enumeration_system_activity: Systemaktivitet
permission_delete_issue_watchers: Slett overvåkere
version_status_closed: stengt
version_status_locked: låst
version_status_open: åpen
error_can_not_reopen_issue_on_closed_version: En sak tilknyttet en stengt versjon kan ikke gjenåpnes.
label_user_anonymous: Anonym
button_move_and_follow: Flytt og følg etter
setting_default_projects_modules: Standard aktiverte moduler for nye prosjekter
setting_gravatar_default: Standard Gravatar-bilde
field_sharing: Deling
label_version_sharing_hierarchy: Med prosjekt-hierarki
label_version_sharing_system: Med alle prosjekter
label_version_sharing_descendants: Med underprosjekter
label_version_sharing_tree: Med prosjekt-tre
label_version_sharing_none: Ikke delt
error_can_not_archive_project: Dette prosjektet kan ikke arkiveres
button_duplicate: Duplikat
button_copy_and_follow: Kopier og følg etter
label_copy_source: Kilde
setting_issue_done_ratio: Kalkuler ferdigstillingsprosent ut i fra
setting_issue_done_ratio_issue_status: Bruk saksstatuser
error_issue_done_ratios_not_updated: Ferdigstillingsprosent oppdateres ikke.
error_workflow_copy_target: Vennligst velg sakstype(r) og rolle(r)
setting_issue_done_ratio_issue_field: Bruk felt fra saker
label_copy_same_as_target: Samme som mål
label_copy_target: Mål
notice_issue_done_ratios_updated: Ferdigstillingsprosent oppdatert.
error_workflow_copy_source: Vennligst velg en kilde-sakstype eller rolle.
label_update_issue_done_ratios: Oppdatert ferdigstillingsprosent
setting_start_of_week: Start kalender på
permission_view_issues: Se på saker
label_display_used_statuses_only: Vis kun statuser som brukes av denne sakstypen
label_revision_id: Revision %{value}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created %{value} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
label_api_access_key: API tilgangsnøkkel
label_api_access_key_created_on: API tilgangsnøkkel opprettet for %{value} siden
label_feeds_access_key: RSS tilgangsnøkkel
notice_api_access_key_reseted: Din API tilgangsnøkkel ble resatt.
setting_rest_api_enabled: Aktiver REST webservice
label_missing_api_access_key: Mangler en API tilgangsnøkkel
label_missing_feeds_access_key: Mangler en RSS tilgangsnøkkel
button_show: Vis
text_line_separated: Flere verdier er tillatt (en linje per verdi).
setting_mail_handler_body_delimiters: Avkort epost etter en av disse linjene
permission_add_subprojects: Opprett underprosjekt
label_subproject_new: Nytt underprosjekt
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.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect (%{value})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
Du er i ferd med å fjerne noen eller alle rettigheter og vil kanskje ikke være i stand til å redigere dette prosjektet etterpå.
Er du sikker på at du vil fortsette?
label_close_versions: Steng fullførte versjoner
label_board_sticky: Fast
label_board_locked: Låst
permission_export_wiki_pages: Eksporter wiki-sider
setting_cache_formatted_text: Mellomlagre formattert tekst
permission_manage_project_activities: Administrere prosjektaktiviteter
error_unable_delete_issue_status: Kan ikke slette saksstatus
label_profile: Profil
permission_manage_subtasks: Administrere undersaker
field_parent_issue: Overordnet sak
label_subtask_plural: Undersaker
label_project_copy_notifications: Send epost-varslinger under prosjektkopiering
error_can_not_delete_custom_field: Kan ikke slette eget felt
error_unable_to_connect: Kunne ikke koble til (%{value})
error_can_not_remove_role: Denne rollen er i bruk og kan ikke slettes.
error_can_not_delete_tracker: Denne sakstypen inneholder saker og kan ikke slettes.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): %{errors}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
label_my_page_block: Min side felt
notice_failed_to_save_members: "Feil ved lagring av medlem(mer): %{errors}."
text_zoom_out: Zoom ut
text_zoom_in: Zoom inn
notice_unable_delete_time_entry: Kan ikke slette oppføring fra timeliste.
label_overall_spent_time: All tidsbruk
field_time_entries: Loggfør tid
project_module_gantt: Gantt
project_module_calendar: Calendar
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
label_user_mail_option_only_assigned: Only for things I am assigned to
label_user_mail_option_none: No events
field_member_of_group: Assignee's group
field_assigned_to_role: Assignee's role
notice_not_authorized_archived_project: The project you're trying to access has been archived.
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"
field_visible: Visible
setting_emails_header: Emails header
setting_commit_logtime_activity_id: Activity for logged time
text_time_logged_by_changeset: Applied in changeset %{value}.
setting_commit_logtime_enabled: Enable time logging
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous
label_role_non_member: Non member
label_issue_note_added: Note added
label_issue_status_updated: Status updated
label_issue_priority_updated: Priority updated
label_issues_visibility_own: Issues created by or assigned to the user
field_issues_visibility: Issues visibility
label_issues_visibility_all: All issues
permission_set_own_issues_private: Set own issues public or private
field_is_private: Private
permission_set_issues_private: Set issues public or private
label_issues_visibility_public: All non private issues
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
project_module_calendar: Kalender
button_edit_associated_wikipage: "Rediger tilhørende Wiki-side: %{page_title}"
text_are_you_sure_with_children: Slett sak og alle undersaker?
field_text: Tekstfelt
label_user_mail_option_only_owner: Kun for ting jeg eier
setting_default_notification_option: Standardvalg for varslinger
label_user_mail_option_only_my_events: Kun for ting jeg overvåker eller er involvert i
label_user_mail_option_only_assigned: Kun for ting jeg er tildelt
label_user_mail_option_none: Ingen hendelser
field_member_of_group: Den tildeltes gruppe
field_assigned_to_role: Den tildeltes rolle
notice_not_authorized_archived_project: Prosjektet du forsøker å åpne er blitt arkivert.
label_principal_search: "Søk etter bruker eller gruppe:"
label_user_search: "Søk etter bruker:"
field_visible: Synlig
setting_emails_header: Eposthode
setting_commit_logtime_activity_id: Aktivitet for logget tid.
text_time_logged_by_changeset: Lagt til i endringssett %{value}.
setting_commit_logtime_enabled: Muliggjør loggføring av tid
notice_gantt_chart_truncated: Diagrammet ble avkortet fordi det overstiger det maksimale antall elementer som kan vises (%{max})
setting_gantt_items_limit: Maksimalt antall elementer vist på gantt-diagrammet
field_warn_on_leaving_unsaved: Vis meg en advarsel når jeg forlater en side med ikke lagret tekst
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: Mine egne spørringer
text_journal_changed_no_detail: "%{label} oppdatert"
label_news_comment_added: Kommentar lagt til en nyhet
button_expand_all: Utvid alle
button_collapse_all: Kollaps alle
label_additional_workflow_transitions_for_assignee: Ytterligere overganger tillatt når brukeren er sakens tildelte
label_additional_workflow_transitions_for_author: Ytterligere overganger tillatt når brukeren er den som har opprettet saken
label_bulk_edit_selected_time_entries: Masserediger valgte timeliste-oppføringer
text_time_entries_destroy_confirmation: Er du sikker på du vil slette de(n) valgte timeliste-oppføringen(e)?
label_role_anonymous: Anonym
label_role_non_member: Ikke medlem
label_issue_note_added: Notat lagt til
label_issue_status_updated: Status oppdatert
label_issue_priority_updated: Prioritet oppdatert
label_issues_visibility_own: Saker opprettet av eller tildelt brukeren
field_issues_visibility: Synlighet på saker
label_issues_visibility_all: Alle saker
permission_set_own_issues_private: Gjør egne saker offentlige eller private
field_is_private: Privat
permission_set_issues_private: Gjør saker offentlige eller private
label_issues_visibility_public: Alle ikke-private saker
text_issues_destroy_descendants_confirmation: Dette vil også slette %{count} undersak(er).
field_commit_logs_encoding: Tegnkoding for innsendingsmeldinger
field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8"
field_path_to_repository: Path to repository
field_root_directory: Root directory
field_cvs_module: Module
field_scm_path_encoding: Koding av sti
text_scm_path_encoding_note: "Standard: UTF-8"
field_path_to_repository: Sti til depot
field_root_directory: Rotkatalog
field_cvs_module: Modul
field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command
text_scm_command_version: Version
label_git_report_last_commit: Report last commit for files and directories
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_mercurial_repository_note: Lokalt depot (f.eks. /hgrepo, c:\hgrepo)
text_scm_command: Kommando
text_scm_command_version: Versjon
label_git_report_last_commit: Rapporter siste innsending for filer og kataloger
text_scm_config: Du kan konfigurere scm kommandoer i config/configuration.yml. Vennligst restart applikasjonen etter å ha redigert filen.
text_scm_command_not_available: Scm kommando er ikke tilgjengelig. Vennligst kontroller innstillingene i administrasjonspanelet.
text_git_repository_note: Depot er bart og lokalt (f.eks. /gitrepo, c:\gitrepo)

View File

@@ -961,7 +961,7 @@ pt-BR:
setting_commit_logtime_enabled: Habilitar registro de horas
notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max})
setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt
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.
label_my_queries: Minhas consultas personalizadas
text_journal_changed_no_detail: "%{label} atualizado(a)"

View File

@@ -9,12 +9,12 @@ sl:
short: "%b %d"
long: "%B %d, %Y"
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
day_names: [Nedelja, Ponedeljek, Torek, Sreda, Četrtek, Petek, Sobota]
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
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
month_names: [~, Januar, Februar, Marec, April, Maj, Junij, Julij, Avgust, September, Oktober, November, December]
abbr_month_names: [~, Jan, Feb, Mar, Apr, Maj, Jun, Jul, Aug, Sep, Okt, Nov, Dec]
# Used in date_select and datime_select.
order:
- :year
@@ -32,40 +32,40 @@ sl:
datetime:
distance_in_words:
half_a_minute: "half a minute"
half_a_minute: "pol minute"
less_than_x_seconds:
one: "less than 1 second"
other: "less than %{count} seconds"
one: "manj kot 1. sekundo"
other: "manj kot %{count} sekund"
x_seconds:
one: "1 second"
other: "%{count} seconds"
one: "1. sekunda"
other: "%{count} sekund"
less_than_x_minutes:
one: "less than a minute"
other: "less than %{count} minutes"
one: "manj kot minuto"
other: "manj kot %{count} minut"
x_minutes:
one: "1 minute"
other: "%{count} minutes"
one: "1 minuta"
other: "%{count} minut"
about_x_hours:
one: "about 1 hour"
other: "about %{count} hours"
one: "okrog 1. ure"
other: "okrog %{count} ur"
x_days:
one: "1 day"
other: "%{count} days"
one: "1 dan"
other: "%{count} dni"
about_x_months:
one: "about 1 month"
other: "about %{count} months"
one: "okrog 1. mesec"
other: "okrog %{count} mesecev"
x_months:
one: "1 month"
other: "%{count} months"
one: "1 mesec"
other: "%{count} mesecev"
about_x_years:
one: "about 1 year"
other: "about %{count} years"
one: "okrog 1. leto"
other: "okrog %{count} let"
over_x_years:
one: "over 1 year"
other: "over %{count} years"
one: "več kot 1. leto"
other: "več kot %{count} let"
almost_x_years:
one: "almost 1 year"
other: "almost %{count} years"
one: "skoraj 1. leto"
other: "skoraj %{count} let"
number:
format:
@@ -90,15 +90,15 @@ sl:
# Used in array.to_sentence.
support:
array:
sentence_connector: "and"
sentence_connector: "in"
skip_last_comma: false
activerecord:
errors:
template:
header:
one: "1 error prohibited this %{model} from being saved"
other: "%{count} errors prohibited this %{model} from being saved"
one: "1. napaka je preprečila temu %{model} da bi se shranil"
other: "%{count} napak je preprečilo temu %{model} da bi se shranil"
messages:
inclusion: "ni vključen na seznamu"
exclusion: "je rezerviran"
@@ -113,17 +113,17 @@ sl:
taken: "je že zaseden"
not_a_number: "ni število"
not_a_date: "ni veljaven datum"
greater_than: "must be greater than %{count}"
greater_than_or_equal_to: "must be greater than or equal to %{count}"
equal_to: "must be equal to %{count}"
less_than: "must be less than %{count}"
less_than_or_equal_to: "must be less than or equal to %{count}"
odd: "must be odd"
even: "must be even"
greater_than_start_date: "mora biti kasnejši kot začeten datum"
greater_than: "mora biti večji kot %{count}"
greater_than_or_equal_to: "mora biti večji ali enak kot %{count}"
equal_to: "mora biti enak kot %{count}"
less_than: "mora biti manjši kot %{count}"
less_than_or_equal_to: "mora biti manjši ali enak kot %{count}"
odd: "mora biti sodo"
even: "mora biti liho"
greater_than_start_date: "mora biti kasnejši kot začetni datum"
not_same_project: "ne pripada istemu projektu"
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
@@ -372,9 +372,9 @@ sl:
label_project_new: Nov projekt
label_project_plural: Projekti
label_x_projects:
zero: no projects
one: 1 project
other: "%{count} projects"
zero: ni projektov
one: 1 projekt
other: "%{count} projektov"
label_project_all: Vsi projekti
label_project_latest: Zadnji projekti
label_issue: Zahtevek
@@ -476,22 +476,22 @@ sl:
label_export_to: 'Na razpolago tudi v:'
label_read: Preberi...
label_public_projects: Javni projekti
label_open_issues: odpri zahtevek
label_open_issues_plural: odpri zahtevke
label_closed_issues: zapri zahtevek
label_closed_issues_plural: zapri zahtevke
label_open_issues: odprt zahtevek
label_open_issues_plural: odprti zahtevki
label_closed_issues: zaprt zahtevek
label_closed_issues_plural: zaprti zahtevki
label_x_open_issues_abbr_on_total:
zero: 0 open / %{total}
one: 1 open / %{total}
other: "%{count} open / %{total}"
zero: 0 odprtih / %{total}
one: 1 odprt / %{total}
other: "%{count} odprtih / %{total}"
label_x_open_issues_abbr:
zero: 0 open
one: 1 open
other: "%{count} open"
zero: 0 odprtih
one: 1 odprt
other: "%{count} odprtih"
label_x_closed_issues_abbr:
zero: 0 closed
one: 1 closed
other: "%{count} closed"
zero: 0 zaprtih
one: 1 zaprt
other: "%{count} zaprtih"
label_total: Skupaj
label_permissions: Dovoljenja
label_current_status: Trenutno stanje
@@ -507,7 +507,7 @@ sl:
label_per_page: Na stran
label_calendar: Koledar
label_months_from: mesecev od
label_gantt: Gantt
label_gantt: Gantogram
label_internal: Notranji
label_last_changes: "zadnjih %{count} sprememb"
label_change_view_all: Poglej vse spremembe
@@ -515,9 +515,9 @@ sl:
label_comment: Komentar
label_comment_plural: Komentarji
label_x_comments:
zero: no comments
one: 1 comment
other: "%{count} comments"
zero: ni komentarjev
one: 1 komentar
other: "%{count} komentarjev"
label_comment_add: Dodaj komentar
label_comment_added: Komentar dodan
label_comment_delete: Izbriši komentarje
@@ -774,7 +774,7 @@ sl:
default_tracker_feature: Funkcija
default_tracker_support: Podpora
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_feedback: Povratna informacija
default_issue_status_closed: Zaključen
@@ -792,183 +792,185 @@ sl:
enumeration_issue_priorities: Prioritete zahtevkov
enumeration_doc_categories: Kategorije dokumentov
enumeration_activities: Aktivnosti (sledenje časa)
warning_attachments_not_saved: "%{count} file(s) could not be saved."
field_editable: Editable
text_plugin_assets_writable: Plugin assets directory writable
label_display: Display
button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value'
setting_repository_log_display_limit: Maximum number of revisions displayed on file log
setting_file_max_size_displayed: Max size of text files displayed inline
field_watcher: Watcher
setting_openid: Allow OpenID login and registration
warning_attachments_not_saved: "%{count} datotek(e) ni bilo mogoče shraniti."
field_editable: Uredljivo
text_plugin_assets_writable: Zapisljiva mapa za vtičnike
label_display: Prikaz
button_create_and_continue: Ustvari in nadaljuj
text_custom_field_possible_values_info: 'Ena vrstica za vsako vrednost'
setting_repository_log_display_limit: Največje število prikazanih revizij v log datoteki
setting_file_max_size_displayed: Največja velikost besedilnih datotek v vključenem prikazu
field_watcher: Opazovalec
setting_openid: Dovoli OpenID prijavo in registracijo
field_identity_url: OpenID URL
label_login_with_open_id_option: or login with OpenID
field_content: Content
label_descending: Descending
label_sort: Sort
label_ascending: Ascending
label_date_from_to: From %{start} to %{end}
label_login_with_open_id_option: ali se prijavi z OpenID
field_content: Vsebina
label_descending: Padajoče
label_sort: Razvrsti
label_ascending: Naraščajoče
label_date_from_to: Od %{start} do %{end}
label_greater_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_reassign_children: Reassign child pages to this parent page
text_wiki_page_nullify_children: Keep child pages as root pages
text_wiki_page_destroy_children: Delete child pages and all their descendants
setting_password_min_length: Minimum password length
field_group_by: Group results by
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
label_wiki_content_added: Wiki page added
mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}.
label_wiki_content_updated: Wiki page updated
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}.
permission_add_project: Create project
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
label_view_all_revisions: View all revisions
label_tag: Tag
label_branch: Branch
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
text_journal_changed: "%{label} changed from %{old} to %{new}"
text_journal_set_to: "%{label} set to %{value}"
text_journal_deleted: "%{label} deleted (%{old})"
label_group_plural: Groups
label_group: Group
label_group_new: New group
label_time_entry_plural: Spent time
text_journal_added: "%{label} %{value} added"
field_active: Active
enumeration_system_activity: System Activity
permission_delete_issue_watchers: Delete watchers
version_status_closed: closed
version_status_locked: locked
version_status_open: open
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
label_user_anonymous: Anonymous
button_move_and_follow: Move and follow
setting_default_projects_modules: Default enabled modules for new projects
setting_gravatar_default: Default Gravatar image
field_sharing: Sharing
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_system: With all projects
label_version_sharing_descendants: With subprojects
label_version_sharing_tree: With project tree
label_version_sharing_none: Not shared
error_can_not_archive_project: This project can not be archived
button_duplicate: Duplicate
button_copy_and_follow: Copy and follow
label_copy_source: Source
setting_issue_done_ratio: Calculate the issue done ratio with
setting_issue_done_ratio_issue_status: Use the issue status
error_issue_done_ratios_not_updated: Issue done ratios not updated.
error_workflow_copy_target: Please select target tracker(s) and role(s)
setting_issue_done_ratio_issue_field: Use the issue field
label_copy_same_as_target: Same as target
label_copy_target: Target
notice_issue_done_ratios_updated: Issue done ratios updated.
error_workflow_copy_source: Please select a source tracker or role
label_update_issue_done_ratios: Update issue done ratios
setting_start_of_week: Start calendars on
permission_view_issues: View Issues
label_display_used_statuses_only: Only display statuses that are used by this tracker
label_revision_id: Revision %{value}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created %{value} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
text_wiki_page_destroy_question: Ta stran ima %{descendants} podstran(i) in naslednik(ov). Kaj želite storiti?
text_wiki_page_reassign_children: Znova dodeli podstrani tej glavni strani
text_wiki_page_nullify_children: Obdrži podstrani kot glavne strani
text_wiki_page_destroy_children: Izbriši podstrani in vse njihove naslednike
setting_password_min_length: Minimalna dolžina gesla
field_group_by: Združi rezultate po
mail_subject_wiki_content_updated: "'%{id}' wiki stran je bila posodobljena"
label_wiki_content_added: Wiki stran dodana
mail_subject_wiki_content_added: "'%{id}' wiki stran je bila dodana"
mail_body_wiki_content_added: %{author} je dodal '%{id}' wiki stran
label_wiki_content_updated: Wiki stran posodobljena
mail_body_wiki_content_updated: %{author} je posodobil '%{id}' wiki stran.
permission_add_project: Ustvari projekt
setting_new_project_user_role_id: Vloga, dodeljena neadministratorskemu uporabniku, ki je ustvaril projekt
label_view_all_revisions: Poglej vse revizije
label_tag: Oznaka
label_branch: Veja
error_no_tracker_in_project: Noben sledilnik ni povezan s tem projektom. Prosimo preverite nastavitve projekta.
error_no_default_issue_status: Privzeti zahtevek ni definiran. Prosimo preverite svoje nastavitve (Pojdite na "Administracija -> Stanje zahtevkov").
text_journal_changed: "%{label} se je spremenilo iz %{old} v %{new}"
text_journal_set_to: "%{label} nastavljeno na %{value}"
text_journal_deleted: "%{label} izbrisan (%{old})"
label_group_plural: Skupine
label_group: Skupina
label_group_new: Nova skupina
label_time_entry_plural: Porabljen čas
text_journal_added: "%{label} %{value} dodan"
field_active: Aktiven
enumeration_system_activity: Sistemska aktivnost
permission_delete_issue_watchers: Izbriši opazovalce
version_status_closed: zaprt
version_status_locked: zaklenjen
version_status_open: odprt
error_can_not_reopen_issue_on_closed_version: Zahtevek dodeljen zaprti verziji ne more biti ponovno odprt
label_user_anonymous: Anonimni
button_move_and_follow: Premakni in sledi
setting_default_projects_modules: Privzeti moduli za nove projekte
setting_gravatar_default: Privzeta Gravatar slika
field_sharing: Deljenje
label_version_sharing_hierarchy: S projektno hierarhijo
label_version_sharing_system: Z vsemi projekti
label_version_sharing_descendants: S podprojekti
label_version_sharing_tree: Z drevesom projekta
label_version_sharing_none: Ni deljeno
error_can_not_archive_project: Ta projekt ne more biti arhiviran
button_duplicate: Podvoji
button_copy_and_follow: Kopiraj in sledi
label_copy_source: Vir
setting_issue_done_ratio: Izračunaj razmerje opravljenega zahtevka z
setting_issue_done_ratio_issue_status: Uporabi stanje zahtevka
error_issue_done_ratios_not_updated: Razmerje opravljenega zahtevka ni bilo posodobljeno.
error_workflow_copy_target: Prosimo izberite ciljni(e) sledilnik(e) in vlogo(e)
setting_issue_done_ratio_issue_field: Uporabi polje zahtevka
label_copy_same_as_target: Enako kot cilj
label_copy_target: Cilj
notice_issue_done_ratios_updated: Razmerje opravljenega zahtevka posodobljeno.
error_workflow_copy_source: Prosimo izberite vir zahtevka ali vlogo
label_update_issue_done_ratios: Posodobi razmerje opravljenega zahtevka
setting_start_of_week: Začni koledarje z
permission_view_issues: Poglej zahtevke
label_display_used_statuses_only: Prikaži samo stanja ki uporabljajo ta sledilnik
label_revision_id: Revizija %{value}
label_api_access_key: API dostopni ključ
label_api_access_key_created_on: API dostopni ključ ustvarjen pred %{value}
label_feeds_access_key: RSS dostopni ključ
notice_api_access_key_reseted: Vaš API dostopni ključ je bil ponastavljen.
setting_rest_api_enabled: Omogoči REST spletni servis
label_missing_api_access_key: Manjkajoč API dostopni ključ
label_missing_feeds_access_key: Manjkajoč RSS dostopni ključ
button_show: Prikaži
text_line_separated: Dovoljenih več vrednosti (ena vrstica za vsako vrednost).
setting_mail_handler_body_delimiters: Odreži e-pošto po eni od teh vrstic
permission_add_subprojects: Ustvari podprojekte
label_subproject_new: Nov podprojekt
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.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
error_unable_delete_issue_status: Unable to delete issue status
label_profile: Profile
permission_manage_subtasks: Manage subtasks
field_parent_issue: Parent task
label_subtask_plural: Subtasks
label_project_copy_notifications: Send email notifications during the project copy
error_can_not_delete_custom_field: Unable to delete custom field
error_unable_to_connect: Unable to connect (%{value})
error_can_not_remove_role: This role is in use and can not be deleted.
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
field_principal: Principal
label_my_page_block: My page block
notice_failed_to_save_members: "Failed to save member(s): %{errors}."
text_zoom_out: Zoom out
text_zoom_in: Zoom in
notice_unable_delete_time_entry: Unable to delete time log entry.
label_overall_spent_time: Overall spent time
field_time_entries: Log time
project_module_gantt: Gantt
project_module_calendar: Calendar
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
label_user_mail_option_only_assigned: Only for things I am assigned to
label_user_mail_option_none: No events
field_member_of_group: Assignee's group
field_assigned_to_role: Assignee's role
notice_not_authorized_archived_project: The project you're trying to access has been archived.
label_principal_search: "Search for user or group:"
label_user_search: "Search for user:"
field_visible: Visible
setting_emails_header: Emails header
setting_commit_logtime_activity_id: Activity for logged time
text_time_logged_by_changeset: Applied in changeset %{value}.
setting_commit_logtime_enabled: Enable time logging
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous
label_role_non_member: Non member
label_issue_note_added: Note added
label_issue_status_updated: Status updated
label_issue_priority_updated: Priority updated
label_issues_visibility_own: Issues created by or assigned to the user
field_issues_visibility: Issues visibility
label_issues_visibility_all: All issues
permission_set_own_issues_private: Set own issues public or private
field_is_private: Private
permission_set_issues_private: Set issues public or private
label_issues_visibility_public: All non private issues
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
Odstranili boste nekatere ali vse od dovoljenj zaradi česar morda ne boste mogli več urejati tega projekta.
Ali ste prepričani, da želite nadaljevati?
label_close_versions: Zapri dokončane verzije
label_board_sticky: Lepljivo
label_board_locked: Zaklenjeno
permission_export_wiki_pages: Izvozi wiki strani
setting_cache_formatted_text: Predpomni oblikovano besedilo
permission_manage_project_activities: Uredi aktivnosti projekta
error_unable_delete_issue_status: Stanja zahtevka ni bilo možno spremeniti
label_profile: Profil
permission_manage_subtasks: Uredi podnaloge
field_parent_issue: Nadrejena naloga
label_subtask_plural: Podnaloge
label_project_copy_notifications: Med kopiranjem projekta pošlji e-poštno sporočilo
error_can_not_delete_custom_field: Polja po meri ni mogoče izbrisati
error_unable_to_connect: Povezava ni mogoča (%{value})
error_can_not_remove_role: Ta vloga je v uporabi in je ni mogoče izbrisati.
error_can_not_delete_tracker: Ta sledilnik vsebuje zahtevke in se ga ne more izbrisati.
field_principal: Upravnik varnosti
label_my_page_block: Moj gradnik strani
notice_failed_to_save_members: "Shranjevanje uporabnika(ov) ni uspelo: %{errors}."
text_zoom_out: Približaj
text_zoom_in: Oddalji
notice_unable_delete_time_entry: Brisanje dnevnika porabljenaga časa ni mogoče.
label_overall_spent_time: Skupni porabljeni čas
field_time_entries: Beleži porabljeni čas
project_module_gantt: Gantogram
project_module_calendar: Koledear
button_edit_associated_wikipage: "Uredi povezano Wiki stran: %{page_title}"
text_are_you_sure_with_children: Izbriši zahtevek in vse podazahtevke?
field_text: Besedilno polje
label_user_mail_option_only_owner: Samo za stvari katerih lastnik sem
setting_default_notification_option: Privzeta možnost obveščanja
label_user_mail_option_only_my_events: Samo za stvari, ki jih opazujem ali sem v njih vpleten
label_user_mail_option_only_assigned: Samo za stvari, ki smo mi dodeljene
label_user_mail_option_none: Noben dogodek
field_member_of_group: Pooblaščenčeva skupina
field_assigned_to_role: Pooblaščenčeva vloga
notice_not_authorized_archived_project: Projekt, do katerega poskušate dostopati, je bil arhiviran.
label_principal_search: "Poišči uporabnika ali skupino:"
label_user_search: "Poišči uporabnikia:"
field_visible: Viden
setting_emails_header: Glava e-pošte
setting_commit_logtime_activity_id: Aktivnost zabeleženega časa
text_time_logged_by_changeset: Uporabljeno v spremembi %{value}.
setting_commit_logtime_enabled: Omogoči beleženje časa
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: Največje število elementov prikazano na gantogramu
field_warn_on_leaving_unsaved: Opozori me, kadar zapuščam stran z neshranjenim besedilom
text_warn_on_leaving_unsaved: Trenutna stran vsebuje neshranjeno besedilo ki bo izgubljeno, če zapustite to stran.
label_my_queries: Moje poizvedbe po meri
text_journal_changed_no_detail: "%{label} posodobljen"
label_news_comment_added: Komentar dodan novici
button_expand_all: Razširi vse
button_collapse_all: Skrči vse
label_additional_workflow_transitions_for_assignee: Dovoljeni dodatni prehodi kadar je uporabnik pooblaščenec
label_additional_workflow_transitions_for_author: Dovoljeni dodatni prehodi kadar je uporabnik avtor
label_bulk_edit_selected_time_entries: Skupinsko urejanje izbranih časovnih zapisov
text_time_entries_destroy_confirmation: Ali ste prepričani, da želite izbristai izbran(e) časovn(i/e) zapis(e)?
label_role_anonymous: Anonimni
label_role_non_member: Nečlan
label_issue_note_added: Dodan zaznamek
label_issue_status_updated: Status posodobljen
label_issue_priority_updated: Prioriteta posodobljena
label_issues_visibility_own: Zahtevek ustvarjen s strani uporabnika ali dodeljen uporabniku
field_issues_visibility: Vidljivost zahtevkov
label_issues_visibility_all: Vsi zahtevki
permission_set_own_issues_private: Nastavi lastne zahtevke kot javne ali zasebne
field_is_private: Zaseben
permission_set_issues_private: Nastavi zahtevke kot javne ali zasebne
label_issues_visibility_public: Vsi nezasebni zahtevki
text_issues_destroy_descendants_confirmation: To bo izbrisalo tudi %{count} podnalog(o).
field_commit_logs_encoding: Kodiranje sporočil ob predaji
field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8"
field_path_to_repository: Path to repository
field_root_directory: Root directory
field_cvs_module: Module
field_scm_path_encoding: Pot do kodiranja
text_scm_path_encoding_note: "Privzeto: UTF-8"
field_path_to_repository: Pot do shrambe
field_root_directory: Korenska mapa
field_cvs_module: Modul
field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command
text_scm_command_version: Version
label_git_report_last_commit: Report last commit for files and directories
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_mercurial_repository_note: Lokalna shramba (npr. /hgrepo, c:\hgrepo)
text_scm_command: Ukaz
text_scm_command_version: Verzija
label_git_report_last_commit: Sporoči zadnje uveljavljanje datotek in map
text_scm_config: Svoje SCM ukaze lahko nastavite v datoteki config/configuration.yml. Po urejanju prosimo ponovno zaženite aplikacijo.
text_scm_command_not_available: SCM ukaz ni na voljo. Prosimo preverite nastavitve v upravljalskem podoknu.
text_git_repository_note: Shramba je prazna in lokalna (npr. /gitrepo, c:\gitrepo)

View File

@@ -1,4 +1,4 @@
# Chinese (China) translations for Ruby on Rails
# Chinese (China) translations for Ruby on Rails
# by tsechingho (http://github.com/tsechingho)
zh:
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
@@ -11,7 +11,7 @@ zh:
default: "%Y-%m-%d"
short: "%b%d日"
long: "%Y年%b%d日"
day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
abbr_day_names: [日, 一, 二, 三, 四, 五, 六]
@@ -73,7 +73,7 @@ zh:
number:
# Default format for numbers
format:
separator: "."
separator: "."
delimiter: ""
precision: 3
human:
@@ -91,13 +91,12 @@ zh:
gb: "GB"
tb: "TB"
# Used in array.to_sentence.
support:
array:
sentence_connector: "和"
skip_last_comma: false
activerecord:
errors:
template:
@@ -131,7 +130,7 @@ zh:
cant_link_an_issue_with_a_descendant: "问题不能关联到它的子任务"
actionview_instancetag_blank_option: 请选择
general_text_No: '否'
general_text_Yes: '是'
general_text_no: '否'
@@ -142,7 +141,7 @@ zh:
general_csv_encoding: gb18030
general_pdf_encoding: gb18030
general_first_day_of_week: '7'
notice_account_updated: 帐号更新成功
notice_account_invalid_creditentials: 无效的用户名或密码
notice_account_password_updated: 密码更新成功
@@ -173,7 +172,7 @@ zh:
notice_unable_delete_time_entry: 无法删除工时
notice_issue_done_ratios_updated: 问题完成度已更新。
notice_gantt_chart_truncated: "The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})"
error_can_t_load_default_data: "无法载入默认设置:%{value}"
error_scm_not_found: "版本库中不存在该条目和(或)其修订版本。"
error_scm_command_failed: "访问版本库时发生错误:%{value}"
@@ -192,7 +191,7 @@ zh:
error_unable_delete_issue_status: '无法删除问题状态'
error_unable_to_connect: "无法连接 (%{value})"
warning_attachments_not_saved: "%{count} 个文件保存失败"
mail_subject_lost_password: "您的 %{value} 密码"
mail_body_lost_password: '请点击以下链接来修改您的密码:'
mail_subject_register: "%{value}帐号激活"
@@ -207,10 +206,10 @@ zh:
mail_body_wiki_content_added: "'%{id}' wiki页面已由 %{author} 添加。"
mail_subject_wiki_content_updated: "'%{id}' wiki页面已更新。"
mail_body_wiki_content_updated: "'%{id}' wiki页面已由 %{author} 更新。"
gui_validation_error: 1 个错误
gui_validation_error_plural: "%{count} 个错误"
field_name: 名称
field_description: 描述
field_summary: 摘要
@@ -241,7 +240,7 @@ zh:
field_is_default: 默认值
field_tracker: 跟踪
field_subject: 主题
field_due_date: 完成日期
field_due_date: 计划完成日期
field_assigned_to: 指派给
field_priority: 优先级
field_fixed_version: 目标版本
@@ -273,7 +272,7 @@ zh:
field_attr_mail: 邮件属性
field_onthefly: 即时用户生成
field_start_date: 开始日期
field_done_ratio: % 完成
field_done_ratio: "% 完成"
field_auth_source: 认证模式
field_hide_mail: 隐藏我的邮件地址
field_comments: 注释
@@ -308,7 +307,7 @@ zh:
field_assigned_to_role: 角色的成员
field_text: 文本字段
field_visible: 可见的
setting_app_title: 应用程序标题
setting_app_subtitle: 应用程序子标题
setting_welcome_text: 欢迎文字
@@ -366,7 +365,7 @@ zh:
setting_commit_logtime_enabled: 激活时间日志
setting_commit_logtime_activity_id: 记录的活动
setting_gantt_items_limit: 在甘特图上显示的最大记录数
permission_add_project: 新建项目
permission_add_subprojects: 新建子项目
permission_edit_project: 编辑项目
@@ -402,7 +401,7 @@ zh:
permission_manage_files: 管理文件
permission_view_files: 查看文件
permission_manage_wiki: 管理Wiki
permission_rename_wiki_pages: 重命名Wiki页面
permission_rename_wiki_pages: 定向/重命名Wiki页面
permission_delete_wiki_pages: 删除Wiki页面
permission_view_wiki_pages: 查看Wiki
permission_view_wiki_edits: 查看Wiki历史记录
@@ -422,7 +421,7 @@ zh:
permission_delete_own_messages: 删除自己的帖子
permission_export_wiki_pages: 导出 wiki 页面
permission_manage_subtasks: 管理子任务
project_module_issue_tracking: 问题跟踪
project_module_time_tracking: 时间跟踪
project_module_news: 新闻
@@ -433,7 +432,7 @@ zh:
project_module_boards: 讨论区
project_module_calendar: 日历
project_module_gantt: 甘特图
label_user: 用户
label_user_plural: 用户
label_user_new: 新建用户
@@ -797,7 +796,7 @@ zh:
label_project_copy_notifications: 复制项目时发送邮件通知
label_principal_search: "搜索用户或组:"
label_user_search: "搜索用户:"
button_login: 登录
button_submit: 提交
button_save: 保存
@@ -832,7 +831,7 @@ zh:
button_archive: 存档
button_unarchive: 取消存档
button_reset: 重置
button_rename: 重命名
button_rename: 重命名/重定向
button_change_password: 修改密码
button_copy: 复制
button_copy_and_follow: 复制并转到新问题
@@ -846,13 +845,13 @@ zh:
status_active: 活动的
status_registered: 已注册
status_locked: 已锁定
version_status_open: 打开
version_status_locked: 锁定
version_status_closed: 关闭
field_active: 活动
text_select_mail_notifications: 选择需要发送邮件通知的动作
text_regexp_info: 例如:^[A-Z0-9]+$
text_min_max_length_info: 0 表示没有限制
@@ -910,9 +909,9 @@ zh:
text_wiki_page_destroy_children: 删除子页面及其所有下级页面
text_wiki_page_reassign_children: 将子页面的上级页面设置为
text_own_membership_delete_confirmation: 你正在删除你现有的某些或全部权限,如果这样做了你可能将会再也无法编辑该项目了。你确定要继续吗?
text_zoom_in: Zoom in
text_zoom_out: Zoom out
text_zoom_in: 放大
text_zoom_out: 缩小
default_role_manager: 管理人员
default_role_developer: 开发人员
default_role_reporter: 报告人员
@@ -934,48 +933,50 @@ zh:
default_priority_immediate: 立刻
default_activity_design: 设计
default_activity_development: 开发
enumeration_issue_priorities: 问题优先级
enumeration_doc_categories: 文档类别
enumeration_activities: 活动(时间跟踪)
enumeration_system_activity: 系统活动
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
field_warn_on_leaving_unsaved: 当离开未保存内容的页面时,提示我
text_warn_on_leaving_unsaved: 若离开当前页面,则该页面内未保存的内容将丢失。
label_my_queries: 我的自定义查询
text_journal_changed_no_detail: "%{label} 已更新。"
label_news_comment_added: 添加到新闻的评论
button_expand_all: 展开所有
button_collapse_all: 合拢所有
label_additional_workflow_transitions_for_assignee: 当用户是问题的分配对象时所允许的问题状态转换
label_additional_workflow_transitions_for_author: 当用户是问题作者时所允许的问题状态转换
label_bulk_edit_selected_time_entries: 批量修改选定的时间条目
text_time_entries_destroy_confirmation: 是否确定要删除选定的时间条目?
label_role_anonymous: Anonymous
label_role_non_member: Non member
label_issue_note_added: Note added
label_issue_status_updated: Status updated
label_issue_priority_updated: Priority updated
label_issues_visibility_own: Issues created by or assigned to the user
field_issues_visibility: Issues visibility
label_issues_visibility_all: All issues
permission_set_own_issues_private: Set own issues public or private
field_is_private: Private
permission_set_issues_private: Set issues public or private
label_issues_visibility_public: All non private issues
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
label_issue_note_added: 问题备注已添加
label_issue_status_updated: 问题状态更新
label_issue_priority_updated: 问题优先级更新
label_issues_visibility_own: 创建或分配给用户的问题
field_issues_visibility: 问题可见
label_issues_visibility_all: 全部问题
permission_set_own_issues_private: 设置自己的问题为公开或私有
field_is_private: 私有
permission_set_issues_private: 设置问题为公开或私有
label_issues_visibility_public: 全部非私有问题
text_issues_destroy_descendants_confirmation: 此操作同时会删除 %{count} 个子任务。
field_commit_logs_encoding: 提交注释的编码
field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8"
field_path_to_repository: Path to repository
field_root_directory: Root directory
field_cvs_module: Module
field_scm_path_encoding: 路径编码
text_scm_path_encoding_note: "默认: UTF-8"
field_path_to_repository: 库路径
field_root_directory: 根目录
field_cvs_module: CVS Module
field_cvsroot: CVSROOT
text_git_repository_note: Bare and local repository (e.g. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command
text_scm_command_version: Version
label_git_report_last_commit: Report last commit for files and directories
text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
text_mercurial_repository_note: 本地库 (e.g. /hgrepo, c:\hgrepo)
text_scm_command: 命令
text_scm_command_version: 版本
label_git_report_last_commit: 报告最后一次文件/目录提交
text_scm_config: 您可以在config/configuration.yml中配置您的SCM命令。 请在编辑后重启Redmine应用。
text_scm_command_not_available: Scm命令不可用。 请检查管理面板的配置。
text_git_repository_note: 库中无内容。(e.g. /gitrepo, c:\gitrepo)

View File

@@ -4,6 +4,46 @@ Redmine - project management software
Copyright (C) 2006-2011 Jean-Philippe Lang
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
* 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
* #871: Commit new CSS styles!
* #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â€<EFBFBD> should focus on the input
* #4896: Project identifier should be a limited field
* #5084: Filter all isssues by projects
* #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
* 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
* Forum notifications are now also sent to the authors of the thread, even if they don<EFBFBD>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
* Gantt chart: now starts at the current month by default
* 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 preview on add/edit issue form
* 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<EFBFBD>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
* Automatic closing of duplicate issues
* Added a cross-project issue list
@@ -1446,7 +1486,7 @@ http://www.redmine.org/
* Added some accesskeys
* Added "Float" as a custom field format
* Added basic Theme support
* Added the ability to set the <EFBFBD>done ratio<EFBFBD> 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
* 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.
@@ -1479,7 +1519,7 @@ http://www.redmine.org/
* 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
* Performance improvement on calendar and gantt
* Fixed: wiki preview doesn<EFBFBD>t work on long entries
* Fixed: wiki preview doesn�t work on long entries
* Fixed: queries with multiple custom fields return no result
* Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
* Fixed: URL with ~ broken in wiki formatting
@@ -1490,7 +1530,7 @@ http://www.redmine.org/
* per project forums added
* added the ability to archive projects
* added <EFBFBD>Watch<EFBFBD> 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
* added per user custom queries
* 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)
* italian translation update (Alessio Spadaro)
* japanese translation update (Satoru Kurashiki)
* fixed: error on history atom feed when there<EFBFBD>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: creation of Oracle schema
* fixed: last day of the month not included in project activity

View File

@@ -9,8 +9,9 @@ Running Tests
Run `rake --tasks test` to see available tests.
`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.
Creating test repositories

View File

@@ -149,15 +149,16 @@ sub RedmineDSN {
$self->{RedmineDSN} = $arg;
my $query = "SELECT
hashed_password, salt, auth_source_id, permissions
FROM members, projects, users, roles, member_roles
FROM projects, users, roles
WHERE
projects.id=members.project_id
AND member_roles.member_id=members.id
AND users.id=members.user_id
AND roles.id=member_roles.role_id
users.login=?
AND projects.identifier=?
AND users.status=1
AND login=?
AND identifier=? ";
AND (
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);
}
@@ -208,7 +209,7 @@ sub access_handler {
my $project_id = get_project_identifier($r);
$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
}
@@ -280,6 +281,29 @@ sub is_public_project {
$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.
# it could be faster BUT it doesn't work for the moment.
# sub is_public_project_by_file {
@@ -304,11 +328,13 @@ sub is_member {
my $project_id = get_project_identifier($r);
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 $usrprojpass;
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));
}
my $query = $cfg->{RedmineQuery};
@@ -321,7 +347,7 @@ sub is_member {
unless ($auth_source_id) {
my $method = $r->method;
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;
last;
}
@@ -340,7 +366,7 @@ sub is_member {
filter => "(".$rowldap[6]."=%s)"
);
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();
@@ -354,10 +380,10 @@ sub is_member {
if ($cfg->{RedmineCacheCredsMax} and $ret) {
if (defined $usrprojpass) {
$cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
$cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest);
} else {
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}++;
} else {
$cfg->{RedmineCacheCreds}->clear();

View File

@@ -938,7 +938,7 @@ class RedCloth3 < String
stln,algn,atts,url,title,href,href_a1,href_a2 = $~[1..8]
htmlesc title
atts = pba( atts )
atts = " src=\"#{ url }\"#{ atts }"
atts = " src=\"#{ htmlesc url.dup }\"#{ atts }"
atts << " title=\"#{ title }\"" if title
atts << " alt=\"#{ title }\""
# size = @getimagesize($url);

View File

@@ -88,10 +88,10 @@ Redmine::AccessControl.map do |map|
end
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 :edit_time_entries, {:timelog => [:new, :create, :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_time_entries, {:timelog => [:edit, :update, :destroy, :bulk_edit, :bulk_update]}, :require => :member
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
end

View File

@@ -23,7 +23,7 @@ module Redmine
class << self
def encrypt_text(text)
if cipher_key.blank?
if cipher_key.blank? || text.blank?
text
else
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
@@ -39,6 +39,10 @@ module Redmine
def decrypt_text(text)
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]
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
e, iv = text.split("--").map {|s| Base64.decode64(s)}
@@ -56,6 +60,10 @@ module Redmine
key = Redmine::Configuration['database_cipher_key'].to_s
key.blank? ? nil : Digest::SHA256.hexdigest(key)
end
def logger
RAILS_DEFAULT_LOGGER
end
end
module ClassMethods

View File

@@ -11,6 +11,13 @@ module Redmine
str = str.encode("US-ASCII", :invalid => :replace,
:undef => :replace, :replace => '?').encode("UTF-8")
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
ic = Iconv.new('UTF-8', 'UTF-8')
txtar = ""

View File

@@ -1,16 +1,16 @@
# 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
# 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.
@@ -22,7 +22,7 @@ module Redmine
@@listener_classes = []
@@listeners = nil
@@hook_listeners = {}
class << self
# Adds a listener class.
# Automatically called when a class inherits from Redmine::Hook::Listener.
@@ -31,29 +31,29 @@ module Redmine
@@listener_classes << klass
clear_listeners_instances
end
# Returns all the listerners instances.
def listeners
@@listeners ||= @@listener_classes.collect {|listener| listener.instance}
end
# Returns the listeners instances for the given hook.
def hook_listeners(hook)
@@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)}
end
# Clears all the listeners.
def clear_listeners
@@listener_classes = []
clear_listeners_instances
end
# Clears all the listeners instances.
def clear_listeners_instances
@@listeners = nil
@@hook_listeners = {}
end
# Calls a hook.
# Returns the listeners response.
def call_hook(hook, context={})
@@ -101,11 +101,11 @@ module Redmine
def self.default_url_options
{:only_path => true }
end
# Helper method to directly render a partial using the context:
#
#
# class MyHook < Redmine::Hook::ViewListener
# render_on :view_issues_show_details_bottom, :partial => "show_more_data"
# render_on :view_issues_show_details_bottom, :partial => "show_more_data"
# end
#
def self.render_on(hook, options={})
@@ -115,25 +115,25 @@ module Redmine
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:
#
#
# <%= call_hook(:some_hook) %>
# <%= call_hook(:another_hook, :foo => 'bar' %>
#
# <%= call_hook(:another_hook, :foo => 'bar') %>
#
# Or in controllers like:
# call_hook(:some_hook)
# call_hook(:another_hook, :foo => 'bar'
#
# Hooks added to views will be concatenated into a string. Hooks added to
# call_hook(:another_hook, :foo => 'bar')
#
# Hooks added to views will be concatenated into a string. Hooks added to
# controllers will return an array of results.
#
# Several objects are automatically added to the call context:
#
#
# * project => current project
# * request => Request instance
# * controller => current Controller instance
#
#
module Helper
def call_hook(hook, context={})
if is_a?(ActionController::Base)
@@ -142,7 +142,7 @@ module Redmine
else
default_context = {:controller => controller, :project => @project, :request => request}
Redmine::Hook.call_hook(hook, default_context.merge(context)).join(' ')
end
end
end
end
end

View File

@@ -29,6 +29,14 @@ module Redmine
""
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
# Eg: [1, 5, 0] or [] if unknown
def client_version
@@ -216,7 +224,11 @@ module Redmine
io.close_write
block.call(io) if block_given?
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)
# The command failed, log it and re-raise
logmsg = "SCM command failed, "

View File

@@ -31,7 +31,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(BZR_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version

View File

@@ -34,7 +34,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(CVS_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version
@@ -379,13 +379,16 @@ module Redmine
end
def scm_cmd(*args, &block)
full_args = [CVS_BIN, '-d', root_url]
full_args = ['-d', root_url]
full_args += args
full_args_locale = []
full_args.map do |e|
full_args_locale << scm_iconv(@path_encoding, 'UTF-8', e)
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
raise ScmCommandAborted, "cvs exited with non-zero status: #{$?.exitstatus}"
end

View File

@@ -31,7 +31,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(DARCS_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version

View File

@@ -34,7 +34,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(GIT_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version
@@ -359,13 +359,16 @@ module Redmine
def scm_cmd(*args, &block)
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])
full_args << '-c' << 'core.quotepath=false'
full_args << '-c' << 'log.decorate=no'
end
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
raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}"
end

View File

@@ -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>"

View File

@@ -46,7 +46,7 @@ Output example of rhmanifest::
</rhmanifest>
"""
import re, time, cgi, urllib
from mercurial import cmdutil, commands, node, error
from mercurial import cmdutil, commands, node, error, hg
_x = cgi.escape
_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))
from_rev = from_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]
return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts)
@@ -196,21 +199,21 @@ cmdtable = {
[
('r', 'rev', [], 'show the specified revision'),
('b', 'branch', [],
'show changesets within the given named branch', 'BRANCH'),
'show changesets within the given named branch'),
('l', 'limit', '',
'limit number of changes displayed', 'NUM'),
'limit number of changes displayed'),
('d', 'date', '',
'show revisions matching date spec', 'DATE'),
'show revisions matching date spec'),
('u', 'user', [],
'revisions committed by user', 'USER'),
'revisions committed by user'),
('', 'from', '',
'', ''),
''),
('', 'to', '',
'', ''),
''),
('', 'rhbranch', '',
'', ''),
''),
('', 'template', '',
'display with template', 'TEMPLATE')],
'display with template')],
'hg rhlog [OPTION]... [FILE]'),
'rhmanifest': (rhmanifest,
[('r', 'rev', '', 'show the specified revision')],

View File

@@ -39,7 +39,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(HG_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version
@@ -47,7 +47,7 @@ module Redmine
end
def client_available
client_version_above?([0, 9, 5])
client_version_above?([1, 2])
end
def hgversion
@@ -72,12 +72,7 @@ module Redmine
end
def template_path_for(version)
if ((version <=> [0,9,5]) > 0) || version.empty?
ver = "1.0"
else
ver = "0.9.5"
end
"#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
"#{HELPERS_DIR}/#{TEMPLATE_NAME}-1.0.#{TEMPLATE_EXTENSION}"
end
end
@@ -294,11 +289,14 @@ module Redmine
# Runs 'hg' command with the given args
def hg(*args, &block)
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' << 'diff.git=false'
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
raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}"
end

View File

@@ -32,7 +32,7 @@ module Redmine
end
def sq_bin
@@sq_bin ||= shell_quote(SVN_BIN)
@@sq_bin ||= shell_quote_command
end
def client_version

View File

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

View File

@@ -100,14 +100,14 @@ Processed emails control options:
Examples:
# 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
# Fixed project and default tracker specified, but emails can override
# 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 \\
project=foo \\
tracker=bug \\

View File

@@ -18,7 +18,7 @@ Calendar._DN = new Array
"Cetvrtak",
"Petak",
"Subota",
"Nedjelja");
"Nedjelja");
// Please note that the following array of short day names (and the same goes
// for short month names, _SMN) isn't absolutely necessary. We give it here
@@ -51,7 +51,7 @@ Calendar._FD = 0;
Calendar._MN = new Array
("Sijecanj",
"Veljaca",
"Ožujak",
"Ožujak",
"Travanj",
"Svibanj",
"Lipanj",
@@ -66,7 +66,7 @@ Calendar._MN = new Array
Calendar._SMN = new Array
("Sij",
"Velj",
"Ožu",
"Ožu",
"Tra",
"Svi",
"Lip",
@@ -100,7 +100,7 @@ Calendar._TT["ABOUT_TIME"] = "\n\n" +
Calendar._TT["PREV_YEAR"] = "Prethodna godina (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_YEAR"] = "Naredna godina (hold for menu)";
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
// %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
// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1

View File

@@ -1,9 +1,4 @@
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

View File

@@ -1,20 +1,8 @@
class Board < ActiveRecord::Base
generator_for :name, :method => :next_name
generator_for :description, :method => :next_description
generator_for :name, :start => 'A Forum'
generator_for :description, :start => 'Some description here'
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
Project.generate!
end

View File

@@ -1,14 +1,8 @@
class Change < ActiveRecord::Base
generator_for :action => 'A'
generator_for :path, :method => :next_path
generator_for :path, :start => 'test/dir/aaa0001'
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
Changeset.generate!
end

View File

@@ -1,14 +1,8 @@
class Changeset < ActiveRecord::Base
generator_for :revision, :method => :next_revision
generator_for :revision, :start => '1'
generator_for :committed_on => Date.today
generator_for :repository, :method => :generate_repository
def self.next_revision
@last_revision ||= '1'
@last_revision.succ!
@last_revision
end
def self.generate_repository
Repository::Subversion.generate!
end

View File

@@ -1,10 +1,5 @@
class CustomField < ActiveRecord::Base
generator_for :name, :method => :next_name
generator_for :name, :start => 'CustomField0'
generator_for :field_format => 'string'
def self.next_name
@last_name ||= 'CustomField0'
@last_name.succ!
@last_name
end
end

View File

@@ -1,10 +1,5 @@
class DocumentCategory < Enumeration
generator_for :name, :method => :next_name
generator_for :name, :start => 'DocumentCategory0'
generator_for :type => 'DocumentCategory'
def self.next_name
@last_name ||= 'DocumentCategory0'
@last_name.succ!
@last_name
end
end

View File

@@ -1,9 +1,4 @@
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

View File

@@ -1,10 +1,4 @@
class EnabledModule < ActiveRecord::Base
generator_for :name, :method => :next_name
def self.next_name
@last_name ||= 'module_001'
@last_name.succ!
@last_name
end
generator_for :name, :start => 'module_001'
end

View File

@@ -1,10 +1,5 @@
class Enumeration < ActiveRecord::Base
generator_for :name, :method => :next_name
generator_for :name, :start => 'Enumeration0'
generator_for :type => 'TimeEntryActivity'
def self.next_name
@last_name ||= 'Enumeration0'
@last_name.succ!
@last_name
end
end

View File

@@ -1,10 +1,4 @@
class Group < Principal
generator_for :lastname, :method => :next_lastname
def self.next_lastname
@last_lastname ||= 'Group'
@last_lastname.succ!
@last_lastname
end
generator_for :lastname, :start => 'Group'
end

View File

@@ -1,9 +1,4 @@
class IssueCategory < ActiveRecord::Base
generator_for :name, :method => :next_name
def self.next_name
@last_name ||= 'Category 0001'
@last_name.succ!
@last_name
end
generator_for :name, :start => 'Category 0001'
end

View File

@@ -1,13 +1,7 @@
class Issue < ActiveRecord::Base
generator_for :subject, :method => :next_subject
generator_for :subject, :start => 'Subject 0'
generator_for :author, :method => :next_author
generator_for :priority, :method => :fetch_priority
def self.next_subject
@last_subject ||= 'Subject 0'
@last_subject.succ!
@last_subject
end
def self.next_author
User.generate_with_protected!
@@ -16,5 +10,4 @@ class Issue < ActiveRecord::Base
def self.fetch_priority
IssuePriority.first || IssuePriority.generate!
end
end

View File

@@ -1,10 +1,5 @@
class IssuePriority < Enumeration
generator_for :name, :method => :next_name
generator_for :name, :start => 'IssuePriority0'
generator_for :type => 'IssuePriority'
def self.next_name
@last_name ||= 'IssuePriority0'
@last_name.succ!
@last_name
end
end

View File

@@ -1,9 +1,4 @@
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

View File

@@ -1,20 +1,8 @@
class Message < ActiveRecord::Base
generator_for :subject, :method => :next_subject
generator_for :content, :method => :next_content
generator_for :subject, :start => 'A Message'
generator_for :content, :start => 'Some content here'
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
Board.generate!
end

View File

@@ -1,16 +1,5 @@
class News < ActiveRecord::Base
generator_for :title, :method => :next_title
generator_for :description, :method => :next_description
generator_for :title, :start => 'A New Item'
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

View File

@@ -1,21 +1,8 @@
class Project < ActiveRecord::Base
generator_for :name, :method => :next_name
generator_for :identifier, :method => :next_identifier_from_object_daddy
generator_for :name, :start => 'Project 0'
generator_for :identifier, :start => 'project-0000'
generator_for :enabled_modules, :method => :all_modules
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
[].tap do |modules|

View File

@@ -1,9 +1,4 @@
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

View File

@@ -1,11 +1,5 @@
class Repository < ActiveRecord::Base
generator_for :type => 'Subversion'
generator_for :url, :method => :next_url
def self.next_url
@last_url ||= 'file:///test/svn'
@last_url.succ!
@last_url
end
generator_for :url, :start => 'file:///test/svn'
end

View File

@@ -1,8 +1,4 @@
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

View File

@@ -1,11 +1,5 @@
class Repository::Subversion < Repository
generator_for :type, :method => 'Subversion'
generator_for :url, :method => :next_url
def self.next_url
@last_url ||= 'file:///test/svn'
@last_url.succ!
@last_url
end
generator_for :url, :start => 'file:///test/svn'
end

View File

@@ -1,10 +1,5 @@
class TimeEntryActivity < Enumeration
generator_for :name, :method => :next_name
generator_for :name, :start => 'TimeEntryActivity0'
generator_for :type => 'TimeEntryActivity'
def self.next_name
@last_name ||= 'TimeEntryActivity0'
@last_name.succ!
@last_name
end
end

View File

@@ -6,5 +6,4 @@ class TimeEntry < ActiveRecord::Base
def self.generate_user
User.generate_with_protected!
end
end

View File

@@ -1,9 +1,4 @@
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

View File

@@ -1,30 +1,12 @@
class User < Principal
generator_for :login, :method => :next_login
generator_for :login, :start => 'user1'
generator_for :mail, :method => :next_email
generator_for :firstname, :method => :next_firstname
generator_for :lastname, :method => :next_lastname
def self.next_login
@gen_login ||= 'user1'
@gen_login.succ!
@gen_login
end
generator_for :firstname, :start => 'Bob'
generator_for :lastname, :start => 'Doe'
def self.next_email
@last_email ||= 'user1'
@last_email.succ!
"#{@last_email}@example.com"
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

View File

@@ -1,11 +1,5 @@
class Version < ActiveRecord::Base
generator_for :name, :method => :next_name
generator_for :name, :start => 'Version 1.0.0'
generator_for :status => 'open'
def self.next_name
@last_name ||= 'Version 1.0.0'
@last_name.succ!
@last_name
end
end

View File

@@ -1,13 +1,7 @@
class WikiPage < ActiveRecord::Base
generator_for :title, :method => :next_title
generator_for :title, :start => 'AWikiPage'
generator_for :wiki, :method => :generate_wiki
def self.next_title
@last_title ||= 'AWikiPage'
@last_title.succ!
@last_title
end
def self.generate_wiki
Wiki.generate!
end

View File

@@ -1,20 +1,8 @@
class WikiRedirect < ActiveRecord::Base
generator_for :title, :method => :next_title
generator_for :redirects_to, :method => :next_redirects_to
generator_for :title, :start => 'AWikiPage'
generator_for :redirects_to, :start => '/a/path/000001'
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
Wiki.generate!
end

View File

@@ -102,7 +102,7 @@ attachments_009:
container_type: Version
container_id: 1
downloads: 0
disk_filename: 060719210727_version_file.zip
disk_filename: 060719210727_archive.zip
digest: b91e08d0cf966d5c6ff411bd8c4cc3a2
id: 9
filesize: 452

View File

@@ -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--

View File

@@ -104,6 +104,12 @@ class AttachmentsControllerTest < ActionController::TestCase
assert_equal 'application/x-ruby', @response.content_type
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
Attachment.find(4).update_attribute(:content_type, '')
@@ -123,6 +129,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_destroy_issue_attachment
set_tmp_attachments_directory
issue = Issue.find(3)
@request.session[:user_id] = 2
@@ -139,6 +146,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_destroy_wiki_page_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do
post :destroy, :id => 3
@@ -147,6 +155,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_destroy_project_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do
post :destroy, :id => 8
@@ -155,6 +164,7 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_destroy_version_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Attachment.count', -1 do
post :destroy, :id => 9
@@ -163,8 +173,11 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_destroy_without_permission
post :destroy, :id => 3
assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fdestroy%2F3'
set_tmp_attachments_directory
assert_no_difference 'Attachment.count' do
delete :destroy, :id => 3
end
assert_response 302
assert Attachment.find_by_id(3)
end
end

View File

@@ -115,4 +115,23 @@ class ContextMenusControllerTest < ActionController::TestCase
assert_template 'context_menu'
assert_equal [1], assigns(:issues).collect(&:id)
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

View File

@@ -78,17 +78,6 @@ class IssuesControllerTest < ActionController::TestCase
assert_tag :tag => 'a', :content => /Subproject issue/
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
get :index, :per_page => 100
assert_response :success
@@ -296,6 +285,27 @@ class IssuesControllerTest < ActionController::TestCase
:parent => { :tag => 'select', :attributes => { :id => "selected_columns" } }
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
columns = %w(tracker subject cf_2)
get :index, :set_filter => 1, :c => columns
@@ -862,6 +872,22 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal Issue.find(1), assigns(:issue)
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
@request.session[:user_id] = 2
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}]"},
:children => {
:only => {:tag => 'option'},
:count => Project.find(1).versions.count + 1
:count => Project.find(1).shared_versions.count + 1
}
end

View File

@@ -30,6 +30,14 @@ class RepositoriesGitControllerTest < ActionController::TestCase
PRJ_ID = 3
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
@ruby19_non_utf8_pass =
(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
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else
with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|
@@ -313,6 +323,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
def test_annotate_latin_1
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else
with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|

View File

@@ -39,7 +39,10 @@ class SysControllerTest < ActionController::TestCase
assert_equal 'application/xml', @response.content_type
with_options :tag => 'projects' do |test|
test.assert_tag :children => { :count => Project.active.has_module(:repository).count }
test.assert_tag 'project', :child => {:tag => 'identifier', :sibling => {:tag => 'is-public'}}
end
assert_no_tag 'extra-info'
assert_no_tag 'extra_info'
end
def test_create_project_repository
@@ -49,10 +52,19 @@ class SysControllerTest < ActionController::TestCase
:vendor => 'Subversion',
:repository => { :url => 'file:///create/project/repository/subproject2'}
assert_response :created
assert_equal 'application/xml', @response.content_type
r = Project.find(4).repository
assert r.is_a?(Repository::Subversion)
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
def test_fetch_changesets

View File

@@ -115,6 +115,18 @@ class TimelogControllerTest < ActionController::TestCase
assert_equal 3, t.user_id
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
entry = TimeEntry.find(1)
assert_equal 1, entry.issue_id
@@ -161,6 +173,9 @@ class TimelogControllerTest < ActionController::TestCase
def test_bulk_update_on_different_projects
@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
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
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
@request.session[:user_id] = 2
delete :destroy, :id => 1

View File

@@ -43,6 +43,13 @@ class WikiControllerTest < ActionController::TestCase
:child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Page_with_an_inline_image' },
:content => 'Page with an inline image' } }
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
get :show, :project_id => 1, :id => 'Another_page'

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# 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
@@ -25,6 +25,15 @@ class CustomFieldTest < ActiveSupport::TestCase
assert field.save
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
field = CustomField.new
field.possible_values = ["One value", ""]

View File

@@ -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

View File

@@ -64,6 +64,8 @@ class CustomValueTest < ActiveSupport::TestCase
assert v.valid?
v.value = 'abc'
assert !v.valid?
v.value = '1975-07-33'
assert !v.valid?
v.value = '1975-07-14'
assert v.valid?
end

View File

@@ -375,6 +375,26 @@ RAW
to_test.each { |text, result| assert_equal "<p>#{result}</p>", textilizable(text) }
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
to_test = {
"<div>content</div>" => "<p>&lt;div&gt;content&lt;/div&gt;</p>",
@@ -533,6 +553,43 @@ EXPECTED
assert_equal expected, textilizable(raw)
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
raw = <<-RAW
{{toc}}

View File

@@ -222,6 +222,20 @@ class IssueNestedSetTest < ActiveSupport::TestCase
assert_equal [issue1.id, 1, 4], [issue1.root_id, issue1.lft, issue1.rgt]
assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt]
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
parent = create_issue!
@@ -252,6 +266,20 @@ class IssueNestedSetTest < ActiveSupport::TestCase
root = Issue.find(root.id)
assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})"
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
parent = create_issue!(:priority => IssuePriority.find_by_name('Normal'))

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.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], status.find_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, 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], status.find_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, 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.find_new_statuses_allowed_to([role], tracker, true, true).map(&:id)

View File

@@ -232,6 +232,22 @@ class IssueTest < ActiveSupport::TestCase
assert_equal custom_value.id, issue.custom_value_for(field).id
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
issue = Issue.new(:project => Project.find(1))
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)
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)
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)
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)
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
assignable_user_ids = Issue.find(1).assignable_users.collect(&:id)
assert_equal 2, assignable_user_ids.length

View File

@@ -43,6 +43,14 @@ class Redmine::CipheringTest < ActiveSupport::TestCase
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
Redmine::Configuration.with 'database_cipher_key' => nil do
r = Repository::Subversion.generate!(:password => 'clear')
@@ -53,7 +61,21 @@ class Redmine::CipheringTest < ActiveSupport::TestCase
assert_equal 'clear', r.password
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
Repository.delete_all
Redmine::Configuration.with 'database_cipher_key' => nil do

View File

@@ -20,6 +20,14 @@ begin
# WINDOWS_PASS = Redmine::Platform.mswin?
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)
def setup
adapter_class = Redmine::Scm::Adapters::GitAdapter
@@ -262,6 +270,8 @@ begin
def test_latin_1_path
if WINDOWS_PASS
#
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else
p2 = "latin-1-dir/test-#{@char_1}-2.txt"
['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1|
@@ -322,6 +332,8 @@ begin
def test_entries_latin_1_dir
if WINDOWS_PASS
#
elsif JRUBY_SKIP
puts JRUBY_SKIP_STR
else
entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir",
'1ca7f5ed')

View File

@@ -56,12 +56,14 @@ begin
end
def test_template_path
to_test = { [0,9,5] => "0.9.5",
[1,0] => "1.0",
to_test = {
[1,2] => "1.0",
[] => "1.0",
[1,0,1] => "1.0",
[1,2,1] => "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|
test_template_path_for(v, template)
end
@@ -317,17 +319,21 @@ begin
assert_equal 1, nib1.size
case bra
when 'branch (1)[2]&,%.-3_4'
assert_equal 3, nib0.size
assert_equal nib0[0], 'afc61e85bde7'
nib2 = @adapter.nodes_in_branch(bra, :limit => 2)
assert_equal 2, nib2.size
assert_equal nib2[1], '933ca60293d7'
if @adapter.class.client_version_above?([1, 6])
assert_equal 3, nib0.size
assert_equal nib0[0], 'afc61e85bde7'
nib2 = @adapter.nodes_in_branch(bra, :limit => 2)
assert_equal 2, nib2.size
assert_equal nib2[1], '933ca60293d7'
end
when @branch_char_1
assert_equal 2, nib0.size
assert_equal nib0[1], '08ff3227303e'
nib2 = @adapter.nodes_in_branch(bra, :limit => 1)
assert_equal 1, nib2.size
assert_equal nib2[0], '7bbf4c738e71'
if @adapter.class.client_version_above?([1, 6])
assert_equal 2, nib0.size
assert_equal nib0[1], '08ff3227303e'
nib2 = @adapter.nodes_in_branch(bra, :limit => 1)
assert_equal 1, nib2.size
assert_equal nib2[0], '7bbf4c738e71'
end
end
end
end

View File

@@ -1,16 +1,16 @@
# 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
# 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.
@@ -22,7 +22,7 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
def setup
@formatter = Redmine::WikiFormatting::Textile::Formatter
end
MODIFIERS = {
"*" => 'strong', # bold
"_" => 'em', # italic
@@ -31,7 +31,7 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
"^" => 'sup', # superscript
"~" => 'sub' # subscript
}
def test_modifiers
assert_html_output(
'*bold*' => '<strong>bold</strong>',
@@ -46,7 +46,7 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
'*(foo)two words*' => '<strong class="foo">two words</strong>'
)
end
def test_modifiers_combination
MODIFIERS.each do |m1, tag1|
MODIFIERS.each do |m2, tag2|
@@ -57,7 +57,7 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
end
end
end
def test_inline_code
assert_html_output(
'this is @some code@' => 'this is <code>some code</code>',
@@ -76,14 +76,14 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
'h1. 2009\02\09' => '<h1>2009\02\09</h1>'
}, false)
end
def test_double_dashes_should_not_strikethrough
assert_html_output(
'double -- dashes -- test' => 'double -- dashes -- test',
'double -- *dashes* -- test' => 'double -- <strong>dashes</strong> -- test'
)
end
def test_acronyms
assert_html_output(
'this is an acronym: GPL(General Public License)' => 'this is an acronym: <acronym title="General Public License">GPL</acronym>',
@@ -91,7 +91,7 @@ class Redmine::WikiFormatting::TextileFormatterTest < HelperTestCase
'GPL(This is a double-quoted "title")' => '<acronym title="This is a double-quoted &quot;title&quot;">GPL</acronym>'
)
end
def test_blockquote
# orig raw text
raw = <<-RAW
@@ -108,7 +108,7 @@ John said:
He's right.
RAW
# expected html
expected = <<-EXPECTED
<p>John said:</p>
@@ -128,10 +128,10 @@ Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
</blockquote>
<p>He's right.</p>
EXPECTED
assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '')
end
def test_table
raw = <<-RAW
This is a table with empty cells:
@@ -153,7 +153,7 @@ EXPECTED
assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '')
end
def test_table_with_line_breaks
raw = <<-RAW
This is a table with line breaks:
@@ -192,19 +192,26 @@ EXPECTED
assert_equal expected.gsub(%r{\s+}, ''), to_html(raw).gsub(%r{\s+}, '')
end
def test_textile_should_not_mangle_brackets
assert_equal '<p>[msg1][msg2]</p>', to_html('[msg1][msg2]')
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
def assert_html_output(to_test, expect_paragraph = true)
to_test.each do |text, expected|
assert_equal(( expect_paragraph ? "<p>#{expected}</p>" : expected ), @formatter.new(text).to_html, "Formatting the following text failed:\n===\n#{text}\n===\n")
end
end
def to_html(text)
@formatter.new(text).to_html
end

View File

@@ -278,6 +278,16 @@ class MailHandlerTest < ActiveSupport::TestCase
assert_kind_of Issue, issue
assert_equal tracker, issue.tracker
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
Role.anonymous.add_permission!(:add_issues)

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