Compare commits

...
84 Commits
Author SHA1 Message Date
Jean-Philippe Lang b33ecc41f9 tagged version 1.1.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.1.2@5032 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-07 19:48:50 +00:00
Jean-Philippe Lang 78a4a995e6 Merged r5030 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-07 19:27:14 +00:00
Jean-Philippe Lang 465534a298 Merged r5021 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 16:12:27 +00:00
Jean-Philippe Lang d5f1bd07b2 Updates for 1.1.2 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:19:48 +00:00
Jean-Philippe Lang 50863117b8 Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:12:50 +00:00
Jean-Philippe Lang c6693fc78b Merged r4937 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:08:02 +00:00
Jean-Philippe Lang 1e01711e3d Merged r4946 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:57:03 +00:00
Jean-Philippe Lang 1ab7f6f930 Merged r4820 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:54:59 +00:00
Jean-Philippe Lang f6f7467cdd Merged r4913, r4914, r4916 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:51:10 +00:00
Jean-Philippe Lang 4d0a955d3c Merged r5004 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:48:40 +00:00
Jean-Philippe Lang c45044f13c Merged r4888 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:47:05 +00:00
Jean-Philippe Lang 4761e55691 Merged r4951 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:45:56 +00:00
Jean-Philippe Lang af7fb657f4 Merged r4889 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:36:06 +00:00
Jean-Philippe Lang 0805ab943e Merged r4890 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:34:31 +00:00
Jean-Philippe Lang 9589c0bcad Merged r4811 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:33:31 +00:00
Jean-Philippe Lang 91295ea6cd Merged r4935 and r4947 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:32:25 +00:00
Jean-Philippe Lang d0f4b5aa50 Merged r4968 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:27:44 +00:00
Jean-Philippe Lang 008e8d4fbf Merged r4965 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 16:45:02 +00:00
Toshi MARUYAMA 1e50fea55a Merged r4860 from trunk.
scm: fix diff revision param validation.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-18 13:48:29 +00:00
Toshi MARUYAMA 008d38d6b4 Merged r4816 from trunk.
scm: fix non ASCII filename downloaded from repo is broken on Internet Explorer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:51:43 +00:00
Toshi MARUYAMA c61c9e6471 Merged r4815 from trunk.
scm: cvs: fix most binary files become corrupted on Windows.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4818 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:51:21 +00:00
Jean-Baptiste Barth e5b5b61d6e Merged r4813 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:03:36 +00:00
Jean-Baptiste Barth 6a8cdf54b3 Removed .project file and added it to svn:ignore'd files. #7497
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4812 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 08:56:19 +00:00
Jean-Baptiste Barth e43d98a6f5 Merged r4799 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-06 00:34:21 +00:00
Jean-Philippe Lang 11b774d39d Merged r4784 from trunk (update for 1.1.1 release).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4785 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 14:38:25 +00:00
Jean-Philippe Lang 77c4667dbc Merged r4782 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 09:13:36 +00:00
Jean-Philippe Lang f05fdd5cfa Merged r4780 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4781 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:54:51 +00:00
Jean-Philippe Lang a0bb70ed2d Merged r4765 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:45:15 +00:00
Jean-Philippe Lang 1d5c3f7fba Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:43:27 +00:00
Jean-Philippe Lang 8b83aa1470 Merged r4775 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:32:10 +00:00
Jean-Philippe Lang 3a92721af4 Merged r4739 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4774 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:22:38 +00:00
Jean-Philippe Lang b3218ba4d4 Merged r4700 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:16:06 +00:00
Jean-Philippe Lang 975ee2b522 Merged r4701 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:11:51 +00:00
Jean-Philippe Lang 27a319e66d Merged r4727 and r4730 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:10:36 +00:00
Jean-Philippe Lang 7be5bf6e4d Merged r4741 and r4764 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:08:01 +00:00
Jean-Philippe Lang c73d4042d1 Merged r4677 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:05:54 +00:00
Jean-Philippe Lang 8270ad1e64 Merged r4736 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:04:40 +00:00
Jean-Philippe Lang 26016fbf43 Merged r4761 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:02:16 +00:00
Jean-Philippe Lang 307e4ceaa2 Merged r4708 and r4709 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:00:56 +00:00
Jean-Philippe Lang 03085e85f9 Merged r4720, r4724, r4738 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-27 17:51:01 +00:00
Jean-Philippe Lang 1f4e0dc10c Merged r4719 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-27 17:44:40 +00:00
Toshi MARUYAMA f69c95306d Merged r4749 from trunk.
scm: darcs: fix Darcs adapter recognizes new files as modified files above Darcs 2.4.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:21:57 +00:00
Toshi MARUYAMA 634ede3e8b Merged r4748 from trunk.
scm: darcs: add compatible test of Darcs 2.3 and 2.4.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:21:34 +00:00
Toshi MARUYAMA c2a2979189 Merged r4744 from trunk.
scm: darcs: switch '.' or @url at entries() in darcs version.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:03:04 +00:00
Toshi MARUYAMA 9800469943 Merged r4743 from trunk.
scm: darcs: change io.gets to io.read and add darcs version unit test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4746 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:02:41 +00:00
Toshi MARUYAMA e47f1d5595 Merged r4742 from trunk.
scm: darcs: add unit lib test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:02:15 +00:00
Jean-Philippe Lang 135fe04d02 Merged r4681 from trunk (missing fixtures breaking tests).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-16 16:39:19 +00:00
Jean-Philippe Lang 794d7c0959 Merged r4680 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-16 14:44:38 +00:00
Toshi MARUYAMA b8f365f2a1 Merged r4713 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4717 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:50 +00:00
Toshi MARUYAMA 6188b9eddb Merged r4710 and r4714 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4716 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:30 +00:00
Toshi MARUYAMA 96c4dc3f1e Merged r4712 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:10 +00:00
Toshi MARUYAMA b877215261 Merged r4703 from trunk (scm: fix error on revision page for empty revision).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-13 12:10:52 +00:00
Toshi MARUYAMA 788b143596 Merged r4665 from trunk.
scm: add compatible functional test fof changing diff revisions label at SCM adapter level.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4706 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-13 12:10:30 +00:00
Toshi MARUYAMA 6a261eb5a0 Merged r4691 from trunk (fix assert_equal parameter order in subversion and git unit test).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 15:28:23 +00:00
Toshi MARUYAMA 007fbc00cf Merged r4687 from trunk (fix setup mercurial test repository).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 08:46:27 +00:00
Toshi MARUYAMA 9b8b4b3bfc Merged r4683 from trunk (test:scm:setup:mercurial task can be simpler).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 04:22:52 +00:00
Toshi MARUYAMA 6734f91a72 Merged r4676 from trunk (change mercurial test repository from tar.gz to bundle).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 04:22:31 +00:00
Jean-Philippe Lang 5266346315 Set the version to stable (#7259).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-10 18:13:09 +00:00
Toshi MARUYAMA d426e4452b Merged r4644 and r4674 from trunk (mercurial unit app test).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-09 23:39:46 +00:00
Jean-Philippe Lang f8af1bebd7 Merged r4670 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-09 15:58:15 +00:00
Jean-Philippe Lang 6e695a4d1a Merged r4645 to r4651 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:14:00 +00:00
Jean-Philippe Lang e5b7c94cb4 Merged r4643 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:09:04 +00:00
Jean-Philippe Lang 9028e664c4 Merged r4656 and r4657 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4658 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:04:38 +00:00
Toshi MARUYAMA 6318affd31 Merged r4652 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 00:24:43 +00:00
Jean-Philippe Lang 8794cd3344 Merged r4610 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-06 21:04:24 +00:00
Toshi MARUYAMA 2fcd4e5271 Merged r4636 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:12:08 +00:00
Toshi MARUYAMA ea60705ca7 Merged r4635 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:11:47 +00:00
Toshi MARUYAMA 90bce4e366 Merged r4634 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:11:21 +00:00
Toshi MARUYAMA 9f7cc355ad Merged r4633 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:58 +00:00
Toshi MARUYAMA 6ee4c0bac7 Merged r4632 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:38 +00:00
Toshi MARUYAMA b0f0bd1848 Merged r4631 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4637 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:17 +00:00
Toshi MARUYAMA fe563a8802 Merged r4629 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4630 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-04 16:39:45 +00:00
Toshi MARUYAMA 8ebab00767 Merged r4625 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4628 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:55:07 +00:00
Toshi MARUYAMA d97297e45d Merged r4624 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:54:29 +00:00
Toshi MARUYAMA f06500dcce Merged r4623 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:53:47 +00:00
Jean-Philippe Lang b098e2b63f Merged r4621 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4622 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 14:37:55 +00:00
Jean-Philippe Lang 151a49b319 Merged r4618 and r4619 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4620 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 12:17:39 +00:00
Jean-Philippe Lang ded234794e Merged r4615 and r4616 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4617 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 11:44:19 +00:00
Toshi MARUYAMA 119732c3ee Merged r4613 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4614 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 09:52:29 +00:00
Toshi MARUYAMA 730fcef844 Merged r4611 from trunk (Mercurial sorting).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 06:14:59 +00:00
Toshi MARUYAMA 1cb33f3a95 Merged r4608 from trunk (repository: switch darcs cat test if cat supports).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-01 22:05:48 +00:00
Toshi MARUYAMA 69edd3c53f Merged r4606 from trunk (.hgignore).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4607 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-01 21:20:25 +00:00
Jean-Philippe Lang ad784e2146 Merged locales updates (r4592 to 4595) from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-30 15:54:47 +00:00
Jean-Philippe Lang c783ae4b3d 1.1-stable branch added
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-30 15:09:18 +00:00
181 changed files with 11446 additions and 917 deletions
+2
View File
@@ -1,3 +1,5 @@
/.project
/.loadpath
/config/additional_environment.rb /config/additional_environment.rb
/config/database.yml /config/database.yml
/config/email.yml /config/email.yml
+24
View File
@@ -0,0 +1,24 @@
syntax: glob
.project
.loadpath
config/additional_environment.rb
config/database.yml
config/email.yml
config/initializers/session_store.rb
coverage
db/*.db
db/*.sqlite3
db/schema.rb
files/*
log/*.log*
log/mongrel_debug
public/dispatch.*
public/plugin_assets
tmp/*
tmp/cache/*
tmp/sessions/*
tmp/sockets/*
tmp/test/*
vendor/rails
*.rbc
@@ -28,6 +28,7 @@ class IssueRelationsController < ApplicationController
respond_to do |format| respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue } format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js do format.js do
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
render :update do |page| render :update do |page|
page.replace_html "relations", :partial => 'issues/relations' page.replace_html "relations", :partial => 'issues/relations'
if @relation.errors.empty? if @relation.errors.empty?
@@ -47,7 +48,10 @@ class IssueRelationsController < ApplicationController
end end
respond_to do |format| respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue } format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js { render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'} } format.js {
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'}
}
end end
end end
+3
View File
@@ -44,6 +44,8 @@ class IssuesController < ApplicationController
include AttachmentsHelper include AttachmentsHelper
helper :queries helper :queries
include QueriesHelper include QueriesHelper
helper :repositories
include RepositoriesHelper
helper :sort helper :sort
include SortHelper include SortHelper
include IssuesHelper include IssuesHelper
@@ -106,6 +108,7 @@ class IssuesController < ApplicationController
@journals.reverse! if User.current.wants_comments_in_reverse_order? @journals.reverse! if User.current.wants_comments_in_reverse_order?
@changesets = @issue.changesets.visible.all @changesets = @issue.changesets.visible.all
@changesets.reverse! if User.current.wants_comments_in_reverse_order? @changesets.reverse! if User.current.wants_comments_in_reverse_order?
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
@allowed_statuses = @issue.new_statuses_allowed_to(User.current) @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@priorities = IssuePriority.all @priorities = IssuePriority.all
+9
View File
@@ -23,6 +23,7 @@ class JournalsController < ApplicationController
accept_key_auth :index accept_key_auth :index
helper :issues helper :issues
helper :custom_fields
helper :queries helper :queries
include QueriesHelper include QueriesHelper
helper :sort helper :sort
@@ -75,6 +76,14 @@ class JournalsController < ApplicationController
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id } format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
format.js { render :action => 'update' } format.js { render :action => 'update' }
end end
else
respond_to do |format|
format.html {
# TODO: implement non-JS journal update
render :nothing => true
}
format.js
end
end end
end end
+8 -8
View File
@@ -32,9 +32,6 @@ class ProjectsController < ApplicationController
end end
end end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
helper :sort helper :sort
include SortHelper include SortHelper
helper :custom_fields helper :custom_fields
@@ -71,13 +68,13 @@ class ProjectsController < ApplicationController
@project = Project.new(params[:project]) @project = Project.new(params[:project])
end end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create def create
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position") @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all @trackers = Tracker.all
@project = Project.new @project = Project.new
@project.safe_attributes = params[:project] @project.safe_attributes = params[:project]
@project.enabled_module_names = params[:enabled_modules] if params[:enabled_modules]
if validate_parent_id && @project.save if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin # Add current user as a project member if he is not admin
@@ -124,13 +121,13 @@ class ProjectsController < ApplicationController
if validate_parent_id && @project.copy(@source_project, :only => params[:only]) if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings' redirect_to :controller => 'projects', :action => 'settings', :id => @project
elsif !@project.new_record? elsif !@project.new_record?
# Project was created # Project was created
# But some objects were not copied due to validation failures # But some objects were not copied due to validation failures
# (eg. issues from disabled trackers) # (eg. issues from disabled trackers)
# TODO: inform about that # TODO: inform about that
redirect_to :controller => 'projects', :action => 'settings' redirect_to :controller => 'projects', :action => 'settings', :id => @project
end end
end end
end end
@@ -184,6 +181,8 @@ class ProjectsController < ApplicationController
def edit def edit
end end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update def update
@project.safe_attributes = params[:project] @project.safe_attributes = params[:project]
if validate_parent_id && @project.save if validate_parent_id && @project.save
@@ -205,9 +204,10 @@ class ProjectsController < ApplicationController
end end
end end
end end
verify :method => :post, :only => :modules, :render => {:nothing => true, :status => :method_not_allowed }
def modules def modules
@project.enabled_module_names = params[:enabled_modules] @project.enabled_module_names = params[:enabled_module_names]
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project, :tab => 'modules' redirect_to :action => 'settings', :id => @project, :tab => 'modules'
end end
+7 -3
View File
@@ -123,7 +123,7 @@ class RepositoriesController < ApplicationController
(show_error_not_found; return) unless @content (show_error_not_found; return) unless @content
if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte) if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte)
# Force the download # Force the download
send_data @content, :filename => @path.split('/').last send_data @content, :filename => filename_for_content_disposition(@path.split('/').last)
else else
# Prevent empty lines when displaying a file with Windows style eol # Prevent empty lines when displaying a file with Windows style eol
@content.gsub!("\r\n", "\n") @content.gsub!("\r\n", "\n")
@@ -139,6 +139,7 @@ class RepositoriesController < ApplicationController
end end
def revision def revision
raise ChangesetNotFound if @rev.nil? || @rev.empty?
@changeset = @repository.find_changeset_by_name(@rev) @changeset = @repository.find_changeset_by_name(@rev)
raise ChangesetNotFound unless @changeset raise ChangesetNotFound unless @changeset
@@ -174,6 +175,9 @@ class RepositoriesController < ApplicationController
@diff = @repository.diff(@path, @rev, @rev_to) @diff = @repository.diff(@path, @rev, @rev_to)
show_error_not_found unless @diff show_error_not_found unless @diff
end end
@changeset = @repository.find_changeset_by_name(@rev)
@changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil
end end
end end
@@ -209,7 +213,7 @@ class RepositoriesController < ApplicationController
@rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip
@rev_to = params[:rev_to] @rev_to = params[:rev_to]
unless @rev.to_s.match(REV_PARAM_RE) && @rev.to_s.match(REV_PARAM_RE) unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE)
if @repository.branches.blank? if @repository.branches.blank?
raise InvalidRevisionParam raise InvalidRevisionParam
end end
@@ -221,7 +225,7 @@ class RepositoriesController < ApplicationController
end end
def show_error_not_found def show_error_not_found
render_error l(:error_scm_not_found) render_error :message => l(:error_scm_not_found), :status => 404
end end
# Handler for Redmine::Scm::Adapters::CommandFailed exception # Handler for Redmine::Scm::Adapters::CommandFailed exception
+3 -1
View File
@@ -104,8 +104,10 @@ module ApplicationHelper
# * :text - Link text (default to the formatted revision) # * :text - Link text (default to the formatted revision)
def link_to_revision(revision, project, options={}) def link_to_revision(revision, project, options={})
text = options.delete(:text) || format_revision(revision) text = options.delete(:text) || format_revision(revision)
rev = revision.respond_to?(:identifier) ? revision.identifier : revision
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision)) link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => rev},
:title => l(:label_revision_id, format_revision(revision)))
end end
# Generates a link to a project if active # Generates a link to a project if active
+9 -5
View File
@@ -18,8 +18,12 @@
require 'iconv' require 'iconv'
module RepositoriesHelper module RepositoriesHelper
def format_revision(txt) def format_revision(revision)
txt.to_s[0,8] if revision.respond_to? :format_identifier
revision.format_identifier
else
revision.to_s
end
end end
def truncate_at_line_break(text, length = 255) def truncate_at_line_break(text, length = 255)
@@ -87,7 +91,7 @@ module RepositoriesHelper
:action => 'show', :action => 'show',
:id => @project, :id => @project,
:path => path_param, :path => path_param,
:rev => @changeset.revision) :rev => @changeset.identifier)
output << "<li class='#{style}'>#{text}</li>" output << "<li class='#{style}'>#{text}</li>"
output << render_changes_tree(s) output << render_changes_tree(s)
elsif c = tree[file][:c] elsif c = tree[file][:c]
@@ -97,13 +101,13 @@ module RepositoriesHelper
:action => 'entry', :action => 'entry',
:id => @project, :id => @project,
:path => path_param, :path => path_param,
:rev => @changeset.revision) unless c.action == 'D' :rev => @changeset.identifier) unless c.action == 'D'
text << " - #{c.revision}" unless c.revision.blank? text << " - #{c.revision}" unless c.revision.blank?
text << ' (' + link_to('diff', :controller => 'repositories', text << ' (' + link_to('diff', :controller => 'repositories',
:action => 'diff', :action => 'diff',
:id => @project, :id => @project,
:path => path_param, :path => path_param,
:rev => @changeset.revision) + ') ' if c.action == 'M' :rev => @changeset.identifier) + ') ' if c.action == 'M'
text << ' ' + content_tag('span', c.from_path, :class => 'copied-from') unless c.from_path.blank? text << ' ' + content_tag('span', c.from_path, :class => 'copied-from') unless c.from_path.blank?
output << "<li class='#{style}'>#{text}</li>" output << "<li class='#{style}'>#{text}</li>"
end end
+24 -4
View File
@@ -23,10 +23,10 @@ class Changeset < ActiveRecord::Base
has_many :changes, :dependent => :delete_all has_many :changes, :dependent => :delete_all
has_and_belongs_to_many :issues has_and_belongs_to_many :issues
acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.revision}" + (o.short_comments.blank? ? '' : (': ' + o.short_comments))}, acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.format_identifier}" + (o.short_comments.blank? ? '' : (': ' + o.short_comments))},
:description => :long_comments, :description => :long_comments,
:datetime => :committed_on, :datetime => :committed_on,
:url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :rev => o.revision}} :url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :rev => o.identifier}}
acts_as_searchable :columns => 'comments', acts_as_searchable :columns => 'comments',
:include => {:repository => :project}, :include => {:repository => :project},
@@ -47,6 +47,15 @@ class Changeset < ActiveRecord::Base
def revision=(r) def revision=(r)
write_attribute :revision, (r.nil? ? nil : r.to_s) write_attribute :revision, (r.nil? ? nil : r.to_s)
end end
# Returns the identifier of this changeset; depending on repository backends
def identifier
if repository.class.respond_to? :changeset_identifier
repository.class.changeset_identifier self
else
revision.to_s
end
end
def comments=(comment) def comments=(comment)
write_attribute(:comments, Changeset.normalize_comments(comment)) write_attribute(:comments, Changeset.normalize_comments(comment))
@@ -56,6 +65,15 @@ class Changeset < ActiveRecord::Base
self.commit_date = date self.commit_date = date
super super
end end
# Returns the readable identifier
def format_identifier
if repository.class.respond_to? :format_changeset_identifier
repository.class.format_changeset_identifier self
else
identifier
end
end
def committer=(arg) def committer=(arg)
write_attribute(:committer, self.class.to_utf8(arg.to_s)) write_attribute(:committer, self.class.to_utf8(arg.to_s))
@@ -79,11 +97,13 @@ class Changeset < ActiveRecord::Base
TIMELOG_RE = / TIMELOG_RE = /
( (
(\d+([.,]\d+)?)h? ((\d+)(h|hours?))((\d+)(m|min)?)?
|
((\d+)(h|hours?|m|min))
| |
(\d+):(\d+) (\d+):(\d+)
| |
((\d+)(h|hours?))?((\d+)(m|min)?)? (\d+([\.,]\d+)?)h?
) )
/x /x
+5 -1
View File
@@ -100,7 +100,7 @@ class MailHandler < ActionMailer::Base
elsif m = email.subject.match(MESSAGE_REPLY_SUBJECT_RE) elsif m = email.subject.match(MESSAGE_REPLY_SUBJECT_RE)
receive_message_reply(m[1].to_i) receive_message_reply(m[1].to_i)
else else
receive_issue dispatch_to_default
end end
rescue ActiveRecord::RecordInvalid => e rescue ActiveRecord::RecordInvalid => e
# TODO: send a email to the user # TODO: send a email to the user
@@ -113,6 +113,10 @@ class MailHandler < ActionMailer::Base
logger.error "MailHandler: unauthorized attempt from #{user}" if logger logger.error "MailHandler: unauthorized attempt from #{user}" if logger
false false
end end
def dispatch_to_default
receive_issue
end
# Creates a new issue # Creates a new issue
def receive_issue def receive_issue
+10 -2
View File
@@ -66,7 +66,7 @@ class Project < ActiveRecord::Base
:url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o}}, :url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o}},
:author => nil :author => nil
attr_protected :status, :enabled_module_names attr_protected :status
validates_presence_of :name, :identifier validates_presence_of :name, :identifier
validates_uniqueness_of :identifier validates_uniqueness_of :identifier
@@ -533,6 +533,9 @@ class Project < ActiveRecord::Base
'tracker_ids', 'tracker_ids',
'issue_custom_field_ids' 'issue_custom_field_ids'
safe_attributes 'enabled_module_names',
:if => lambda {|project, user| project.new_record? || user.allowed_to?(:select_project_modules, project) }
# Returns an array of projects that are in this project's hierarchy # Returns an array of projects that are in this project's hierarchy
# #
# Example: parents, children, siblings # Example: parents, children, siblings
@@ -740,7 +743,12 @@ class Project < ActiveRecord::Base
# Copies members from +project+ # Copies members from +project+
def copy_members(project) def copy_members(project)
project.memberships.each do |member| # Copy users first, then groups to handle members with inherited and given roles
members_to_copy = []
members_to_copy += project.memberships.select {|m| m.principal.is_a?(User)}
members_to_copy += project.memberships.select {|m| !m.principal.is_a?(User)}
members_to_copy.each do |member|
new_member = Member.new new_member = Member.new
new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on") new_member.attributes = member.attributes.dup.except("id", "project_id", "created_on")
# only copy non inherited roles # only copy non inherited roles
+12 -2
View File
@@ -566,9 +566,19 @@ class Query < ActiveRecord::Base
sql = '' sql = ''
case operator case operator
when "=" when "="
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" if value.any?
sql = "#{db_table}.#{db_field} IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")"
else
# IN an empty set
sql = "1=0"
end
when "!" when "!"
sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))" if value.any?
sql = "(#{db_table}.#{db_field} IS NULL OR #{db_table}.#{db_field} NOT IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + "))"
else
# NOT IN an empty set
sql = "1=1"
end
when "!*" when "!*"
sql = "#{db_table}.#{db_field} IS NULL" sql = "#{db_table}.#{db_field} IS NULL"
sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
+3 -2
View File
@@ -91,12 +91,13 @@ class Repository < ActiveRecord::Base
def relative_path(path) def relative_path(path)
path path
end end
# Finds and returns a revision with a number or the beginning of a hash # Finds and returns a revision with a number or the beginning of a hash
def find_changeset_by_name(name) def find_changeset_by_name(name)
return nil if name.blank?
changesets.find(:first, :conditions => (name.match(/^\d*$/) ? ["revision = ?", name.to_s] : ["revision LIKE ?", name + '%'])) changesets.find(:first, :conditions => (name.match(/^\d*$/) ? ["revision = ?", name.to_s] : ["revision LIKE ?", name + '%']))
end end
def latest_changeset def latest_changeset
@latest_changeset ||= changesets.find(:first) @latest_changeset ||= changesets.find(:first)
end end
+10
View File
@@ -29,6 +29,16 @@ class Repository::Git < Repository
'Git' 'Git'
end end
# Returns the identifier for the given git changeset
def self.changeset_identifier(changeset)
changeset.scmid
end
# Returns the readable identifier for the given git changeset
def self.format_changeset_identifier(changeset)
changeset.revision[0, 8]
end
def branches def branches
scm.branches scm.branches
end end
+15
View File
@@ -18,6 +18,9 @@
require 'redmine/scm/adapters/mercurial_adapter' require 'redmine/scm/adapters/mercurial_adapter'
class Repository::Mercurial < Repository class Repository::Mercurial < Repository
# sort changesets by revision number
has_many :changesets, :order => "#{Changeset.table_name}.id DESC", :foreign_key => 'repository_id'
attr_protected :root_url attr_protected :root_url
validates_presence_of :url validates_presence_of :url
@@ -52,6 +55,18 @@ class Repository::Mercurial < Repository
entries entries
end end
# Returns the latest changesets for +path+; sorted by revision number
def latest_changesets(path, rev, limit=10)
if path.blank?
changesets.find(:all, :include => :user, :limit => limit)
else
changes.find(:all, :include => {:changeset => :user},
:conditions => ["path = ?", path.with_leading_slash],
:order => "#{Changeset.table_name}.id DESC",
:limit => limit).collect(&:changeset)
end
end
def fetch_changesets def fetch_changesets
scm_info = scm.info scm_info = scm.info
if scm_info if scm_info
+3
View File
@@ -66,6 +66,9 @@ class TimeEntry < ActiveRecord::Base
# these attributes make time aggregations easier # these attributes make time aggregations easier
def spent_on=(date) def spent_on=(date)
super super
if spent_on.is_a?(Time)
self.spent_on = spent_on.to_date
end
self.tyear = spent_on ? spent_on.year : nil self.tyear = spent_on ? spent_on.year : nil
self.tmonth = spent_on ? spent_on.month : nil self.tmonth = spent_on ? spent_on.month : nil
self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil
+13 -4
View File
@@ -261,12 +261,16 @@ class User < Principal
notified_projects_ids notified_projects_ids
end end
# Only users that belong to more than 1 project can select projects for which they are notified
def valid_notification_options def valid_notification_options
self.class.valid_notification_options(self)
end
# Only users that belong to more than 1 project can select projects for which they are notified
def self.valid_notification_options(user=nil)
# Note that @user.membership.size would fail since AR ignores # Note that @user.membership.size would fail since AR ignores
# :include association option when doing a count # :include association option when doing a count
if memberships.length < 1 if user.nil? || user.memberships.length < 1
MAIL_NOTIFICATION_OPTIONS.delete_if {|option| option.first == 'selected'} MAIL_NOTIFICATION_OPTIONS.reject {|option| option.first == 'selected'}
else else
MAIL_NOTIFICATION_OPTIONS MAIL_NOTIFICATION_OPTIONS
end end
@@ -419,7 +423,12 @@ class User < Principal
when 'all' when 'all'
true true
when 'selected' when 'selected'
# Handled by the Project # user receives notifications for created/assigned issues on unselected projects
if object.is_a?(Issue) && (object.author == self || object.assigned_to == self)
true
else
false
end
when 'none' when 'none'
false false
when 'only_my_events' when 'only_my_events'
+3 -3
View File
@@ -45,11 +45,11 @@ class Wiki < ActiveRecord::Base
# find the page with the given title # find the page with the given title
def find_page(title, options = {}) def find_page(title, options = {})
title = start_page if title.blank? title = start_page if title.blank?
title = Wiki.titleize(title).downcase title = Wiki.titleize(title)
page = pages.first(:conditions => ["LOWER(title) LIKE ?", title]) page = pages.first(:conditions => ["LOWER(title) LIKE LOWER(?)", title])
if !page && !(options[:with_redirect] == false) if !page && !(options[:with_redirect] == false)
# search for a redirect # search for a redirect
redirect = redirects.first(:conditions => ["LOWER(title) LIKE ?", title]) redirect = redirects.first(:conditions => ["LOWER(title) LIKE LOWER(?)", title])
page = find_page(redirect.redirects_to, :with_redirect => false) if redirect page = find_page(redirect.redirects_to, :with_redirect => false) if redirect
end end
page page
+1
View File
@@ -69,4 +69,5 @@
<% content_for :header_tags do %> <% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %> <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %>
<%= stylesheet_link_tag 'scm' %>
<% end %> <% end %>
+1 -1
View File
@@ -60,7 +60,7 @@ end
# Width of the entire chart # Width of the entire chart
g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
@gantt.render(:top => headers_height + 8, :zoom => zoom, :g_width => g_width) @gantt.render(:top => headers_height + 8, :zoom => zoom, :g_width => g_width, :subject_width => subject_width)
g_height = [(20 * (@gantt.number_of_rows + 6))+150, 206].max g_height = [(20 * (@gantt.number_of_rows + 6))+150, 206].max
t_height = g_height + headers_height t_height = g_height + headers_height
+2 -2
View File
@@ -1,7 +1,7 @@
<% changesets.each do |changeset| %> <% changesets.each do |changeset| %>
<div class="changeset <%= cycle('odd', 'even') %>"> <div class="changeset <%= cycle('odd', 'even') %>">
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}", <p><%= link_to_revision(changeset, changeset.project,
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br /> :text => "#{l(:label_revision)} #{changeset.format_identifier}") %><br />
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p> <span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
<div class="changeset-changes"> <div class="changeset-changes">
<%= textilizable(changeset, :comments) %> <%= textilizable(changeset, :comments) %>
+2 -2
View File
@@ -6,9 +6,9 @@
<p><strong><%=l(:label_related_issues)%></strong></p> <p><strong><%=l(:label_related_issues)%></strong></p>
<% if @issue.relations.any? %> <% if @relations.present? %>
<table style="width:100%"> <table style="width:100%">
<% @issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation| %> <% @relations.each do |relation| %>
<tr> <tr>
<td><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %> <td><%= l(relation.label_for(@issue)) %> <%= "(#{l('datetime.distance_in_words.x_days', :count => relation.delay)})" if relation.delay && relation.delay != 0 %>
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %> <%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %>
+2 -2
View File
@@ -26,10 +26,10 @@ api.issue do
render_api_issue_children(@issue, api) if include_in_api_response?('children') render_api_issue_children(@issue, api) if include_in_api_response?('children')
api.array :relations do api.array :relations do
@issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation| @relations.each do |relation|
api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay) api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay)
end end
end if include_in_api_response?('relations') end if include_in_api_response?('relations') && @relations.present?
api.array :changesets do api.array :changesets do
@issue.changesets.each do |changeset| @issue.changesets.each do |changeset|
+2 -2
View File
@@ -21,7 +21,7 @@
<!-- page specific tags --> <!-- page specific tags -->
<%= yield :header_tags -%> <%= yield :header_tags -%>
</head> </head>
<body class="<%= body_css_classes %>"> <body class="<%=h body_css_classes %>">
<div id="wrapper"> <div id="wrapper">
<div id="wrapper2"> <div id="wrapper2">
<div id="top-menu"> <div id="top-menu">
@@ -69,7 +69,7 @@
<div id="footer"> <div id="footer">
<div class="bgl"><div class="bgr"> <div class="bgl"><div class="bgr">
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> &copy; 2006-2010 Jean-Philippe Lang Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> &copy; 2006-2011 Jean-Philippe Lang
</div></div> </div></div>
</div> </div>
</div> </div>
+4
View File
@@ -12,3 +12,7 @@
}, :accesskey => accesskey(:preview) %> }, :accesskey => accesskey(:preview) %>
<% end %> <% end %>
<div id="preview" class="wiki"></div> <div id="preview" class="wiki"></div>
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>
+17 -2
View File
@@ -23,8 +23,22 @@
<%= call_hook(:view_projects_form, :project => @project, :form => f) %> <%= call_hook(:view_projects_form, :project => @project, :form => f) %>
</div> </div>
<% if @project.new_record? %>
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
<% Redmine::AccessControl.available_project_modules.each do |m| %>
<label class="floating">
<%= check_box_tag 'project[enabled_module_names][]', m, @project.module_enabled?(m), :id => "project_enabled_module_names_#{m}" %>
<%= l_or_humanize(m, :prefix => "project_module_") %>
</label>
<% end %>
<%= hidden_field_tag 'project[enabled_module_names][]', '' %>
<%= javascript_tag 'observeProjectModules()' %>
</fieldset>
<% end %>
<% if @project.new_record? || @project.module_enabled?('issue_tracking') %>
<% unless @trackers.empty? %> <% unless @trackers.empty? %>
<fieldset class="box"><legend><%=l(:label_tracker_plural)%></legend> <fieldset class="box" id="project_trackers"><legend><%=l(:label_tracker_plural)%></legend>
<% @trackers.each do |tracker| %> <% @trackers.each do |tracker| %>
<label class="floating"> <label class="floating">
<%= check_box_tag 'project[tracker_ids][]', tracker.id, @project.trackers.include?(tracker) %> <%= check_box_tag 'project[tracker_ids][]', tracker.id, @project.trackers.include?(tracker) %>
@@ -36,7 +50,7 @@
<% end %> <% end %>
<% unless @issue_custom_fields.empty? %> <% unless @issue_custom_fields.empty? %>
<fieldset class="box"><legend><%=l(:label_custom_field_plural)%></legend> <fieldset class="box" id="project_issue_custom_fields"><legend><%=l(:label_custom_field_plural)%></legend>
<% @issue_custom_fields.each do |custom_field| %> <% @issue_custom_fields.each do |custom_field| %>
<label class="floating"> <label class="floating">
<%= check_box_tag 'project[issue_custom_field_ids][]', custom_field.id, (@project.all_issue_custom_fields.include? custom_field), (custom_field.is_for_all? ? {:disabled => "disabled"} : {}) %> <%= check_box_tag 'project[issue_custom_field_ids][]', custom_field.id, (@project.all_issue_custom_fields.include? custom_field), (custom_field.is_for_all? ? {:disabled => "disabled"} : {}) %>
@@ -46,4 +60,5 @@
<%= hidden_field_tag 'project[issue_custom_field_ids][]', '' %> <%= hidden_field_tag 'project[issue_custom_field_ids][]', '' %>
</fieldset> </fieldset>
<% end %> <% end %>
<% end %>
<!--[eoform:project]--> <!--[eoform:project]-->
-12
View File
@@ -2,18 +2,6 @@
<% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %> <% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %> <%= render :partial => 'form', :locals => { :f => f } %>
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
<% Redmine::AccessControl.available_project_modules.each do |m| %>
<label class="floating">
<%= check_box_tag 'enabled_modules[]', m, @project.module_enabled?(m) %>
<%= l_or_humanize(m, :prefix => "project_module_") %>
</label>
<% end %>
<%= hidden_field_tag 'enabled_modules[]', '' %>
</fieldset>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
<%= javascript_tag "Form.Element.focus('project_name');" %> <%= javascript_tag "Form.Element.focus('project_name');" %>
<% end %> <% end %>
+2 -2
View File
@@ -56,8 +56,8 @@
<div class="splitcontentright"> <div class="splitcontentright">
<% if roles.any? && principals.any? %> <% if roles.any? && principals.any? %>
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post, <% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post,
:loading => "$('member-add-submit').disable()", :loading => '$(\'member-add-submit\').disable();',
:complete => "$('member-add-submit').enable()") do |f| %> :complete => 'if($(\'member-add-submit\')) $(\'member-add-submit\').enable();') do |f| %>
<fieldset><legend><%=l(:label_member_new)%></legend> <fieldset><legend><%=l(:label_member_new)%></legend>
<p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p> <p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p>
+1 -1
View File
@@ -7,7 +7,7 @@
<legend><%= l(:text_select_project_modules) %></legend> <legend><%= l(:text_select_project_modules) %></legend>
<% Redmine::AccessControl.available_project_modules.each do |m| %> <% Redmine::AccessControl.available_project_modules.each do |m| %>
<p><label><%= check_box_tag 'enabled_modules[]', m, @project.module_enabled?(m) -%> <p><label><%= check_box_tag 'enabled_module_names[]', m, @project.module_enabled?(m) -%>
<%= l_or_humanize(m, :prefix => "project_module_") %></label></p> <%= l_or_humanize(m, :prefix => "project_module_") %></label></p>
<% end %> <% end %>
</fieldset> </fieldset>
@@ -17,7 +17,7 @@
</td> </td>
<td class="size"><%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %></td> <td class="size"><%= (entry.size ? number_to_human_size(entry.size) : "?") unless entry.is_dir? %></td>
<% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %> <% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
<td class="revision"><%= link_to_revision(changeset.revision, @project) if changeset %></td> <td class="revision"><%= link_to_revision(changeset, @project) if changeset %></td>
<td class="age"><%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %></td> <td class="age"><%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev && entry.lastrev.time %></td>
<td class="author"><%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %></td> <td class="author"><%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %></td>
<td class="comments"><%=h truncate(changeset.comments, :length => 50) unless changeset.nil? %></td> <td class="comments"><%=h truncate(changeset.comments, :length => 50) unless changeset.nil? %></td>
+3 -3
View File
@@ -13,9 +13,9 @@
<% line_num = 1 %> <% line_num = 1 %>
<% revisions.each do |changeset| %> <% revisions.each do |changeset| %>
<tr class="changeset <%= cycle 'odd', 'even' %>"> <tr class="changeset <%= cycle 'odd', 'even' %>">
<td class="id"><%= link_to_revision(changeset.revision, project) %></td> <td class="id"><%= link_to_revision(changeset, project) %></td>
<td class="checkbox"><%= radio_button_tag('rev', changeset.revision, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < revisions.size) %></td> <td class="checkbox"><%= radio_button_tag('rev', changeset.identifier, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < revisions.size) %></td>
<td class="checkbox"><%= radio_button_tag('rev_to', changeset.revision, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td> <td class="checkbox"><%= radio_button_tag('rev_to', changeset.identifier, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td>
<td class="committed_on"><%= format_time(changeset.committed_on) %></td> <td class="committed_on"><%= format_time(changeset.committed_on) %></td>
<td class="author"><%=h changeset.author %></td> <td class="author"><%=h changeset.author %></td>
<td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td> <td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td>
+1 -1
View File
@@ -19,7 +19,7 @@
<tr class="bloc-<%= revision.nil? ? 0 : colors[revision.identifier || revision.revision] %>"> <tr class="bloc-<%= revision.nil? ? 0 : colors[revision.identifier || revision.revision] %>">
<th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th> <th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th>
<td class="revision"> <td class="revision">
<%= (revision.identifier ? link_to(format_revision(revision.identifier), :action => 'revision', :id => @project, :rev => revision.identifier) : format_revision(revision.revision)) if revision %></td> <%= (revision.identifier ? link_to_revision(revision, @project) : format_revision(revision)) if revision %></td>
<td class="author"><%= h(revision.author.to_s.split('<').first) if revision %></td> <td class="author"><%= h(revision.author.to_s.split('<').first) if revision %></td>
<td class="line-code"><pre><%= line %></pre></td> <td class="line-code"><pre><%= line %></pre></td>
</tr> </tr>
+1 -1
View File
@@ -1,4 +1,4 @@
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2> <h2><%= l(:label_revision) %> <%= format_revision(@changeset_to) + ':' if @changeset_to %><%= format_revision(@changeset) %> <%=h @path %></h2>
<!-- Choose view type --> <!-- Choose view type -->
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %> <% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
+6 -6
View File
@@ -1,25 +1,25 @@
<div class="contextual"> <div class="contextual">
&#171; &#171;
<% unless @changeset.previous.nil? -%> <% unless @changeset.previous.nil? -%>
<%= link_to_revision(@changeset.previous.revision, @project, :text => l(:label_previous)) %> <%= link_to_revision(@changeset.previous, @project, :text => l(:label_previous)) %>
<% else -%> <% else -%>
<%= l(:label_previous) %> <%= l(:label_previous) %>
<% end -%> <% end -%>
| |
<% unless @changeset.next.nil? -%> <% unless @changeset.next.nil? -%>
<%= link_to_revision(@changeset.next.revision, @project, :text => l(:label_next)) %> <%= link_to_revision(@changeset.next, @project, :text => l(:label_next)) %>
<% else -%> <% else -%>
<%= l(:label_next) %> <%= l(:label_next) %>
<% end -%> <% end -%>
&#187;&nbsp; &#187;&nbsp;
<% form_tag({:controller => 'repositories', :action => 'revision', :id => @project, :rev => nil}, :method => :get) do %> <% form_tag({:controller => 'repositories', :action => 'revision', :id => @project, :rev => nil}, :method => :get) do %>
<%= text_field_tag 'rev', @rev[0,8], :size => 8 %> <%= text_field_tag 'rev', @rev, :size => 8 %>
<%= submit_tag 'OK', :name => nil %> <%= submit_tag 'OK', :name => nil %>
<% end %> <% end %>
</div> </div>
<h2><%= l(:label_revision) %> <%= format_revision(@changeset.revision) %></h2> <h2><%= l(:label_revision) %> <%= format_revision(@changeset) %></h2>
<p><% if @changeset.scmid %>ID: <%= @changeset.scmid %><br /><% end %> <p><% if @changeset.scmid %>ID: <%= @changeset.scmid %><br /><% end %>
<span class="author"><%= authoring(@changeset.committed_on, @changeset.author) %></span></p> <span class="author"><%= authoring(@changeset.committed_on, @changeset.author) %></span></p>
@@ -45,7 +45,7 @@
<li class="change change-D"><%= l(:label_deleted) %></li> <li class="change change-D"><%= l(:label_deleted) %></li>
</ul> </ul>
<p><%= link_to(l(:label_view_diff), :action => 'diff', :id => @project, :path => "", :rev => @changeset.revision) if @changeset.changes.any? %></p> <p><%= link_to(l(:label_view_diff), :action => 'diff', :id => @project, :path => "", :rev => @changeset.identifier) if @changeset.changes.any? %></p>
<div class="changeset-changes"> <div class="changeset-changes">
<%= render_changeset_changes %> <%= render_changeset_changes %>
@@ -56,4 +56,4 @@
<%= stylesheet_link_tag "scm" %> <%= stylesheet_link_tag "scm" %>
<% end %> <% end %>
<% html_title("#{l(:label_revision)} #{@changeset.revision}") -%> <% html_title("#{l(:label_revision)} #{format_revision(@changeset)}") -%>
+1 -1
View File
@@ -15,7 +15,7 @@
<p><%= setting_check_box :gravatar_enabled %></p> <p><%= setting_check_box :gravatar_enabled %></p>
<p><%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid']], :blank => :label_none %></p> <p><%= setting_select :gravatar_default, [["Wavatars", 'wavatar'], ["Identicons", 'identicon'], ["Monster ids", 'monsterid'], ["Retro", "retro"]], :blank => :label_none %></p>
</div> </div>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>
+1 -1
View File
@@ -8,7 +8,7 @@
<p><%= setting_check_box :plain_text_mail %></p> <p><%= setting_check_box :plain_text_mail %></p>
<p><%= setting_select(:default_notification_option, User::MAIL_NOTIFICATION_OPTIONS.collect {|o| [l(o.last), o.first.to_s]}) %></p> <p><%= setting_select(:default_notification_option, User.valid_notification_options.collect {|o| [l(o.last), o.first.to_s]}) %></p>
</div> </div>
+6 -6
View File
@@ -4,7 +4,7 @@
<% form_tag({:action => "diff"}, :method => :get) do %> <% form_tag({:action => "diff"}, :method => :get) do %>
<%= hidden_field_tag('project_id', h(@project.to_param)) %> <%= hidden_field_tag('project_id', h(@project.to_param)) %>
<table class="list"> <table class="list wiki-page-versions">
<thead><tr> <thead><tr>
<th>#</th> <th>#</th>
<th></th> <th></th>
@@ -18,14 +18,14 @@
<% show_diff = @versions.size > 1 %> <% show_diff = @versions.size > 1 %>
<% line_num = 1 %> <% line_num = 1 %>
<% @versions.each do |ver| %> <% @versions.each do |ver| %>
<tr class="<%= cycle("odd", "even") %>"> <tr class="wiki-page-version <%= cycle("odd", "even") %>">
<td class="id"><%= link_to ver.version, :action => 'show', :id => @page.title, :project_id => @page.project, :version => ver.version %></td> <td class="id"><%= link_to ver.version, :action => 'show', :id => @page.title, :project_id => @page.project, :version => ver.version %></td>
<td class="checkbox"><%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %></td> <td class="checkbox"><%= radio_button_tag('version', ver.version, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < @versions.size) %></td>
<td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td> <td class="checkbox"><%= radio_button_tag('version_from', ver.version, (line_num==2), :id => "cbto-#{line_num}") if show_diff && (line_num > 1) %></td>
<td align="center"><%= format_time(ver.updated_on) %></td> <td class="updated_on"><%= format_time(ver.updated_on) %></td>
<td><%= link_to_user ver.author %></td> <td class="author"><%= link_to_user ver.author %></td>
<td><%=h ver.comments %></td> <td class="comments"><%=h ver.comments %></td>
<td align="center"><%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %></td> <td class="buttons"><%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %></td>
</tr> </tr>
<% line_num += 1 %> <% line_num += 1 %>
<% end %> <% end %>
+1 -1
View File
@@ -24,7 +24,7 @@
<td><%= h tracker %></td> <td><%= h tracker %></td>
<% roles.each do |role, count| -%> <% roles.each do |role, count| -%>
<td align="center"> <td align="center">
<%= link_to((count > 1 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %> <%= link_to((count > 0 ? count : image_tag('false.png')), {:action => 'edit', :role_id => role, :tracker_id => tracker}, :title => l(:button_edit)) %>
</td> </td>
<% end -%> <% end -%>
</tr> </tr>
+1
View File
@@ -51,6 +51,7 @@ Rails::Initializer.run do |config|
config.action_mailer.perform_deliveries = false config.action_mailer.perform_deliveries = false
config.gem 'rubytree', :lib => 'tree' config.gem 'rubytree', :lib => 'tree'
config.gem 'coderay', :version => '~>0.9.7'
# Load any local configuration that is kept out of source control # Load any local configuration that is kept out of source control
# (e.g. gems, patches). # (e.g. gems, patches).
+343 -339
View File
@@ -1,11 +1,12 @@
bg: bg:
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
direction: ltr direction: ltr
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
# When no format has been given, it uses default. # When no format has been given, it uses default.
# You can provide other formats here if you like! # You can provide other formats here if you like!
default: "%Y-%m-%d" default: "%d-%m-%Y"
short: "%b %d" short: "%b %d"
long: "%B %d, %Y" long: "%B %d, %Y"
@@ -65,12 +66,13 @@ bg:
other: "почти %{count} години" other: "почти %{count} години"
number: number:
# Default format for numbers
format: format:
separator: "." separator: "."
delimiter: "" delimiter: ""
precision: 3 precision: 3
human: human:
format: format:
precision: 1 precision: 1
delimiter: "" delimiter: ""
storage_units: storage_units:
@@ -83,7 +85,8 @@ bg:
mb: "MB" mb: "MB"
gb: "GB" gb: "GB"
tb: "TB" tb: "TB"
# Used in array.to_sentence. # Used in array.to_sentence.
support: support:
array: array:
@@ -94,8 +97,8 @@ bg:
errors: errors:
template: template:
header: header:
one: "1 error prohibited this %{model} from being saved" one: "1 грешка попречи този %{model} да бъде записан"
other: "%{count} errors prohibited this %{model} from being saved" other: "%{count} грешки попречиха този %{model} да бъде записан"
messages: messages:
inclusion: "не съществува в списъка" inclusion: "не съществува в списъка"
exclusion: "е запазено" exclusion: "е запазено"
@@ -120,6 +123,7 @@ bg:
greater_than_start_date: "трябва да е след началната дата" greater_than_start_date: "трябва да е след началната дата"
not_same_project: "не е от същия проект" not_same_project: "не е от същия проект"
circular_dependency: "Тази релация ще доведе до безкрайна зависимост" circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
cant_link_an_issue_with_a_descendant: "Една задача не може да бъде свързвана към своя подзадача"
actionview_instancetag_blank_option: Изберете actionview_instancetag_blank_option: Изберете
@@ -127,7 +131,7 @@ bg:
general_text_Yes: 'Да' general_text_Yes: 'Да'
general_text_no: 'не' general_text_no: 'не'
general_text_yes: 'да' general_text_yes: 'да'
general_lang_name: 'Bulgarian' general_lang_name: 'Bulgarian (Български)'
general_csv_separator: ',' general_csv_separator: ','
general_csv_decimal_separator: '.' general_csv_decimal_separator: '.'
general_csv_encoding: UTF-8 general_csv_encoding: UTF-8
@@ -150,24 +154,61 @@ bg:
notice_file_not_found: Несъществуваща или преместена страница. notice_file_not_found: Несъществуваща или преместена страница.
notice_locking_conflict: Друг потребител променя тези данни в момента. notice_locking_conflict: Друг потребител променя тези данни в момента.
notice_not_authorized: Нямате право на достъп до тази страница. notice_not_authorized: Нямате право на достъп до тази страница.
notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
notice_email_sent: "Изпратен e-mail на %{value}" notice_email_sent: "Изпратен e-mail на %{value}"
notice_email_error: "Грешка при изпращане на e-mail (%{value})" notice_email_error: "Грешка при изпращане на e-mail (%{value})"
notice_feeds_access_key_reseted: Вашия ключ за RSS достъп беше променен. notice_feeds_access_key_reseted: Вашия ключ за RSS достъп беше променен.
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}."
notice_failed_to_save_members: "Невъзможност за запис на член(ове): %{errors}."
notice_no_issue_selected: "Няма избрани задачи."
notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор."
notice_default_data_loaded: Примерната информация е заредена успешно.
notice_unable_delete_version: Невъзможност за изтриване на версия
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
notice_gantt_chart_truncated: Мрежовият график е съкратен, понеже броят на обектите, които могат да бъдат показани е твърде голям (%{max})
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
error_scm_not_found: Несъществуващ обект в хранилището. error_scm_not_found: Несъществуващ обект в хранилището.
error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}" error_scm_command_failed: "Грешка при опит за комуникация с хранилище: %{value}"
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново
error_can_not_archive_project: Този проект не може да бъде архивиран
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
error_workflow_copy_source: Моля изберете source тракер или роля
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
error_unable_to_connect: Невъзможност за свързване с (%{value})
warning_attachments_not_saved: "%{count} файла не бяха записани."
mail_subject_lost_password: "Вашата парола (%{value})" mail_subject_lost_password: "Вашата парола (%{value})"
mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:' mail_body_lost_password: 'За да смените паролата си, използвайте следния линк:'
mail_subject_register: "Активация на профил (%{value})" mail_subject_register: "Активация на профил (%{value})"
mail_body_register: 'За да активирате профила си използвайте следния линк:' mail_body_register: 'За да активирате профила си използвайте следния линк:'
mail_body_account_information_external: "Можете да използвате вашия %{value} профил за вход."
mail_body_account_information: Информацията за профила ви
mail_subject_account_activation_request: "Заявка за активиране на профил в %{value}"
mail_body_account_activation_request: "Има новорегистриран потребител (%{value}), очакващ вашето одобрение:"
mail_subject_reminder: "%{count} задачи с краен срок с следващите %{days} дни"
mail_body_reminder: "%{count} задачи, назначени на вас са с краен срок в следващите %{days} дни:"
mail_subject_wiki_content_added: "Wiki страницата '%{id}' беше добавена"
mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}.
mail_subject_wiki_content_updated: "Wiki страницата '%{id}' не беше обновена"
mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}.
gui_validation_error: 1 грешка gui_validation_error: 1 грешка
gui_validation_error_plural: "%{count} грешки" gui_validation_error_plural: "%{count} грешки"
field_name: Име field_name: Име
field_description: Описание field_description: Описание
field_summary: Групиран изглед field_summary: Анотация
field_is_required: Задължително field_is_required: Задължително
field_firstname: Име field_firstname: Име
field_lastname: Фамилия field_lastname: Фамилия
@@ -200,6 +241,7 @@ bg:
field_priority: Приоритет field_priority: Приоритет
field_fixed_version: Планувана версия field_fixed_version: Планувана версия
field_user: Потребител field_user: Потребител
field_principal: Principal
field_role: Роля field_role: Роля
field_homepage: Начална страница field_homepage: Начална страница
field_is_public: Публичен field_is_public: Публичен
@@ -243,7 +285,24 @@ bg:
field_assignable: Възможно е възлагане на задачи за тази роля field_assignable: Възможно е възлагане на задачи за тази роля
field_redirect_existing_links: Пренасочване на съществуващи линкове field_redirect_existing_links: Пренасочване на съществуващи линкове
field_estimated_hours: Изчислено време field_estimated_hours: Изчислено време
field_column_names: Колони
field_time_entries: Log time
field_time_zone: Часова зона
field_searchable: С възможност за търсене
field_default_value: Стойност по подразбиране field_default_value: Стойност по подразбиране
field_comments_sorting: Сортиране на коментарите
field_parent_title: Родителска страница
field_editable: Editable
field_watcher: Наблюдател
field_identity_url: OpenID URL
field_content: Съдържание
field_group_by: Групиране на резултатите по
field_sharing: Sharing
field_parent_issue: Родителска задача
field_member_of_group: Член на група
field_assigned_to_role: Assignee's role
field_text: Текстово поле
field_visible: Видим
setting_app_title: Заглавие setting_app_title: Заглавие
setting_app_subtitle: Описание setting_app_subtitle: Описание
@@ -254,26 +313,132 @@ bg:
setting_attachment_max_size: Максимална големина на прикачен файл setting_attachment_max_size: Максимална големина на прикачен файл
setting_issues_export_limit: Максимален брой задачи за експорт setting_issues_export_limit: Максимален брой задачи за експорт
setting_mail_from: E-mail адрес за емисии setting_mail_from: E-mail адрес за емисии
setting_bcc_recipients: Получатели на скрито копие (bcc)
setting_plain_text_mail: само чист текст (без HTML)
setting_host_name: Хост setting_host_name: Хост
setting_text_formatting: Форматиране на текста setting_text_formatting: Форматиране на текста
setting_wiki_compression: Wiki компресиране на историята setting_wiki_compression: Wiki компресиране на историята
setting_feeds_limit: Максимален брой за емисии setting_feeds_limit: Максимален брой за емисии
setting_default_projects_public: Новите проекти са публични по подразбиране
setting_autofetch_changesets: Автоматично обработване на ревизиите setting_autofetch_changesets: Автоматично обработване на ревизиите
setting_sys_api_enabled: Разрешаване на WS за управление setting_sys_api_enabled: Разрешаване на WS за управление
setting_commit_ref_keywords: Отбелязващи ключови думи setting_commit_ref_keywords: Отбелязващи ключови думи
setting_commit_fix_keywords: Приключващи ключови думи setting_commit_fix_keywords: Приключващи ключови думи
setting_autologin: Автоматичен вход setting_autologin: Автоматичен вход
setting_date_format: Формат на датата setting_date_format: Формат на датата
setting_time_format: Формат на часа
setting_cross_project_issue_relations: Релации на задачи между проекти setting_cross_project_issue_relations: Релации на задачи между проекти
setting_issue_list_default_columns: Показвани колони по подразбиране
setting_repositories_encodings: Кодови таблици
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
setting_emails_header: Emails header
setting_emails_footer: Подтекст за e-mail
setting_protocol: Протокол
setting_per_page_options: Опции за страниране
setting_user_format: Потребителски формат
setting_activity_days_default: Брой дни показвани на таб Дейност
setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
setting_enabled_scm: Разрешена SCM
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
setting_mail_handler_api_key: API ключ
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
setting_gravatar_default: Подразбиращо се изображение от Gravatar
setting_diff_max_lines_displayed: Максимален брой показани diff редове
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
setting_openid: Рарешаване на OpenID вход и регистрация
setting_password_min_length: Минимална дължина на парола
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
setting_issue_done_ratio: Изчисление на процента на готови задачи с
setting_issue_done_ratio_issue_field: Използване на поле '% Прогрес'
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
setting_start_of_week: Първи ден на седмицата
setting_rest_api_enabled: Разрешаване на REST web сървис
setting_cache_formatted_text: Cache formatted text
setting_default_notification_option: Подразбиращ се начин за известяване
setting_commit_logtime_enabled: Разрешаване на отчитането на работното време
setting_commit_logtime_activity_id: Дейност при отчитане на работното време
setting_gantt_items_limit: Максимален брой обекти, които да се показват в мрежов график
permission_add_project: Създаване на проект
permission_add_subprojects: Създаване на подпроекти
permission_edit_project: Редактиране на проект
permission_select_project_modules: Избор на проектни модули
permission_manage_members: Управление на членовете (на екип)
permission_manage_project_activities: Управление на дейностите на проекта
permission_manage_versions: Управление на версиите
permission_manage_categories: Управление на категориите
permission_view_issues: Разглеждане на задачите
permission_add_issues: Добавяне на задачи
permission_edit_issues: Редактиране на задачи
permission_manage_issue_relations: Управление на връзките между задачите
permission_add_issue_notes: Добаване на бележки
permission_edit_issue_notes: Редактиране на бележки
permission_edit_own_issue_notes: Редактиране на собствени бележки
permission_move_issues: Преместване на задачи
permission_delete_issues: Изтриване на задачи
permission_manage_public_queries: Управление на публичните заявки
permission_save_queries: Запис на запитвания (queries)
permission_view_gantt: Разглеждане на мрежов график
permission_view_calendar: Разглеждане на календари
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
permission_add_issue_watchers: Добавяне на наблюдатели
permission_delete_issue_watchers: Изтриване на наблюдатели
permission_log_time: Log spent time
permission_view_time_entries: Разглеждане на изразходваното време
permission_edit_time_entries: Редактиране на time logs
permission_edit_own_time_entries: Редактиране на собствените time logs
permission_manage_news: Управление на новини
permission_comment_news: Коментиране на новини
permission_manage_documents: Управление на документи
permission_view_documents: Разглеждане на документи
permission_manage_files: Управление на файлове
permission_view_files: Разглеждане на файлове
permission_manage_wiki: Управление на wiki
permission_rename_wiki_pages: Преименуване на wiki страници
permission_delete_wiki_pages: Изтриване на wiki страници
permission_view_wiki_pages: Разглеждане на wiki
permission_view_wiki_edits: Разглеждане на wiki история
permission_edit_wiki_pages: Редактиране на wiki страници
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове към wiki страници
permission_protect_wiki_pages: Заключване на wiki страници
permission_manage_repository: Управление на хранилища
permission_browse_repository: Разглеждане на хранилища
permission_view_changesets: Разглеждане на changesets
permission_commit_access: Поверяване
permission_manage_boards: Управление на boards
permission_view_messages: Разглеждане на съобщения
permission_add_messages: Публикуване на съобщения
permission_edit_messages: Редактиране на съобщения
permission_edit_own_messages: Редактиране на собствени съобщения
permission_delete_messages: Изтриване на съобщения
permission_delete_own_messages: Изтриване на собствени съобщения
permission_export_wiki_pages: Експорт на wiki страници
permission_manage_subtasks: Управление на подзадачите
project_module_issue_tracking: Тракинг
project_module_time_tracking: Отделяне на време
project_module_news: Новини
project_module_documents: Документи
project_module_files: Файлове
project_module_wiki: Wiki
project_module_repository: Хранилище
project_module_boards: Форуми
project_module_calendar: Календар
project_module_gantt: Мрежов график
label_user: Потребител label_user: Потребител
label_user_plural: Потребители label_user_plural: Потребители
label_user_new: Нов потребител label_user_new: Нов потребител
label_user_anonymous: Анонимен
label_project: Проект label_project: Проект
label_project_new: Нов проект label_project_new: Нов проект
label_project_plural: Проекти label_project_plural: Проекти
label_x_projects: label_x_projects:
zero: 0 проекти zero: 0 проекта
one: 1 проект one: 1 проект
other: "%{count} проекта" other: "%{count} проекта"
label_project_all: Всички проекти label_project_all: Всички проекти
@@ -282,9 +447,13 @@ bg:
label_issue_new: Нова задача label_issue_new: Нова задача
label_issue_plural: Задачи label_issue_plural: Задачи
label_issue_view_all: Всички задачи label_issue_view_all: Всички задачи
label_issues_by: "Задачи по %{value}"
label_issue_added: Добавена задача
label_issue_updated: Обновена задача
label_document: Документ label_document: Документ
label_document_new: Нов документ label_document_new: Нов документ
label_document_plural: Документи label_document_plural: Документи
label_document_added: Добавен документ
label_role: Роля label_role: Роля
label_role_plural: Роли label_role_plural: Роли
label_role_new: Нова роля label_role_new: Нова роля
@@ -311,11 +480,13 @@ bg:
label_information_plural: Информация label_information_plural: Информация
label_please_login: Вход label_please_login: Вход
label_register: Регистрация label_register: Регистрация
label_login_with_open_id_option: или вход чрез OpenID
label_password_lost: Забравена парола label_password_lost: Забравена парола
label_home: Начало label_home: Начало
label_my_page: Лична страница label_my_page: Лична страница
label_my_account: Профил label_my_account: Профил
label_my_projects: Проекти, в които участвам label_my_projects: Проекти, в които участвам
label_my_page_block: Блокове в личната страница
label_administration: Администрация label_administration: Администрация
label_login: Вход label_login: Вход
label_logout: Изход label_logout: Изход
@@ -325,6 +496,8 @@ bg:
label_last_login: Последно свързване label_last_login: Последно свързване
label_registered_on: Регистрация label_registered_on: Регистрация
label_activity: Дейност label_activity: Дейност
label_overall_activity: Цялостна дейност
label_user_activity: "Активност на %{value}"
label_new: Нов label_new: Нов
label_logged_as: Здравейте, label_logged_as: Здравейте,
label_environment: Среда label_environment: Среда
@@ -333,10 +506,13 @@ bg:
label_auth_source_new: Нов начин на оторизация label_auth_source_new: Нов начин на оторизация
label_auth_source_plural: Начини на оторизация label_auth_source_plural: Начини на оторизация
label_subproject_plural: Подпроекти label_subproject_plural: Подпроекти
label_subproject_new: Нов подпроект
label_and_its_subprojects: "%{value} и неговите подпроекти"
label_min_max_length: Минимална - максимална дължина label_min_max_length: Минимална - максимална дължина
label_list: Списък label_list: Списък
label_date: Дата label_date: Дата
label_integer: Целочислен label_integer: Целочислен
label_float: Дробно
label_boolean: Чекбокс label_boolean: Чекбокс
label_string: Текст label_string: Текст
label_text: Дълъг текст label_text: Дълъг текст
@@ -351,6 +527,7 @@ bg:
label_attachment_new: Нов файл label_attachment_new: Нов файл
label_attachment_delete: Изтриване label_attachment_delete: Изтриване
label_attachment_plural: Файлове label_attachment_plural: Файлове
label_file_added: Добавен файл
label_report: Справка label_report: Справка
label_report_plural: Справки label_report_plural: Справки
label_news: Новини label_news: Новини
@@ -358,11 +535,13 @@ bg:
label_news_plural: Новини label_news_plural: Новини
label_news_latest: Последни новини label_news_latest: Последни новини
label_news_view_all: Виж всички label_news_view_all: Виж всички
label_news_added: Добавена новина
label_settings: Настройки label_settings: Настройки
label_overview: Общ изглед label_overview: Общ изглед
label_version: Версия label_version: Версия
label_version_new: Нова версия label_version_new: Нова версия
label_version_plural: Версии label_version_plural: Версии
label_close_versions: Затваряне на завършените версии
label_confirmation: Одобрение label_confirmation: Одобрение
label_export_to: Експорт към label_export_to: Експорт към
label_read: Read... label_read: Read...
@@ -389,6 +568,7 @@ bg:
label_new_statuses_allowed: Позволени състояния label_new_statuses_allowed: Позволени състояния
label_all: всички label_all: всички
label_none: никакви label_none: никакви
label_nobody: никой
label_next: Следващ label_next: Следващ
label_previous: Предишен label_previous: Предишен
label_used_by: Използва се от label_used_by: Използва се от
@@ -420,9 +600,19 @@ bg:
label_not_equals: не е label_not_equals: не е
label_in_less_than: след по-малко от label_in_less_than: след по-малко от
label_in_more_than: след повече от label_in_more_than: след повече от
label_greater_or_equal: ">="
label_less_or_equal: <=
label_in: в следващите label_in: в следващите
label_today: днес label_today: днес
label_all_time: всички
label_yesterday: вчера
label_this_week: тази седмица label_this_week: тази седмица
label_last_week: последната седмица
label_last_n_days: "последните %{count} дни"
label_this_month: текущия месец
label_last_month: последния месец
label_this_year: текущата година
label_date_range: Период
label_less_than_ago: преди по-малко от label_less_than_ago: преди по-малко от
label_more_than_ago: преди повече от label_more_than_ago: преди повече от
label_ago: преди label_ago: преди
@@ -430,17 +620,25 @@ bg:
label_not_contains: не съдържа label_not_contains: не съдържа
label_day_plural: дни label_day_plural: дни
label_repository: Хранилище label_repository: Хранилище
label_repository_plural: Хранилища
label_browse: Разглеждане label_browse: Разглеждане
label_modification: "%{count} промяна" label_modification: "%{count} промяна"
label_modification_plural: "%{count} промени" label_modification_plural: "%{count} промени"
label_branch: работен вариант
label_tag: Версия
label_revision: Ревизия label_revision: Ревизия
label_revision_plural: Ревизии label_revision_plural: Ревизии
label_revision_id: Ревизия %{value}
label_associated_revisions: Асоциирани ревизии
label_added: добавено label_added: добавено
label_modified: променено label_modified: променено
label_copied: копирано
label_renamed: преименувано
label_deleted: изтрито label_deleted: изтрито
label_latest_revision: Последна ревизия label_latest_revision: Последна ревизия
label_latest_revision_plural: Последни ревизии label_latest_revision_plural: Последни ревизии
label_view_revisions: Виж ревизиите label_view_revisions: Виж ревизиите
label_view_all_revisions: Разглеждане на всички ревизии
label_max_size: Максимална големина label_max_size: Максимална големина
label_sort_highest: Премести най-горе label_sort_highest: Премести най-горе
label_sort_higher: Премести по-горе label_sort_higher: Премести по-горе
@@ -466,6 +664,7 @@ bg:
label_changes_details: Подробни промени label_changes_details: Подробни промени
label_issue_tracking: Тракинг label_issue_tracking: Тракинг
label_spent_time: Отделено време label_spent_time: Отделено време
label_overall_spent_time: Общо употребено време
label_f_hour: "%{value} час" label_f_hour: "%{value} час"
label_f_hour_plural: "%{value} часа" label_f_hour_plural: "%{value} часа"
label_time_tracking: Отделяне на време label_time_tracking: Отделяне на време
@@ -487,6 +686,7 @@ bg:
label_relation_delete: Изтриване на релация label_relation_delete: Изтриване на релация
label_relates_to: свързана със label_relates_to: свързана със
label_duplicates: дублира label_duplicates: дублира
label_duplicated_by: дублирана от
label_blocks: блокира label_blocks: блокира
label_blocked_by: блокирана от label_blocked_by: блокирана от
label_precedes: предшества label_precedes: предшества
@@ -502,10 +702,13 @@ bg:
label_board: Форум label_board: Форум
label_board_new: Нов форум label_board_new: Нов форум
label_board_plural: Форуми label_board_plural: Форуми
label_board_locked: Заключена
label_board_sticky: Sticky
label_topic_plural: Теми label_topic_plural: Теми
label_message_plural: Съобщения label_message_plural: Съобщения
label_message_last: Последно съобщение label_message_last: Последно съобщение
label_message_new: Нова тема label_message_new: Нова тема
label_message_posted: Добавено съобщение
label_reply_plural: Отговори label_reply_plural: Отговори
label_send_information: Изпращане на информацията до потребителя label_send_information: Изпращане на информацията до потребителя
label_year: Година label_year: Година
@@ -516,12 +719,81 @@ bg:
label_language_based: В зависимост от езика label_language_based: В зависимост от езика
label_sort_by: "Сортиране по %{value}" label_sort_by: "Сортиране по %{value}"
label_send_test_email: Изпращане на тестов e-mail label_send_test_email: Изпращане на тестов e-mail
label_feeds_access_key: RSS access ключ
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
label_feeds_access_key_created_on: "%{value} от създаването на RSS ключа" label_feeds_access_key_created_on: "%{value} от създаването на RSS ключа"
label_module_plural: Модули label_module_plural: Модули
label_added_time_by: "Публикувана от %{author} преди %{age}" label_added_time_by: "Публикувана от %{author} преди %{age}"
label_updated_time_by: "Обновена от %{author} преди %{age}"
label_updated_time: "Обновена преди %{value}" label_updated_time: "Обновена преди %{value}"
label_jump_to_a_project: Проект... label_jump_to_a_project: Проект...
label_file_plural: Файлове
label_changeset_plural: Ревизии
label_default_columns: По подразбиране
label_no_change_option: (Без промяна)
label_bulk_edit_selected_issues: Редактиране на задачи
label_theme: Тема
label_default: По подразбиране
label_search_titles_only: Само в заглавията
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
label_user_mail_option_selected: "За всички събития само в избраните проекти..."
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
label_user_mail_option_only_my_events: Само за неща, в които съм включен/а
label_user_mail_option_only_assigned: Само за неща, назначени на мен
label_user_mail_option_only_owner: Само за неща, на които аз съм собственик
label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени"
label_registration_activation_by_email: активиране на профила по email
label_registration_manual_activation: ръчно активиране
label_registration_automatic_activation: автоматично активиране
label_display_per_page: "На страница по: %{value}"
label_age: Възраст
label_change_properties: Промяна на настройки
label_general: Основни
label_more: Още
label_scm: SCM (Система за контрол на версиите)
label_plugins: Плъгини
label_ldap_authentication: LDAP оторизация
label_downloads_abbr: D/L
label_optional_description: Незадължително описание
label_add_another_file: Добавяне на друг файл
label_preferences: Предпочитания
label_chronological_order: Хронологичен ред
label_reverse_chronological_order: Обратен хронологичен ред
label_planning: Планиране
label_incoming_emails: Входящи e-mail-и
label_generate_key: Генериране на ключ
label_issue_watchers: Наблюдатели
label_example: Пример
label_display: Display
label_sort: Сортиране
label_ascending: Нарастващ
label_descending: Намаляващ
label_date_from_to: От %{start} до %{end}
label_wiki_content_added: Wiki страница беше добавена
label_wiki_content_updated: Wiki страница беше обновена
label_group: Група
label_group_plural: Групи
label_group_new: Нова група
label_time_entry_plural: Използвано време
label_version_sharing_none: Не споделен
label_version_sharing_descendants: С подпроекти
label_version_sharing_hierarchy: С проектна йерархия
label_version_sharing_tree: С дърво на проектите
label_version_sharing_system: С всички проекти
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
label_copy_source: Източник
label_copy_target: Цел
label_copy_same_as_target: Също като целта
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
label_api_access_key: API ключ за достъп
label_missing_api_access_key: Липсващ API ключ
label_api_access_key_created_on: API ключ за достъп е създаден преди %{value}
label_profile: Профил
label_subtask_plural: Подзадачи
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
label_principal_search: "Търсене на потребител или група:"
label_user_search: "Търсене на потребител:"
button_login: Вход button_login: Вход
button_submit: Прикачване button_submit: Прикачване
button_save: Запис button_save: Запис
@@ -529,8 +801,10 @@ bg:
button_uncheck_all: Изчистване на всички button_uncheck_all: Изчистване на всички
button_delete: Изтриване button_delete: Изтриване
button_create: Създаване button_create: Създаване
button_create_and_continue: Създаване и продължаване
button_test: Тест button_test: Тест
button_edit: Редакция button_edit: Редакция
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: %{page_title}"
button_add: Добавяне button_add: Добавяне
button_change: Промяна button_change: Промяна
button_apply: Приложи button_apply: Приложи
@@ -541,6 +815,7 @@ bg:
button_list: Списък button_list: Списък
button_view: Преглед button_view: Преглед
button_move: Преместване button_move: Преместване
button_move_and_follow: Преместване и продължаване
button_back: Назад button_back: Назад
button_cancel: Отказ button_cancel: Отказ
button_activate: Активация button_activate: Активация
@@ -554,26 +829,49 @@ bg:
button_unarchive: Разархивиране button_unarchive: Разархивиране
button_reset: Генериране наново button_reset: Генериране наново
button_rename: Преименуване button_rename: Преименуване
button_change_password: Промяна на парола
button_copy: Копиране
button_copy_and_follow: Копиране и продължаване
button_annotate: Анотация
button_update: Обновяване
button_configure: Конфигуриране
button_quote: Цитат
button_duplicate: Дублиране
button_show: Показване
status_active: активен status_active: активен
status_registered: регистриран status_registered: регистриран
status_locked: заключен status_locked: заключен
version_status_open: отворена
version_status_locked: заключена
version_status_closed: затворена
field_active: Активен
text_select_mail_notifications: Изберете събития за изпращане на e-mail. text_select_mail_notifications: Изберете събития за изпращане на e-mail.
text_regexp_info: пр. ^[A-Z0-9]+$ text_regexp_info: пр. ^[A-Z0-9]+$
text_min_max_length_info: 0 - без ограничения text_min_max_length_info: 0 - без ограничения
text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него? text_project_destroy_confirmation: Сигурни ли сте, че искате да изтриете проекта и данните в него?
text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити."
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте? text_are_you_sure: Сигурни ли сте?
text_tip_task_begin_day: задача започваща този ден text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
text_tip_task_end_day: задача завършваща този ден text_journal_changed: "%{label} променен от %{old} на %{new}"
text_tip_task_begin_end_day: задача започваща и завършваща този ден text_journal_set_to: "%{label} установен на %{value}"
text_journal_deleted: "%{label} изтрит (%{old})"
text_journal_added: "Добавено %{label} %{value}"
text_tip_issue_begin_day: задача, започваща този ден
text_tip_issue_end_day: задача, завършваща този ден
text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.' text_project_identifier_info: 'Позволени са малки букви (a-z), цифри и тирета.<br />Невъзможна промяна след запис.'
text_caracters_maximum: "До %{count} символа." text_caracters_maximum: "До %{count} символа."
text_caracters_minimum: "Минимум %{count} символа."
text_length_between: "От %{min} до %{max} символа." text_length_between: "От %{min} до %{max} символа."
text_tracker_no_workflow: Няма дефиниран работен процес за този тракер text_tracker_no_workflow: Няма дефиниран работен процес за този тракер
text_unallowed_characters: Непозволени символи text_unallowed_characters: Непозволени символи
text_comma_separated: Позволено е изброяване (с разделител запетая). text_comma_separated: Позволено е изброяване (с разделител запетая).
text_line_separated: Позволени са много стойности (по едно на ред).
text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии text_issues_ref_in_commit_messages: Отбелязване и приключване на задачи от ревизии
text_issue_added: "Публикувана е нова задача с номер %{id} (от %{author})." text_issue_added: "Публикувана е нова задача с номер %{id} (от %{author})."
text_issue_updated: "Задача %{id} е обновена (от %{author})." text_issue_updated: "Задача %{id} е обновена (от %{author})."
@@ -581,7 +879,36 @@ bg:
text_issue_category_destroy_question: "Има задачи (%{count}) обвързани с тази категория. Какво ще изберете?" text_issue_category_destroy_question: "Има задачи (%{count}) обвързани с тази категория. Какво ще изберете?"
text_issue_category_destroy_assignments: Премахване на връзките с категорията text_issue_category_destroy_assignments: Премахване на връзките с категорията
text_issue_category_reassign_to: Преобвързване с категория text_issue_category_reassign_to: Преобвързване с категория
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
text_load_default_configuration: Зареждане на примерна информация
text_status_changed_by_changeset: "Приложено с ревизия %{value}."
text_time_logged_by_changeset: Приложено в ревизия %{value}.
text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?'
text_select_project_modules: 'Изберете активните модули за този проект:'
text_default_administrator_account_changed: Сменен фабричния администраторски профил
text_file_repository_writable: Възможност за писане в хранилището с файлове
text_plugin_assets_writable: Папката на приставките е разрешена за запис
text_rmagick_available: Наличен RMagick (по избор)
text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?"
text_destroy_time_entries: Изтриване на отделеното време
text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект
text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:'
text_user_wrote: "%{value} написа:"
text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност."
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
text_repository_usernames_mapping: "Изберете или променете потребителите в Redmine, съответстващи на потребителите в дневника на хранилището (repository).\nПотребителите с еднакви имена в Redmine и хранилищата се съвместяват автоматично."
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
text_custom_field_possible_values_info: 'Една стойност на ред'
text_wiki_page_destroy_question: Тази страница има %{descendants} страници деца и descendant(s). Какво желаете да правите?
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?"
text_zoom_in: Увеличаване
text_zoom_out: Намаляване
default_role_manager: Мениджър default_role_manager: Мениджър
default_role_developer: Разработчик default_role_developer: Разработчик
default_role_reporter: Публикуващ default_role_reporter: Публикуващ
@@ -603,332 +930,9 @@ bg:
default_priority_immediate: Веднага default_priority_immediate: Веднага
default_activity_design: Дизайн default_activity_design: Дизайн
default_activity_development: Разработка default_activity_development: Разработка
enumeration_issue_priorities: Приоритети на задачи enumeration_issue_priorities: Приоритети на задачи
enumeration_doc_categories: Категории документи enumeration_doc_categories: Категории документи
enumeration_activities: Дейности (time tracking) enumeration_activities: Дейности (time tracking)
label_file_plural: Файлове
label_changeset_plural: Ревизии
field_column_names: Колони
label_default_columns: По подразбиране
setting_issue_list_default_columns: Показвани колони по подразбиране
setting_repositories_encodings: Кодови таблици
notice_no_issue_selected: "Няма избрани задачи."
label_bulk_edit_selected_issues: Редактиране на задачи
label_no_change_option: (Без промяна)
notice_failed_to_save_issues: "Неуспешен запис на %{count} задачи от %{total} избрани: %{ids}."
label_theme: Тема
label_default: По подразбиране
label_search_titles_only: Само в заглавията
label_nobody: никой
button_change_password: Промяна на парола
text_user_mail_option: "За неизбраните проекти, ще получавате известия само за наблюдавани дейности или в които участвате (т.е. автор или назначени на мен)."
label_user_mail_option_selected: "За всички събития само в избраните проекти..."
label_user_mail_option_all: "За всяко събитие в проектите, в които участвам"
label_user_mail_option_none: "Само за наблюдавани или в които участвам (автор или назначени на мен)"
setting_emails_footer: Подтекст за e-mail
label_float: Дробно
button_copy: Копиране
mail_body_account_information_external: "Можете да използвате вашия %{value} профил за вход."
mail_body_account_information: Информацията за профила ви
setting_protocol: Протокол
label_user_mail_no_self_notified: "Не искам известия за извършени от мен промени"
setting_time_format: Формат на часа
label_registration_activation_by_email: активиране на профила по email
mail_subject_account_activation_request: "Заявка за активиране на профил в %{value}"
mail_body_account_activation_request: "Има новорегистриран потребител (%{value}), очакващ вашето одобрение:"
label_registration_automatic_activation: автоматично активиране
label_registration_manual_activation: ръчно активиране
notice_account_pending: "Профилът Ви е създаден и очаква одобрение от администратор."
field_time_zone: Часова зона
text_caracters_minimum: "Минимум %{count} символа."
setting_bcc_recipients: Получатели на скрито копие (bcc)
button_annotate: Анотация
label_issues_by: "Задачи по %{value}"
field_searchable: С възможност за търсене
label_display_per_page: "На страница по: %{value}"
setting_per_page_options: Опции за страниране
label_age: Възраст
notice_default_data_loaded: Примерната информацията е успешно заредена.
text_load_default_configuration: Зареждане на примерна информация
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: %{value}"
button_update: Обновяване
label_change_properties: Промяна на настройки
label_general: Основни
label_repository_plural: Хранилища
label_associated_revisions: Асоциирани ревизии
setting_user_format: Потребителски формат
text_status_changed_by_changeset: "Приложено с ревизия %{value}."
label_more: Още
text_issues_destroy_confirmation: 'Сигурни ли сте, че искате да изтриете избраните задачи?'
label_scm: SCM (Система за контрол на кода)
text_select_project_modules: 'Изберете активните модули за този проект:'
label_issue_added: Добавена задача
label_issue_updated: Обновена задача
label_document_added: Добавен документ
label_message_posted: Добавено съобщение
label_file_added: Добавен файл
label_news_added: Добавена новина
project_module_boards: Форуми
project_module_issue_tracking: Тракинг
project_module_wiki: Wiki
project_module_files: Файлове
project_module_documents: Документи
project_module_repository: Хранилище
project_module_news: Новини
project_module_time_tracking: Отделяне на време
text_file_repository_writable: Възможност за писане в хранилището с файлове
text_default_administrator_account_changed: Сменен фабричния администраторски профил
text_rmagick_available: Наличен RMagick (по избор)
button_configure: Конфигуриране
label_plugins: Плъгини
label_ldap_authentication: LDAP оторизация
label_downloads_abbr: D/L
label_this_month: текущия месец
label_last_n_days: "последните %{count} дни"
label_all_time: всички
label_this_year: текущата година
label_date_range: Период
label_last_week: последната седмица
label_yesterday: вчера
label_last_month: последния месец
label_add_another_file: Добавяне на друг файл
label_optional_description: Незадължително описание
text_destroy_time_entries_question: "%{hours} часа са отделени на задачите, които искате да изтриете. Какво избирате?"
error_issue_not_found_in_project: 'Задачата не е намерена или не принадлежи на този проект'
text_assign_time_entries_to_project: Прехвърляне на отделеното време към проект
text_destroy_time_entries: Изтриване на отделеното време
text_reassign_time_entries: 'Прехвърляне на отделеното време към задача:'
setting_activity_days_default: Брой дни показвани на таб Дейност
label_chronological_order: Хронологичен ред
field_comments_sorting: Сортиране на коментарите
label_reverse_chronological_order: Обратен хронологичен ред
label_preferences: Предпочитания
setting_display_subprojects_issues: Показване на подпроектите в проектите по подразбиране
label_overall_activity: Цялостна дейност
setting_default_projects_public: Новите проекти са публични по подразбиране
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
label_planning: Планиране
text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити."
label_and_its_subprojects: "%{value} и неговите подпроекти"
mail_body_reminder: "%{count} задачи, назначени на вас са с краен срок в следващите %{days} дни:"
mail_subject_reminder: "%{count} задачи с краен срок с следващите %{days} дни"
text_user_wrote: "%{value} написа:"
label_duplicated_by: дублирана от
setting_enabled_scm: Разрешена SCM
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
text_enumeration_destroy_question: "%{count} обекта са свързани с тази стойност."
label_incoming_emails: Входящи e-mail-и
label_generate_key: Генериране на ключ
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
setting_mail_handler_api_key: API ключ
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
field_parent_title: Родителска страница
label_issue_watchers: Наблюдатели
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
button_quote: Цитат
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
notice_unable_delete_version: Невъзможност за изтриване на версия
label_renamed: преименуван
label_copied: копиран
setting_plain_text_mail: само чист текст (без HTML)
permission_view_files: Разглеждане на файлове
permission_edit_issues: Редактиране на задачи
permission_edit_own_time_entries: Редактиране на собствените time logs
permission_manage_public_queries: Управление на публичните заявки
permission_add_issues: Добавяне на задачи
permission_log_time: Log spent time
permission_view_changesets: Разглеждане на changesets
permission_view_time_entries: Разглеждане на изразходваното време
permission_manage_versions: Управление на версиите
permission_manage_wiki: Управление на wiki
permission_manage_categories: Управление на категориите задачи
permission_protect_wiki_pages: Заключване на wiki страници
permission_comment_news: Коментиране на новини
permission_delete_messages: Изтриване на съобщения
permission_select_project_modules: Избор на проектни модули
permission_manage_documents: Управление на документи
permission_edit_wiki_pages: Редактиране на wiki страници
permission_add_issue_watchers: Добавяне на наблюдатели
permission_view_gantt: Разглеждане на мрежов график
permission_move_issues: Преместване на задачи
permission_manage_issue_relations: Управление на връзките между задачите
permission_delete_wiki_pages: Изтриване на wiki страници
permission_manage_boards: Управление на boards
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове
permission_view_wiki_edits: Разглеждане на wiki история
permission_add_messages: Публикуване на съобщения
permission_view_messages: Разглеждане на съобщения
permission_manage_files: Управление на файлове
permission_edit_issue_notes: Редактиране на бележки
permission_manage_news: Управление на новини
permission_view_calendar: Разглеждане на календари
permission_manage_members: Управление на членовете (на екип)
permission_edit_messages: Редактиране на съобщения
permission_delete_issues: Изтриване на задачи
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
permission_manage_repository: Управление на хранилища
permission_commit_access: Поверяване
permission_browse_repository: Разглеждане на хранилища
permission_view_documents: Разглеждане на документи
permission_edit_project: Редактиране на проект
permission_add_issue_notes: Добаване на бележки
permission_save_queries: Запис на запитвания (queries)
permission_view_wiki_pages: Разглеждане на wiki
permission_rename_wiki_pages: Преименуване на wiki страници
permission_edit_time_entries: Редактиране на time logs
permission_edit_own_issue_notes: Редактиране на собствени бележки
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
label_example: Пример
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: Редактиране на собствени съобщения
permission_delete_own_messages: Изтриване на собствени съобщения
label_user_activity: "Активност на %{value}"
label_updated_time_by: "Обновена от %{author} преди %{age}"
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
setting_diff_max_lines_displayed: Максимален брой показани diff редове
text_plugin_assets_writable: Папката на приставките е разрешена за запис
warning_attachments_not_saved: "%{count} файла не бяха записани."
button_create_and_continue: Създаване и продължаване
text_custom_field_possible_values_info: 'Една стойност на ред'
label_display: Display
field_editable: Editable
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
field_watcher: Наблюдател
setting_openid: Рарешаване на OpenID вход и регистрация
field_identity_url: OpenID URL
label_login_with_open_id_option: или вход чрез OpenID
field_content: Съдържание
label_descending: Намаляващ
label_sort: Сортиране
label_ascending: Нарастващ
label_date_from_to: От %{start} до %{end}
label_greater_or_equal: ">="
label_less_or_equal: <=
text_wiki_page_destroy_question: Тази страница има %{descendants} страници деца и descendant(s). Какво желаете да правите?
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
setting_password_min_length: Минимална дължина на парола
field_group_by: Групиране на резултатите по
mail_subject_wiki_content_updated: "Wiki страницата '%{id}' не беше обновена"
label_wiki_content_added: Wiki страница беше добавена
mail_subject_wiki_content_added: "Wiki страницата '%{id}' беше добавена"
mail_body_wiki_content_added: Wiki страницата '%{id}' беше добавена от %{author}.
label_wiki_content_updated: Wiki страница беше обновена
mail_body_wiki_content_updated: Wiki страницата '%{id}' беше обновена от %{author}.
permission_add_project: Създаване на проект
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
label_view_all_revisions: Разглеждане на всички ревизии
label_tag: Версия
label_branch: работен вариант
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
error_no_default_issue_status: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
text_journal_changed: "%{label} променен от %{old} на %{new}"
text_journal_set_to: "%{label} установен на %{value}"
text_journal_deleted: "%{label} изтрит (%{old})"
label_group_plural: Групи
label_group: Група
label_group_new: Нова група
label_time_entry_plural: Използвано време
text_journal_added: "Добавено %{label} %{value}"
field_active: Активен
enumeration_system_activity: Системна активност enumeration_system_activity: Системна активност
permission_delete_issue_watchers: Изтриване на наблюдатели
version_status_closed: затворена
version_status_locked: заключена
version_status_open: отворена
error_can_not_reopen_issue_on_closed_version: Задача, асоциирана със затворена версия не може да бъде отворена отново
label_user_anonymous: Анонимен
button_move_and_follow: Преместване и продължаване
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
setting_gravatar_default: Подразбиращо се изображение от Gravatar
field_sharing: Sharing
label_version_sharing_hierarchy: С проектна йерархия
label_version_sharing_system: С всички проекти
label_version_sharing_descendants: С подпроекти
label_version_sharing_tree: С дърво на проектите
label_version_sharing_none: Не споделен
error_can_not_archive_project: Този проект не може да бъде архивиран
button_duplicate: Дублиране
button_copy_and_follow: Копиране и продължаване
label_copy_source: Източник
setting_issue_done_ratio: Изчисление на процента на готови задачи с
setting_issue_done_ratio_issue_status: Използване на състоянието на задачите
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
setting_issue_done_ratio_issue_field: Използване на поле 'задача'
label_copy_same_as_target: Също като целта
label_copy_target: Цел
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
error_workflow_copy_source: Моля изберете source тракер или роля
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
setting_start_of_week: Първи ден на седмицата
permission_view_issues: Разглеждане на задачите
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
label_revision_id: Ревизия %{value}
label_api_access_key: API ключ за достъп
label_api_access_key_created_on: API ключ за достъп е създаден преди %{value}
label_feeds_access_key: RSS access ключ
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
setting_rest_api_enabled: Разрешаване на REST web сървис
label_missing_api_access_key: Липсващ API ключ
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
button_show: Показване
text_line_separated: Позволени са много стойности (по едно на ред).
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
permission_add_subprojects: Създаване на подпроекти
label_subproject_new: Нов подпроект
text_own_membership_delete_confirmation: |-
Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това на да не можете да редатирате този проект.
Сигурен ли сте, че искате да продължите?
label_close_versions: Затваряне на завършените версии
label_board_sticky: Sticky
label_board_locked: Заключена
permission_export_wiki_pages: Експорт на wiki страници
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Управление на дейностите на проекта
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
label_profile: Профил
permission_manage_subtasks: Управление на подзадачите
field_parent_issue: Родителска задача
label_subtask_plural: Подзадачи
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
error_unable_to_connect: Невъзможност за свързване с (%{value})
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
field_principal: Principal
label_my_page_block: Блокове в личната страница
notice_failed_to_save_members: "Невъзможност за запис на член(ове): %{errors}."
text_zoom_out: Намаляване
text_zoom_in: Увеличаване
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
label_overall_spent_time: Общо употребено време
field_time_entries: Log time
notice_not_authorized_archived_project: Проектът, който се опитвате да видите е архивиран.
text_tip_issue_end_day: задача, завършваща този ден
field_text: Текстово поле
label_user_mail_option_only_owner: Само за неща, на които аз съм собственик
field_member_of_group: Член на група
project_module_gantt: Мрежов график
text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
text_tip_issue_begin_end_day: задача, започваща и завършваща този ден
setting_default_notification_option: Подразбиращ се начин за известяване
project_module_calendar: Календар
label_user_mail_option_only_my_events: Само за неща, в които съм включен/а
text_tip_issue_begin_day: задача, започваща този ден
label_user_mail_option_only_assigned: Само за неща, назначени на мен
button_edit_associated_wikipage: "Редактиране на асоциираната Wiki страница: %{page_title}"
field_assigned_to_role: Assignee's role
label_principal_search: "Търсене на потребител или група:"
label_user_search: "Търсене на потребител:"
field_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
+1 -1
View File
@@ -546,7 +546,7 @@ cs:
label_relation_delete: Odstranit souvislost label_relation_delete: Odstranit souvislost
label_relates_to: související s label_relates_to: související s
label_duplicates: duplicity label_duplicates: duplicity
label_blocks: bloků label_blocks: blokuje
label_blocked_by: zablokován label_blocked_by: zablokován
label_precedes: předchází label_precedes: předchází
label_follows: následuje label_follows: následuje
+17 -17
View File
@@ -858,6 +858,7 @@ de:
text_subprojects_destroy_warning: "Dessen Unterprojekte (%{value}) werden ebenfalls gelöscht." text_subprojects_destroy_warning: "Dessen Unterprojekte (%{value}) werden ebenfalls gelöscht."
text_workflow_edit: Workflow zum Bearbeiten auswählen text_workflow_edit: Workflow zum Bearbeiten auswählen
text_are_you_sure: Sind Sie sicher? text_are_you_sure: Sind Sie sicher?
text_are_you_sure_with_children: "Lösche Aufgabe und alle Unteraufgaben?"
text_journal_changed: "%{label} wurde von %{old} zu %{new} geändert" text_journal_changed: "%{label} wurde von %{old} zu %{new} geändert"
text_journal_set_to: "%{label} wurde auf %{value} gesetzt" text_journal_set_to: "%{label} wurde auf %{value} gesetzt"
text_journal_deleted: "%{label} %{old} wurde gelöscht" text_journal_deleted: "%{label} %{old} wurde gelöscht"
@@ -936,20 +937,19 @@ de:
enumeration_activities: Aktivitäten (Zeiterfassung) enumeration_activities: Aktivitäten (Zeiterfassung)
enumeration_system_activity: System-Aktivität enumeration_system_activity: System-Aktivität
text_are_you_sure_with_children: Delete issue and all child issues? field_text: Textfeld
field_text: Text field label_user_mail_option_only_owner: Nur für Aufgaben die ich angelegt habe
label_user_mail_option_only_owner: Only for things I am the owner of setting_default_notification_option: Standard Benachrichtigungsoptionen
setting_default_notification_option: Default notification option label_user_mail_option_only_my_events: Nur für Aufgaben die ich beobachte oder an welchen ich mitarbeite
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_assigned: Nur für Aufgaben für die ich zuständig bin.
label_user_mail_option_only_assigned: Only for things I am assigned to notice_not_authorized_archived_project: Das Projekt wurde archiviert und ist daher nicht nicht verfügbar.
notice_not_authorized_archived_project: The project you're trying to access has been archived. label_user_mail_option_none: keine Ereignisse
label_user_mail_option_none: No events field_member_of_group: Zuständigkeitsgruppe
field_member_of_group: Assignee's group field_assigned_to_role: Zuständigkeitsrolle
field_assigned_to_role: Assignee's role field_visible: Sichtbar
field_visible: Visible setting_emails_header: Emailkopf
setting_emails_header: Emails header setting_commit_logtime_activity_id: Aktivität für die Zeiterfassung
setting_commit_logtime_activity_id: Activity for logged time text_time_logged_by_changeset: Angewendet in Changeset %{value}.
text_time_logged_by_changeset: Applied in changeset %{value}. setting_commit_logtime_enabled: Aktiviere Zeitlogging
setting_commit_logtime_enabled: Enable time logging notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max})
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: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden.
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+12 -9
View File
@@ -166,10 +166,10 @@ fr:
notice_successful_create: Création effectuée avec succès. notice_successful_create: Création effectuée avec succès.
notice_successful_update: Mise à jour effectuée avec succès. notice_successful_update: Mise à jour effectuée avec succès.
notice_successful_delete: Suppression effectuée avec succès. notice_successful_delete: Suppression effectuée avec succès.
notice_successful_connection: Connection réussie. notice_successful_connection: Connexion réussie.
notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée." notice_file_not_found: "La page à laquelle vous souhaitez accéder n'existe pas ou a été supprimée."
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible. notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
notice_not_authorized: "Vous n'êtes pas autorisés à accéder à cette page." notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page."
notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé. notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé.
notice_email_sent: "Un email a été envoyé à %{value}" notice_email_sent: "Un email a été envoyé à %{value}"
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})" notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
@@ -323,11 +323,11 @@ fr:
setting_text_formatting: Formatage du texte setting_text_formatting: Formatage du texte
setting_wiki_compression: Compression historique wiki setting_wiki_compression: Compression historique wiki
setting_feeds_limit: Limite du contenu des flux RSS setting_feeds_limit: Limite du contenu des flux RSS
setting_default_projects_public: Définir les nouveaux projects comme publics par défaut setting_default_projects_public: Définir les nouveaux projets comme publics par défaut
setting_autofetch_changesets: Récupération auto. des commits setting_autofetch_changesets: Récupération auto. des commits
setting_sys_api_enabled: Activer les WS pour la gestion des dépôts setting_sys_api_enabled: Activer les WS pour la gestion des dépôts
setting_commit_ref_keywords: Mot-clés de référencement setting_commit_ref_keywords: Mots-clés de référencement
setting_commit_fix_keywords: Mot-clés de résolution setting_commit_fix_keywords: Mots-clés de résolution
setting_autologin: Autologin setting_autologin: Autologin
setting_date_format: Format de date setting_date_format: Format de date
setting_time_format: Format d'heure setting_time_format: Format d'heure
@@ -349,7 +349,7 @@ fr:
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne setting_file_max_size_displayed: Taille maximum des fichiers texte affichés en ligne
setting_repository_log_display_limit: "Nombre maximum de revisions affichées sur l'historique d'un fichier" setting_repository_log_display_limit: "Nombre maximum de révisions affichées sur l'historique d'un fichier"
setting_openid: "Autoriser l'authentification et l'enregistrement OpenID" setting_openid: "Autoriser l'authentification et l'enregistrement OpenID"
setting_password_min_length: Longueur minimum des mots de passe setting_password_min_length: Longueur minimum des mots de passe
setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet setting_new_project_user_role_id: Rôle donné à un utilisateur non-administrateur qui crée un projet
@@ -369,7 +369,7 @@ fr:
permission_add_subprojects: Créer des sous-projets permission_add_subprojects: Créer des sous-projets
permission_edit_project: Modifier le projet permission_edit_project: Modifier le projet
permission_select_project_modules: Choisir les modules permission_select_project_modules: Choisir les modules
permission_manage_members: Gérer les members permission_manage_members: Gérer les membres
permission_manage_versions: Gérer les versions permission_manage_versions: Gérer les versions
permission_manage_categories: Gérer les catégories de demandes permission_manage_categories: Gérer les catégories de demandes
permission_view_issues: Voir les demandes permission_view_issues: Voir les demandes
@@ -449,6 +449,9 @@ fr:
label_issue_view_all: Voir toutes les demandes label_issue_view_all: Voir toutes les demandes
label_issue_added: Demande ajoutée label_issue_added: Demande ajoutée
label_issue_updated: Demande mise à jour label_issue_updated: Demande mise à jour
label_issue_note_added: Note ajoutée
label_issue_status_updated: Statut changé
label_issue_priority_updated: Priorité changée
label_issues_by: "Demandes par %{value}" label_issues_by: "Demandes par %{value}"
label_document: Document label_document: Document
label_document_new: Nouveau document label_document_new: Nouveau document
@@ -486,7 +489,7 @@ fr:
label_my_page: Ma page label_my_page: Ma page
label_my_account: Mon compte label_my_account: Mon compte
label_my_projects: Mes projets label_my_projects: Mes projets
label_my_page_block: Ma page bloque label_my_page_block: Blocs disponibles
label_administration: Administration label_administration: Administration
label_login: Connexion label_login: Connexion
label_logout: Déconnexion label_logout: Déconnexion
@@ -856,7 +859,7 @@ fr:
text_issue_added: "La demande %{id} a été soumise par %{author}." text_issue_added: "La demande %{id} a été soumise par %{author}."
text_issue_updated: "La demande %{id} a été mise à jour par %{author}." text_issue_updated: "La demande %{id} a été mise à jour par %{author}."
text_wiki_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce wiki et tout son contenu ? text_wiki_destroy_confirmation: Etes-vous sûr de vouloir supprimer ce wiki et tout son contenu ?
text_issue_category_destroy_question: "%{count} demandes sont affectées à cette catégories. Que voulez-vous faire ?" text_issue_category_destroy_question: "%{count} demandes sont affectées à cette catégorie. Que voulez-vous faire ?"
text_issue_category_destroy_assignments: N'affecter les demandes à aucune autre catégorie text_issue_category_destroy_assignments: N'affecter les demandes à aucune autre catégorie
text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie text_issue_category_reassign_to: Réaffecter les demandes à cette catégorie
text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)." text_user_mail_option: "Pour les projets non sélectionnés, vous recevrez seulement des notifications pour ce que vous surveillez ou à quoi vous participez (exemple: demandes dont vous êtes l'auteur ou la personne assignée)."
+27 -26
View File
@@ -1,6 +1,7 @@
# Italian translations for Ruby on Rails # Italian translations for Ruby on Rails
# by Claudio Poli (masterkain@gmail.com) # by Claudio Poli (masterkain@gmail.com)
# by Diego Pierotto (ita.translations@tiscali.it) # by Diego Pierotto (ita.translations@tiscali.it)
# by Emidio Stani (emidiostani@gmail.com)
it: it:
direction: ltr direction: ltr
@@ -126,7 +127,7 @@ it:
greater_than_start_date: "deve essere maggiore della data di partenza" greater_than_start_date: "deve essere maggiore della data di partenza"
not_same_project: "non appartiene allo stesso progetto" not_same_project: "non appartiene allo stesso progetto"
circular_dependency: "Questa relazione creerebbe una dipendenza circolare" circular_dependency: "Questa relazione creerebbe una dipendenza circolare"
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: "Una segnalazione non può essere collegata a una delle sue discendenti"
actionview_instancetag_blank_option: Scegli actionview_instancetag_blank_option: Scegli
@@ -141,11 +142,11 @@ it:
general_pdf_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1
general_first_day_of_week: '1' general_first_day_of_week: '1'
notice_account_updated: L'utente è stata aggiornato. notice_account_updated: L'utente è stato aggiornato.
notice_account_invalid_creditentials: Nome utente o password non validi. notice_account_invalid_creditentials: Nome utente o password non validi.
notice_account_password_updated: La password è stata aggiornata. notice_account_password_updated: La password è stata aggiornata.
notice_account_wrong_password: Password errata notice_account_wrong_password: Password errata
notice_account_register_done: L'utente è stata creato. notice_account_register_done: L'utente è stato creato.
notice_account_unknown_email: Utente sconosciuto. notice_account_unknown_email: Utente sconosciuto.
notice_can_t_change_password: Questo utente utilizza un metodo di autenticazione esterno. Impossibile cambiare la password. notice_can_t_change_password: Questo utente utilizza un metodo di autenticazione esterno. Impossibile cambiare la password.
notice_account_lost_email_sent: Ti è stata spedita una email con le istruzioni per cambiare la password. notice_account_lost_email_sent: Ti è stata spedita una email con le istruzioni per cambiare la password.
@@ -462,7 +463,7 @@ it:
label_all_words: Tutte le parole label_all_words: Tutte le parole
label_wiki: Wiki label_wiki: Wiki
label_wiki_edit: Modifica wiki label_wiki_edit: Modifica wiki
label_wiki_edit_plural: Modfiche wiki label_wiki_edit_plural: Modifiche wiki
label_wiki_page: Pagina Wiki label_wiki_page: Pagina Wiki
label_wiki_page_plural: Pagine wiki label_wiki_page_plural: Pagine wiki
label_index_by_title: Ordina per titolo label_index_by_title: Ordina per titolo
@@ -913,26 +914,26 @@ it:
text_zoom_in: Aumenta ingrandimento text_zoom_in: Aumenta ingrandimento
notice_unable_delete_time_entry: Impossibile eliminare il valore time log. notice_unable_delete_time_entry: Impossibile eliminare il valore time log.
label_overall_spent_time: Totale tempo impiegato label_overall_spent_time: Totale tempo impiegato
field_time_entries: Log time field_time_entries: Tempo di collegamento
project_module_gantt: Gantt project_module_gantt: Gantt
project_module_calendar: Calendar project_module_calendar: Calendario
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_edit_associated_wikipage: "Modifica la pagina wiki associata: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Eliminare la segnalazione e tutte le discendenti?
field_text: Text field field_text: Campo di testo
label_user_mail_option_only_owner: Only for things I am the owner of label_user_mail_option_only_owner: Solo se io sono il proprietario
setting_default_notification_option: Default notification option setting_default_notification_option: Opzione di notifica predefinita
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_my_events: Solo se sono un osservatore o sono coinvolto
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_assigned: Solo quando mi assegnano attività
label_user_mail_option_none: No events label_user_mail_option_none: Nessun evento
field_member_of_group: Assignee's group field_member_of_group: Gruppo dell'assegnatario
field_assigned_to_role: Assignee's role field_assigned_to_role: Ruolo dell'assegnatario
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: Il progetto a cui stai accedendo è stato archiviato.
label_principal_search: "Search for user or group:" label_principal_search: "Cerca utente o gruppo:"
label_user_search: "Search for user:" label_user_search: "Cerca utente:"
field_visible: Visible field_visible: Visibile
setting_emails_header: Emails header setting_emails_header: Intestazione email
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Attività per il tempo di collegamento
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Usato nel changeset %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt
+5 -5
View File
@@ -188,6 +188,7 @@ ja:
notice_unable_delete_version: バージョンを削除できません notice_unable_delete_version: バージョンを削除できません
notice_unable_delete_time_entry: 作業時間を削除できません notice_unable_delete_time_entry: 作業時間を削除できません
notice_issue_done_ratios_updated: チケットの進捗が更新されました。 notice_issue_done_ratios_updated: チケットの進捗が更新されました。
notice_gantt_chart_truncated: ガントチャートは、最大表示項目数(%{max})を超えたたため切り捨てられました。
error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}" error_can_t_load_default_data: "デフォルト設定がロードできませんでした: %{value}"
error_scm_not_found: リポジトリに、エントリ/リビジョンが存在しません。 error_scm_not_found: リポジトリに、エントリ/リビジョンが存在しません。
@@ -380,6 +381,9 @@ ja:
setting_start_of_week: 週の開始曜日 setting_start_of_week: 週の開始曜日
setting_rest_api_enabled: RESTによるWebサービスを有効にする setting_rest_api_enabled: RESTによるWebサービスを有効にする
setting_default_notification_option: デフォルトのメール通知オプション setting_default_notification_option: デフォルトのメール通知オプション
setting_commit_logtime_enabled: コミット時に作業時間を記録する
setting_commit_logtime_activity_id: 作業時間の作業分類
setting_gantt_items_limit: ガントチャート最大表示項目数
permission_add_project: プロジェクトの追加 permission_add_project: プロジェクトの追加
permission_add_subprojects: サブプロジェクトの追加 permission_add_subprojects: サブプロジェクトの追加
@@ -901,6 +905,7 @@ ja:
text_no_configuration_data: "ロール、トラッカー、チケットのステータス、ワークフローがまだ設定されていません。\nデフォルト設定のロードを強くお勧めします。ロードした後、それを修正することができます。" text_no_configuration_data: "ロール、トラッカー、チケットのステータス、ワークフローがまだ設定されていません。\nデフォルト設定のロードを強くお勧めします。ロードした後、それを修正することができます。"
text_load_default_configuration: デフォルト設定をロード text_load_default_configuration: デフォルト設定をロード
text_status_changed_by_changeset: "更新履歴 %{value} で適用されました。" text_status_changed_by_changeset: "更新履歴 %{value} で適用されました。"
text_time_logged_by_changeset: "更新履歴 %{value} で適用されました。"
text_issues_destroy_confirmation: '本当に選択したチケットを削除しますか?' text_issues_destroy_confirmation: '本当に選択したチケットを削除しますか?'
text_select_project_modules: 'このプロジェクトで使用するモジュールを選択してください:' text_select_project_modules: 'このプロジェクトで使用するモジュールを選択してください:'
text_default_administrator_account_changed: デフォルト管理アカウントが変更済 text_default_administrator_account_changed: デフォルト管理アカウントが変更済
@@ -952,8 +957,3 @@ ja:
enumeration_doc_categories: 文書カテゴリ enumeration_doc_categories: 文書カテゴリ
enumeration_activities: 作業分類 (時間トラッキング) enumeration_activities: 作業分類 (時間トラッキング)
enumeration_system_activity: システム作業分類 enumeration_system_activity: システム作業分類
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
+48 -48
View File
@@ -5,25 +5,25 @@ nl:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
# When no format has been given, it uses default. # When no format has been given, it uses default.
# You can provide other formats here if you like! # You can provide other formats here if you like!
default: "%Y-%m-%d" default: "%d-%m-%Y"
short: "%b %d" short: "%e %b"
long: "%B %d, %Y" long: "%d %B, %Y"
day_names: [Zondag, Maandag, Dinsdag, Woensdag, Donderdag, Vrijdag, Zaterdag] day_names: [zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag]
abbr_day_names: [Zo, Ma, Di, Woe, Do, Vr, Zat] abbr_day_names: [zo, ma, di, wo, do, vr, za]
# Don't forget the nil at the beginning; there's no such thing as a 0th month # Don't forget the nil at the beginning; there's no such thing as a 0th month
month_names: [~, Januari, Februari, Maart, April, Mei, Juni, Juli, Augustus, September, Oktober, November, December] month_names: [~, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december]
abbr_month_names: [~, Jan, Feb, Mar, Apr, Mei, Jun, Jul, Aug, Sep, Okt, Nov, Dec] abbr_month_names: [~, jan, feb, mar, apr, mei, jun, jul, aug, sep, okt, nov, dec]
# Used in date_select and datime_select. # Used in date_select and datime_select.
order: [ :year, :month, :day ] order: [ :day, :month, :year ]
time: time:
formats: formats:
default: "%a, %d %b %Y %H:%M:%S %z" default: "%a, %d %b %Y %H:%M:%S %z"
time: "%H:%M" time: "%H:%M"
short: "%d %b %H:%M" short: "%e %b %H:%M"
long: "%B %d, %Y %H:%M" long: "%d %B, %Y %H:%M"
am: "am" am: "am"
pm: "pm" pm: "pm"
@@ -32,7 +32,7 @@ nl:
half_a_minute: "halve minuut" half_a_minute: "halve minuut"
less_than_x_seconds: less_than_x_seconds:
one: "minder dan een seconde" one: "minder dan een seconde"
other: "mindera dan %{count} seconden" other: "minder dan %{count} seconden"
x_seconds: x_seconds:
one: "1 seconde" one: "1 seconde"
other: "%{count} seconden" other: "%{count} seconden"
@@ -56,13 +56,13 @@ nl:
other: "%{count} maanden" other: "%{count} maanden"
about_x_years: about_x_years:
one: "ongeveer 1 jaar" one: "ongeveer 1 jaar"
other: "ongeveer %{count} jaren" other: "ongeveer %{count} jaar"
over_x_years: over_x_years:
one: "over 1 jaar" one: "meer dan 1 jaar"
other: "over %{count} jaren" other: "meer dan %{count} jaar"
almost_x_years: almost_x_years:
one: "almost 1 year" one: "bijna 1 jaar"
other: "almost %{count} years" other: "bijna %{count} jaar"
number: number:
format: format:
@@ -94,8 +94,8 @@ nl:
errors: errors:
template: template:
header: header:
one: "1 error prohibited this %{model} from being saved" one: "Door een fout kon dit %{model} niet worden opgeslagen"
other: "%{count} errors prohibited this %{model} from being saved" other: "Door %{count} fouten kon dit %{model} niet worden opgeslagen"
messages: messages:
inclusion: "staat niet in de lijst" inclusion: "staat niet in de lijst"
exclusion: "is gereserveerd" exclusion: "is gereserveerd"
@@ -143,7 +143,7 @@ nl:
button_edit: Bewerk button_edit: Bewerk
button_list: Lijst button_list: Lijst
button_lock: Sluit button_lock: Sluit
button_log_time: Log tijd button_log_time: Registreer tijd
button_login: Inloggen button_login: Inloggen
button_move: Verplaatsen button_move: Verplaatsen
button_quote: Citaat button_quote: Citaat
@@ -275,9 +275,9 @@ nl:
field_user: Gebruiker field_user: Gebruiker
field_value: Waarde field_value: Waarde
field_version: Versie field_version: Versie
general_csv_decimal_separator: '.' general_csv_decimal_separator: ','
general_csv_encoding: ISO-8859-1 general_csv_encoding: ISO-8859-1
general_csv_separator: ',' general_csv_separator: ';'
general_first_day_of_week: '7' general_first_day_of_week: '7'
general_lang_name: 'Nederlands' general_lang_name: 'Nederlands'
general_pdf_encoding: ISO-8859-1 general_pdf_encoding: ISO-8859-1
@@ -513,9 +513,9 @@ nl:
one: 1 project one: 1 project
other: "%{count} projects" other: "%{count} projects"
label_public_projects: Publieke projecten label_public_projects: Publieke projecten
label_query: Eigen zoekvraag label_query: Eigen zoekopdracht
label_query_new: Nieuwe zoekvraag label_query_new: Nieuwe zoekopdracht
label_query_plural: Eigen zoekvragen label_query_plural: Eigen zoekopdrachten
label_read: Lees... label_read: Lees...
label_register: Registreer label_register: Registreer
label_registered_on: Geregistreerd op label_registered_on: Geregistreerd op
@@ -581,7 +581,7 @@ nl:
label_used_by: Gebruikt door label_used_by: Gebruikt door
label_user: Gebruiker label_user: Gebruiker
label_user_activity: "%{value}'s activiteit" label_user_activity: "%{value}'s activiteit"
label_user_mail_no_self_notified: "Ik wil niet op de hoogte gehouden worden van wijzigingen die ik zelf maak." label_user_mail_no_self_notified: Ik wil niet op de hoogte gehouden worden van mijn eigen wijzigingen
label_user_mail_option_all: "Bij elk gebeurtenis in al mijn projecten..." label_user_mail_option_all: "Bij elk gebeurtenis in al mijn projecten..."
label_user_mail_option_selected: "Enkel bij elke gebeurtenis op het geselecteerde project..." label_user_mail_option_selected: "Enkel bij elke gebeurtenis op het geselecteerde project..."
label_user_new: Nieuwe gebruiker label_user_new: Nieuwe gebruiker
@@ -718,7 +718,7 @@ nl:
setting_mail_from: Afzender e-mail adres setting_mail_from: Afzender e-mail adres
setting_mail_handler_api_enabled: Schakel WS in voor inkomende mail. setting_mail_handler_api_enabled: Schakel WS in voor inkomende mail.
setting_mail_handler_api_key: API sleutel setting_mail_handler_api_key: API sleutel
setting_per_page_options: Objects per pagina-opties setting_per_page_options: Aantal objecten per pagina (opties)
setting_plain_text_mail: platte tekst (geen HTML) setting_plain_text_mail: platte tekst (geen HTML)
setting_protocol: Protocol setting_protocol: Protocol
setting_repositories_encodings: Repositories coderingen setting_repositories_encodings: Repositories coderingen
@@ -773,7 +773,7 @@ nl:
text_tip_issue_end_day: issue die op deze dag eindigt text_tip_issue_end_day: issue die op deze dag eindigt
text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker text_tracker_no_workflow: Geen workflow gedefinieerd voor deze tracker
text_unallowed_characters: Niet toegestane tekens text_unallowed_characters: Niet toegestane tekens
text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel notificaties ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)." text_user_mail_option: "Bij niet-geselecteerde projecten zult u enkel mededelingen ontvangen voor issues die u monitort of waar u bij betrokken bent (als auteur of toegewezen persoon)."
text_user_wrote: "%{value} schreef:" text_user_wrote: "%{value} schreef:"
text_wiki_destroy_confirmation: Weet u zeker dat u deze wiki en zijn inhoud wenst te verwijderen? text_wiki_destroy_confirmation: Weet u zeker dat u deze wiki en zijn inhoud wenst te verwijderen?
text_workflow_edit: Selecteer een rol en een tracker om de workflow te wijzigen text_workflow_edit: Selecteer een rol en een tracker om de workflow te wijzigen
@@ -795,7 +795,7 @@ nl:
label_date_from_to: Van %{start} tot %{end} label_date_from_to: Van %{start} tot %{end}
label_greater_or_equal: ">=" label_greater_or_equal: ">="
label_less_or_equal: <= label_less_or_equal: <=
text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wil wil je ermee doen? text_wiki_page_destroy_question: Deze pagina heeft %{descendants} subpagina's en onderliggende pagina's?. Wat wilt u hiermee doen?
text_wiki_page_reassign_children: Alle subpagina's toewijzen aan deze hoofdpagina text_wiki_page_reassign_children: Alle subpagina's toewijzen aan deze hoofdpagina
text_wiki_page_nullify_children: Behoud subpagina's als hoofdpagina's text_wiki_page_nullify_children: Behoud subpagina's als hoofdpagina's
text_wiki_page_destroy_children: Verwijder alle subpagina's en onderliggende pagina's text_wiki_page_destroy_children: Verwijder alle subpagina's en onderliggende pagina's
@@ -804,9 +804,9 @@ nl:
mail_subject_wiki_content_updated: "'%{id}' wiki pagina is bijgewerkt" mail_subject_wiki_content_updated: "'%{id}' wiki pagina is bijgewerkt"
label_wiki_content_added: Wiki pagina toegevoegd label_wiki_content_added: Wiki pagina toegevoegd
mail_subject_wiki_content_added: "'%{id}' wiki pagina is toegevoegd" mail_subject_wiki_content_added: "'%{id}' wiki pagina is toegevoegd"
mail_body_wiki_content_added: The '%{id}' wiki pagina is toegevoegd door %{author}. mail_body_wiki_content_added: De '%{id}' wiki pagina is toegevoegd door %{author}.
label_wiki_content_updated: Wiki pagina bijgewerkt label_wiki_content_updated: Wiki pagina bijgewerkt
mail_body_wiki_content_updated: The '%{id}' wiki pagina is bijgewerkt door %{author}. mail_body_wiki_content_updated: De '%{id}' wiki pagina is bijgewerkt door %{author}.
permission_add_project: Maak project permission_add_project: Maak project
setting_new_project_user_role_id: Rol van gebruiker die een project maakt setting_new_project_user_role_id: Rol van gebruiker die een project maakt
label_view_all_revisions: Bekijk alle revisies label_view_all_revisions: Bekijk alle revisies
@@ -895,26 +895,26 @@ nl:
text_zoom_in: Zoom in text_zoom_in: Zoom in
notice_unable_delete_time_entry: Verwijderen niet mogelijk van tijd log invoer. notice_unable_delete_time_entry: Verwijderen niet mogelijk van tijd log invoer.
label_overall_spent_time: Totaal bestede tijd label_overall_spent_time: Totaal bestede tijd
field_time_entries: Log tijd field_time_entries: Registreer tijd
project_module_gantt: Gantt project_module_gantt: Gantt
project_module_calendar: Kalender project_module_calendar: Kalender
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}" button_edit_associated_wikipage: "Bewerk bijbehorende wiki pagina: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues? text_are_you_sure_with_children: Verwijder issue en alle onderliggende issues?
field_text: Text field field_text: Tekst veld
label_user_mail_option_only_owner: Only for things I am the owner of label_user_mail_option_only_owner: Alleen voor dingen waarvan ik de auteur ben
setting_default_notification_option: Default notification option setting_default_notification_option: Standaard instelling voor mededelingen
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in label_user_mail_option_only_my_events: Alleen voor dingen die ik volg of bij betrokken ben
label_user_mail_option_only_assigned: Only for things I am assigned to label_user_mail_option_only_assigned: Alleen voor dingen die aan mij zijn toegewezen
label_user_mail_option_none: No events label_user_mail_option_none: Bij geen enkele gebeurtenis
field_member_of_group: Assignee's group field_member_of_group: Assignee's group
field_assigned_to_role: Assignee's role field_assigned_to_role: Assignee's role
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: Het project dat u wilt bezoeken is gearchiveerd.
label_principal_search: "Search for user or group:" label_principal_search: "Zoek naar gebruiker of groep:"
label_user_search: "Search for user:" label_user_search: "Zoek naar gebruiker:"
field_visible: Visible field_visible: Zichtbaar
setting_emails_header: Emails header setting_emails_header: Emails header
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Standaard activiteit voor tijdregistratie
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Toegepast in changeset %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Activeer tijdregistratie
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: De gantt chart is ingekort omdat het meer objecten bevat dan kan worden weergegeven, (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Max. aantal objecten op gantt chart
+2 -2
View File
@@ -334,7 +334,7 @@ pl:
label_auth_source_plural: Tryby identyfikacji label_auth_source_plural: Tryby identyfikacji
label_authentication: Identyfikacja label_authentication: Identyfikacja
label_blocked_by: zablokowane przez label_blocked_by: zablokowane przez
label_blocks: blokady label_blocks: blokuje
label_board: Forum label_board: Forum
label_board_new: Nowe forum label_board_new: Nowe forum
label_board_plural: Fora label_board_plural: Fora
@@ -410,7 +410,7 @@ pl:
label_download_plural: "%{count} Pobrania" label_download_plural: "%{count} Pobrania"
label_downloads_abbr: Pobieranie label_downloads_abbr: Pobieranie
label_duplicated_by: zduplikowane przez label_duplicated_by: zduplikowane przez
label_duplicates: duplikaty label_duplicates: duplikuje
label_end_to_end: koniec do końca label_end_to_end: koniec do końca
label_end_to_start: koniec do początku label_end_to_start: koniec do początku
label_enumeration_new: Nowa wartość label_enumeration_new: Nowa wartość
+19 -16
View File
@@ -315,7 +315,7 @@ pt-BR:
setting_issue_list_default_columns: Colunas padrão visíveis na lista de tarefas setting_issue_list_default_columns: Colunas padrão visíveis na lista de tarefas
setting_repositories_encodings: Codificação dos repositórios setting_repositories_encodings: Codificação dos repositórios
setting_commit_logs_encoding: Codificação das mensagens de commit setting_commit_logs_encoding: Codificação das mensagens de commit
setting_emails_footer: Rodapé dos e-mails setting_emails_footer: Rodapé do e-mail
setting_protocol: Protocolo setting_protocol: Protocolo
setting_per_page_options: Número de itens exibidos por página setting_per_page_options: Número de itens exibidos por página
setting_user_format: Formato de exibição de nome de usuário setting_user_format: Formato de exibição de nome de usuário
@@ -354,6 +354,9 @@ pt-BR:
label_issues_by: "Tarefas por %{value}" label_issues_by: "Tarefas por %{value}"
label_issue_added: Tarefa adicionada label_issue_added: Tarefa adicionada
label_issue_updated: Tarefa atualizada label_issue_updated: Tarefa atualizada
label_issue_note_added: Nota adicionada
label_issue_status_updated: Situação atualizada
label_issue_priority_updated: Prioridade atualizada
label_document: Documento label_document: Documento
label_document_new: Novo documento label_document_new: Novo documento
label_document_plural: Documentos label_document_plural: Documentos
@@ -557,7 +560,7 @@ pt-BR:
label_spent_time: Tempo gasto label_spent_time: Tempo gasto
label_f_hour: "%{value} hora" label_f_hour: "%{value} hora"
label_f_hour_plural: "%{value} horas" label_f_hour_plural: "%{value} horas"
label_time_tracking: Controle de horas label_time_tracking: Registro de horas
label_change_plural: Alterações label_change_plural: Alterações
label_statistics: Estatísticas label_statistics: Estatísticas
label_commits_per_month: Commits por mês label_commits_per_month: Commits por mês
@@ -754,7 +757,7 @@ pt-BR:
enumeration_issue_priorities: Prioridade das tarefas enumeration_issue_priorities: Prioridade das tarefas
enumeration_doc_categories: Categorias de documento enumeration_doc_categories: Categorias de documento
enumeration_activities: Atividades (time tracking) enumeration_activities: Atividades (registro de horas)
notice_unable_delete_version: Não foi possível excluir a versão notice_unable_delete_version: Não foi possível excluir a versão
label_renamed: renomeado label_renamed: renomeado
label_copied: copiado label_copied: copiado
@@ -943,16 +946,16 @@ pt-BR:
setting_default_notification_option: Opção padrão de notificação setting_default_notification_option: Opção padrão de notificação
label_user_mail_option_only_my_events: Somente para as coisas que eu esteja observando ou esteja envolvido label_user_mail_option_only_my_events: Somente para as coisas que eu esteja observando ou esteja envolvido
label_user_mail_option_only_assigned: Somente para as coisas que estejam atribuídas a mim label_user_mail_option_only_assigned: Somente para as coisas que estejam atribuídas a mim
label_user_mail_option_none: No events label_user_mail_option_none: Sem eventos
field_member_of_group: Assignee's group field_member_of_group: Grupo do responsável
field_assigned_to_role: Assignee's role field_assigned_to_role: Papel do responsável
notice_not_authorized_archived_project: The project you're trying to access has been archived. notice_not_authorized_archived_project: O projeto que você está tentando acessar foi arquivado.
label_principal_search: "Search for user or group:" label_principal_search: "Pesquisar por usuários ou grupos:"
label_user_search: "Search for user:" label_user_search: "Pesquisar por usuário:"
field_visible: Visible field_visible: Visível
setting_emails_header: Emails header setting_emails_header: Cabeçalho do e-mail
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Atividade para registrar horas
text_time_logged_by_changeset: Applied in changeset %{value}. text_time_logged_by_changeset: Aplicado no changeset %{value}.
setting_commit_logtime_enabled: Enable time logging setting_commit_logtime_enabled: Habilitar registro de horas
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: O gráfico foi cortado por exceder o tamanho máximo de linhas que podem ser exibidas (%{max})
setting_gantt_items_limit: Maximum number of items displayed on the gantt chart setting_gantt_items_limit: Número máximo de itens exibidos no gráfico gatt
+23 -23
View File
@@ -208,6 +208,7 @@ sv:
notice_unable_delete_version: Denna version var inte möjlig att ta bort. notice_unable_delete_version: Denna version var inte möjlig att ta bort.
notice_unable_delete_time_entry: Tidloggning kunde inte tas bort. notice_unable_delete_time_entry: Tidloggning kunde inte tas bort.
notice_issue_done_ratios_updated: % klart uppdaterade. notice_issue_done_ratios_updated: % klart uppdaterade.
notice_gantt_chart_truncated: "Schemat förminskades eftersom det överskrider det maximala antalet aktiviteter som får visas (%{max})"
error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}" error_can_t_load_default_data: "Standardkonfiguration gick inte att läsa in: %{value}"
error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv." error_scm_not_found: "Inlägg och/eller revision finns inte i detta versionsarkiv."
@@ -217,7 +218,7 @@ sv:
error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.' error_no_tracker_in_project: 'Ingen ärendetyp är associerad med projektet. Vänligen kontrollera projektinställningarna.'
error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").' error_no_default_issue_status: 'Ingen status är definierad som standard för nya ärenden. Vänligen kontrollera din konfiguration (Gå till "Administration -> Ärendestatus").'
error_can_not_delete_custom_field: Kan inte ta bort användardefinerat fält error_can_not_delete_custom_field: Kan inte ta bort användardefinerat fält
error_can_not_delete_tracker: Det finns ärenden av denna typ och den är därför inte möjlig att ta bort. error_can_not_delete_tracker: "Det finns ärenden av denna typ och den är därför inte möjlig att ta bort."
error_can_not_remove_role: "Denna roll används och den är därför inte möjlig att ta bort." error_can_not_remove_role: "Denna roll används och den är därför inte möjlig att ta bort."
error_can_not_reopen_issue_on_closed_version: 'Ett ärende tilldelat en stängd version kan inte öppnas på nytt' error_can_not_reopen_issue_on_closed_version: 'Ett ärende tilldelat en stängd version kan inte öppnas på nytt'
error_can_not_archive_project: Detta projekt kan inte arkiveras error_can_not_archive_project: Detta projekt kan inte arkiveras
@@ -225,7 +226,7 @@ sv:
error_workflow_copy_source: 'Vänligen välj källans ärendetyp eller roll' error_workflow_copy_source: 'Vänligen välj källans ärendetyp eller roll'
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål' error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort' error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
error_unable_to_connect: Kan inte ansluta (%{value}) error_unable_to_connect: "Kan inte ansluta (%{value})"
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas." warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
@@ -240,9 +241,9 @@ sv:
mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna" mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna"
mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:" mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:"
mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till" mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till"
mail_body_wiki_content_added: The '%{id}' wikisida has lagts till av %{author}. mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}."
mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats" mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats"
mail_body_wiki_content_updated: The '%{id}' wikisida har uppdaterats av %{author}. mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}."
gui_validation_error: 1 fel gui_validation_error: 1 fel
gui_validation_error_plural: "%{count} fel" gui_validation_error_plural: "%{count} fel"
@@ -340,8 +341,8 @@ sv:
field_group_by: Gruppera resultat efter field_group_by: Gruppera resultat efter
field_sharing: Delning field_sharing: Delning
field_parent_issue: Förälderaktivitet field_parent_issue: Förälderaktivitet
field_member_of_group: Tilldelad användares grupp field_member_of_group: "Tilldelad användares grupp"
field_assigned_to_role: Tilldelad användares roll field_assigned_to_role: "Tilldelad användares roll"
field_text: Textfält field_text: Textfält
field_visible: Synlig field_visible: Synlig
@@ -380,7 +381,7 @@ sv:
setting_activity_days_default: Dagar som visas på projektaktivitet setting_activity_days_default: Dagar som visas på projektaktivitet
setting_display_subprojects_issues: Visa ärenden från underprojekt i huvudprojekt setting_display_subprojects_issues: Visa ärenden från underprojekt i huvudprojekt
setting_enabled_scm: Aktivera SCM setting_enabled_scm: Aktivera SCM
setting_mail_handler_body_delimiters: Trunkera mail efter en av följande rader setting_mail_handler_body_delimiters: "Trunkera mail efter en av följande rader"
setting_mail_handler_api_enabled: Aktivera WS för inkommande mail setting_mail_handler_api_enabled: Aktivera WS för inkommande mail
setting_mail_handler_api_key: API-nyckel setting_mail_handler_api_key: API-nyckel
setting_sequential_project_identifiers: Generera projektidentifierare sekventiellt setting_sequential_project_identifiers: Generera projektidentifierare sekventiellt
@@ -400,6 +401,9 @@ sv:
setting_rest_api_enabled: Aktivera REST webbtjänst setting_rest_api_enabled: Aktivera REST webbtjänst
setting_cache_formatted_text: Cacha formaterad text setting_cache_formatted_text: Cacha formaterad text
setting_default_notification_option: Standard notifieringsalternativ setting_default_notification_option: Standard notifieringsalternativ
setting_commit_logtime_enabled: Aktivera tidloggning
setting_commit_logtime_activity_id: Aktivitet för loggad tid
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
permission_add_project: Skapa projekt permission_add_project: Skapa projekt
permission_add_subprojects: Skapa underprojekt permission_add_subprojects: Skapa underprojekt
@@ -581,7 +585,7 @@ sv:
label_version_plural: Versioner label_version_plural: Versioner
label_close_versions: Stäng klara versioner label_close_versions: Stäng klara versioner
label_confirmation: Bekräftelse label_confirmation: Bekräftelse
label_export_to: Exportera till label_export_to: 'Finns även som:'
label_read: Läs... label_read: Läs...
label_public_projects: Publika projekt label_public_projects: Publika projekt
label_open_issues: öppen label_open_issues: öppen
@@ -666,7 +670,7 @@ sv:
label_tag: Tag label_tag: Tag
label_revision: Revision label_revision: Revision
label_revision_plural: Revisioner label_revision_plural: Revisioner
label_revision_id: Revision %{value} label_revision_id: "Revision %{value}"
label_associated_revisions: Associerade revisioner label_associated_revisions: Associerade revisioner
label_added: tillagd label_added: tillagd
label_modified: modifierad label_modified: modifierad
@@ -775,10 +779,10 @@ sv:
label_search_titles_only: Sök endast i titlar label_search_titles_only: Sök endast i titlar
label_user_mail_option_all: "För alla händelser i mina projekt" label_user_mail_option_all: "För alla händelser i mina projekt"
label_user_mail_option_selected: "För alla händelser i markerade projekt..." label_user_mail_option_selected: "För alla händelser i markerade projekt..."
label_user_mail_option_none: Inga händelser label_user_mail_option_none: "Inga händelser"
label_user_mail_option_only_my_events: Endast för saker jag bevakar eller är inblandad i label_user_mail_option_only_my_events: "Endast för saker jag bevakar eller är inblandad i"
label_user_mail_option_only_assigned: Endast för saker jag är tilldelad label_user_mail_option_only_assigned: "Endast för saker jag är tilldelad"
label_user_mail_option_only_owner: Endast för saker jag äger label_user_mail_option_only_owner: "Endast för saker jag äger"
label_user_mail_no_self_notified: "Jag vill inte bli underrättad om ändringar som jag har gjort" label_user_mail_no_self_notified: "Jag vill inte bli underrättad om ändringar som jag har gjort"
label_registration_activation_by_email: kontoaktivering med mail label_registration_activation_by_email: kontoaktivering med mail
label_registration_manual_activation: manuell kontoaktivering label_registration_manual_activation: manuell kontoaktivering
@@ -825,7 +829,7 @@ sv:
label_display_used_statuses_only: Visa endast status som används av denna ärendetyp label_display_used_statuses_only: Visa endast status som används av denna ärendetyp
label_api_access_key: API-nyckel label_api_access_key: API-nyckel
label_missing_api_access_key: Saknar en API-nyckel label_missing_api_access_key: Saknar en API-nyckel
label_api_access_key_created_on: API-nyckel skapad för %{value} sedan label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan"
label_profile: Profil label_profile: Profil
label_subtask_plural: Underaktiviteter label_subtask_plural: Underaktiviteter
label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras
@@ -921,6 +925,7 @@ sv:
text_no_configuration_data: "Roller, ärendetyper, ärendestatus och arbetsflöden har inte konfigurerats ännu.\nDet rekommenderas att läsa in standardkonfigurationen. Du kommer att kunna göra ändringar efter att den blivit inläst." text_no_configuration_data: "Roller, ärendetyper, ärendestatus och arbetsflöden har inte konfigurerats ännu.\nDet rekommenderas att läsa in standardkonfigurationen. Du kommer att kunna göra ändringar efter att den blivit inläst."
text_load_default_configuration: Läs in standardkonfiguration text_load_default_configuration: Läs in standardkonfiguration
text_status_changed_by_changeset: "Tilldelad i changeset %{value}." text_status_changed_by_changeset: "Tilldelad i changeset %{value}."
text_time_logged_by_changeset: "Tilldelad i changeset %{value}."
text_issues_destroy_confirmation: 'Är du säker på att du vill radera markerade ärende(n) ?' text_issues_destroy_confirmation: 'Är du säker på att du vill radera markerade ärende(n) ?'
text_select_project_modules: 'Välj vilka moduler som ska vara aktiva för projektet:' text_select_project_modules: 'Välj vilka moduler som ska vara aktiva för projektet:'
text_default_administrator_account_changed: Standardadministratörens konto ändrat text_default_administrator_account_changed: Standardadministratörens konto ändrat
@@ -938,10 +943,10 @@ sv:
text_repository_usernames_mapping: "Välj eller uppdatera den Redmine-användare som är mappad till varje användarnamn i versionarkivloggen.\nAnvändare med samma användarnamn eller mailadress i både Redmine och versionsarkivet mappas automatiskt." text_repository_usernames_mapping: "Välj eller uppdatera den Redmine-användare som är mappad till varje användarnamn i versionarkivloggen.\nAnvändare med samma användarnamn eller mailadress i både Redmine och versionsarkivet mappas automatiskt."
text_diff_truncated: '... Denna diff har förminskats eftersom den överskrider den maximala storlek som kan visas.' text_diff_truncated: '... Denna diff har förminskats eftersom den överskrider den maximala storlek som kan visas.'
text_custom_field_possible_values_info: 'Ett värde per rad' text_custom_field_possible_values_info: 'Ett värde per rad'
text_wiki_page_destroy_question: Denna sida har %{descendants} underliggande sidor. Vad vill du göra? text_wiki_page_destroy_question: "Denna sida har %{descendants} underliggande sidor. Vad vill du göra?"
text_wiki_page_nullify_children: Behåll undersidor som rotsidor text_wiki_page_nullify_children: "Behåll undersidor som rotsidor"
text_wiki_page_destroy_children: Ta bort alla underliggande sidor text_wiki_page_destroy_children: "Ta bort alla underliggande sidor"
text_wiki_page_reassign_children: Flytta undersidor till denna föräldersida text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida"
text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?" text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?"
text_zoom_out: Zooma ut text_zoom_out: Zooma ut
text_zoom_in: Zooma in text_zoom_in: Zooma in
@@ -972,8 +977,3 @@ sv:
enumeration_doc_categories: Dokumentkategorier enumeration_doc_categories: Dokumentkategorier
enumeration_activities: Aktiviteter (tidsuppföljning) enumeration_activities: Aktiviteter (tidsuppföljning)
enumeration_system_activity: Systemaktivitet enumeration_system_activity: Systemaktivitet
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
+2 -3
View File
@@ -248,6 +248,7 @@
notice_unable_delete_version: 無法刪除版本。 notice_unable_delete_version: 無法刪除版本。
notice_unable_delete_time_entry: 無法刪除工時記錄項目。 notice_unable_delete_time_entry: 無法刪除工時記錄項目。
notice_issue_done_ratios_updated: 項目完成百分比已更新。 notice_issue_done_ratios_updated: 項目完成百分比已更新。
notice_gantt_chart_truncated: "由於項目數量超過可顯示數量的最大值 (%{max}),故此甘特圖尾部已被截斷"
error_can_t_load_default_data: "無法載入預設組態: %{value}" error_can_t_load_default_data: "無法載入預設組態: %{value}"
error_scm_not_found: "在 SCM 儲存庫中找不到這個項目或版次。" error_scm_not_found: "在 SCM 儲存庫中找不到這個項目或版次。"
@@ -442,6 +443,7 @@
setting_default_notification_option: 預設通知選項 setting_default_notification_option: 預設通知選項
setting_commit_logtime_enabled: 啟用送交中的時間記錄 setting_commit_logtime_enabled: 啟用送交中的時間記錄
setting_commit_logtime_activity_id: 時間記錄對應的活動 setting_commit_logtime_activity_id: 時間記錄對應的活動
setting_gantt_items_limit: 甘特圖中項目顯示數量的最大值
permission_add_project: 建立專案 permission_add_project: 建立專案
permission_add_subprojects: 建立子專案 permission_add_subprojects: 建立子專案
@@ -1015,6 +1017,3 @@
enumeration_doc_categories: 文件分類 enumeration_doc_categories: 文件分類
enumeration_activities: 活動 (時間追蹤) enumeration_activities: 活動 (時間追蹤)
enumeration_system_activity: 系統活動 enumeration_system_activity: 系統活動
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
@@ -17,5 +17,6 @@ class AddUniqueIndexOnMembers < ActiveRecord::Migration
end end
def self.down def self.down
remove_index :members, [:user_id, :project_id]
end end
end end
+113 -1
View File
@@ -1,9 +1,121 @@
== Redmine changelog == Redmine changelog
Redmine - project management software Redmine - project management software
Copyright (C) 2006-2010 Jean-Philippe Lang Copyright (C) 2006-2011 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2011-03-07 v1.1.2
* Defect #3132: Bulk editing menu non-functional in Opera browser
* Defect #6090: Most binary files become corrupted when downloading from CVS repository browser when Redmine is running on a Windows server
* Defect #7280: Issues subjects wrap in Gantt
* Defect #7288: Non ASCII filename downloaded from repo is broken on Internet Explorer.
* Defect #7317: Gantt tab gives internal error due to nil avatar icon
* Defect #7497: Aptana Studio .project file added to version 1.1.1-stable
* Defect #7611: Workflow summary shows X icon for workflow with exactly 1 status transition
* Defect #7625: Syntax highlighting unavailable from board new topic or topic edit preview
* Defect #7630: Spent time in commits not recognized
* Defect #7656: MySQL SQL Syntax Error when filtering issues by Assignee's Group
* Defect #7718: Minutes logged in commit message are converted to hours
* Defect #7763: Email notification are sent to watchers even if 'No events' setting is chosen
* Feature #7608: Add "retro" gravatars
* Patch #7598: Extensible MailHandler
* Patch #7795: Internal server error at journals#index with custom fields
== 2011-01-30 v1.1.1
* Defect #4899: Redmine fails to list files for darcs repository
* Defect #7245: Wiki fails to find pages with cyrillic characters using postgresql
* Defect #7256: redmine/public/.htaccess must be moved for non-fastcgi installs/upgrades
* Defect #7258: Automatic spent time logging does not work properly with SQLite3
* Defect #7259: Released 1.1.0 uses "devel" label inside admin information
* Defect #7265: "Loading..." icon does not disappear after add project member
* Defect #7266: Test test_due_date_distance_in_words fail due to undefined locale
* Defect #7274: CSV value separator in dutch locale
* Defect #7277: Enabling gravatas causes usernames to overlap first name field in user list
* Defect #7294: "Notifiy for only project I select" is not available anymore in 1.1.0
* Defect #7307: HTTP 500 error on query for empty revision
* Defect #7313: Label not translated in french in Settings/Email Notification tab
* Defect #7329: <code class="javascript"> with long strings may hang server
* Defect #7337: My page french translation
* Defect #7348: French Translation of "Connection"
* Defect #7385: Error when viewing an issue which was related to a deleted subtask
* Defect #7386: NoMethodError on pdf export
* Defect #7415: Darcs adapter recognizes new files as modified files above Darcs 2.4
* Defect #7421: no email sent with 'Notifiy for any event on the selected projects only'
* Feature #5344: Update to latest CodeRay 0.9.x
== 2011-01-09 v1.1.0
* Defect #2038: Italics in wiki headers show-up wrong in the toc
* Defect #3449: Redmine Takes Too Long On Large Mercurial Repository
* Defect #3567: Sorting for changesets might go wrong on Mercurial repos
* Defect #3707: {{toc}} doesn't work with {{include}}
* Defect #5096: Redmine hangs up while browsing Git repository
* Defect #6000: Safe Attributes prevents plugin extension of Issue model...
* Defect #6064: Modules not assigned to projects created via API
* Defect #6110: MailHandler should allow updating Issue Priority and Custom fields
* Defect #6136: JSON API holds less information than XML API
* Defect #6345: xml used by rest API is invalid
* Defect #6348: Gantt chart PDF rendering errors
* Defect #6403: Updating an issue with custom fields fails
* Defect #6467: "Member of role", "Member of group" filter not work correctly
* Defect #6473: New gantt broken after clearing issue filters
* Defect #6541: Email notifications send to everybody
* Defect #6549: Notification settings not migrated properly
* Defect #6591: Acronyms must have a minimum of three characters
* Defect #6674: Delete time log broken after changes to REST
* Defect #6681: Mercurial, Bazaar and Darcs auto close issue text should be commit id instead of revision number
* Defect #6724: Wiki uploads does not work anymore (SVN 4266)
* Defect #6746: Wiki links are broken on Activity page
* Defect #6747: Wiki diff does not work since r4265
* Defect #6763: New gantt charts: subject displayed twice on issues
* Defect #6826: Clicking "Add" twice creates duplicate member record
* Defect #6844: Unchecking status filter on the issue list has no effect
* Defect #6895: Wrong Polish translation of "blocks"
* Defect #6943: Migration from boolean to varchar fails on PostgreSQL 8.1
* Defect #7064: Mercurial adapter does not recognize non alphabetic nor numeric in UTF-8 copied files
* Defect #7128: New gantt chart does not render subtasks under parent task
* Defect #7135: paging mechanism returns the same last page forever
* Defect #7188: Activity page not refreshed when changing language
* Defect #7195: Apply CLI-supplied defaults for incoming mail only to new issues not replies
* Defect #7197: Tracker reset to default when replying to an issue email
* Defect #7213: Copy project does not copy all roles and permissions
* Defect #7225: Project settings: Trackers & Custom fields only relevant if module Issue tracking is active
* Feature #630: Allow non-unique names for projects
* Feature #1738: Add a "Visible" flag to project/user custom fields
* Feature #2803: Support for Javascript in Themes
* Feature #2852: Clean Incoming Email of quoted text "----- Reply above this line ------"
* Feature #2995: Improve error message when trying to access an archived project
* Feature #3170: Autocomplete issue relations on subject
* Feature #3503: Administrator Be Able To Modify Email settings Of Users
* Feature #4155: Automatic spent time logging from commit messages
* Feature #5136: Parent select on Wiki rename page
* Feature #5338: Descendants (subtasks) should be available via REST API
* Feature #5494: Wiki TOC should display heading from level 4
* Feature #5594: Improve MailHandler's keyword handling
* Feature #5622: Allow version to be set via incoming email
* Feature #5712: Reload themes
* Feature #5869: Issue filters by Group and Role
* Feature #6092: Truncate Git revision labels in Activity page/feed and allow configurable length
* Feature #6112: Accept localized keywords when receiving emails
* Feature #6140: REST issues response with issue count limit and offset
* Feature #6260: REST API for Users
* Feature #6276: Gantt Chart rewrite
* Feature #6446: Remove length limits on project identifier and name
* Feature #6628: Improvements in truncate email
* Feature #6779: Project JSON API
* Feature #6823: REST API for time tracker.
* Feature #7072: REST API for news
* Feature #7111: Expose more detail on journal entries
* Feature #7141: REST API: get information about current user
* Patch #4807: Allow to set the done_ratio field with the incoming mail system
* Patch #5441: Initialize TimeEntry attributes with params[:time_entry]
* Patch #6762: Use GET instead of POST to retrieve context_menu
* Patch #7160: French translation ofr "not_a_date" is missing
* Patch #7212: Missing remove_index in AddUniqueIndexOnMembers down migration
== 2010-12-23 v1.0.5 == 2010-12-23 v1.0.5
* #6656: Mercurial adapter loses seconds of commit times * #6656: Mercurial adapter loses seconds of commit times
+3 -3
View File
@@ -255,7 +255,7 @@ module Redmine
pdf.SetFontStyle('B',9) pdf.SetFontStyle('B',9)
pdf.Cell(35,5, l(:field_description) + ":") pdf.Cell(35,5, l(:field_description) + ":")
pdf.SetFontStyle('',9) pdf.SetFontStyle('',9)
pdf.MultiCell(155,5, issue.description,"BR") pdf.MultiCell(155,5, issue.description.to_s,"BR")
pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY) pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY) pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
@@ -271,7 +271,7 @@ module Redmine
pdf.Ln pdf.Ln
unless changeset.comments.blank? unless changeset.comments.blank?
pdf.SetFontStyle('',8) pdf.SetFontStyle('',8)
pdf.MultiCell(190,5, changeset.comments) pdf.MultiCell(190,5, changeset.comments.to_s)
end end
pdf.Ln pdf.Ln
end end
@@ -291,7 +291,7 @@ module Redmine
end end
if journal.notes? if journal.notes?
pdf.SetFontStyle('',8) pdf.SetFontStyle('',8)
pdf.MultiCell(190,5, journal.notes) pdf.MultiCell(190,5, journal.notes.to_s)
end end
pdf.Ln pdf.Ln
end end
+6 -5
View File
@@ -353,11 +353,11 @@ module Redmine
subject = "<span class='#{css_classes}'>" subject = "<span class='#{css_classes}'>"
if issue.assigned_to.present? if issue.assigned_to.present?
assigned_string = l(:field_assigned_to) + ": " + issue.assigned_to.name assigned_string = l(:field_assigned_to) + ": " + issue.assigned_to.name
subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string) subject << view.avatar(issue.assigned_to, :class => 'gravatar icon-gravatar', :size => 10, :title => assigned_string).to_s
end end
subject << view.link_to_issue(issue) subject << view.link_to_issue(issue)
subject << '</span>' subject << '</span>'
html_subject(options, subject, :css => "issue-subject") + "\n" html_subject(options, subject, :css => "issue-subject", :title => issue.subject) + "\n"
when :image when :image
image_subject(options, issue.subject) image_subject(options, issue.subject)
when :pdf when :pdf
@@ -709,9 +709,10 @@ module Redmine
end end
def html_subject(params, subject, options={}) def html_subject(params, subject, options={})
output = "<div class=' #{options[:css] }' style='position: absolute;line-height:1.2em;height:16px;top:#{params[:top]}px;left:#{params[:indent]}px;overflow:hidden;'>" style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;"
output << subject style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width]
output << "</div>"
output = view.content_tag 'div', subject, :class => options[:css], :style => style, :title => options[:title]
@subjects << output @subjects << output
output output
end end
+12 -1
View File
@@ -271,7 +271,8 @@ module Redmine
end end
class Revision class Revision
attr_accessor :identifier, :scmid, :name, :author, :time, :message, :paths, :revision, :branch attr_accessor :scmid, :name, :author, :time, :message, :paths, :revision, :branch
attr_writer :identifier
def initialize(attributes={}) def initialize(attributes={})
self.identifier = attributes[:identifier] self.identifier = attributes[:identifier]
@@ -285,6 +286,16 @@ module Redmine
self.branch = attributes[:branch] self.branch = attributes[:branch]
end end
# Returns the identifier of this revision; see also Changeset model
def identifier
(@identifier || revision).to_s
end
# Returns the readable identifier.
def format_identifier
identifier
end
def save(repo) def save(repo)
Changeset.transaction do Changeset.transaction do
changeset = Changeset.new( changeset = Changeset.new(
+1
View File
@@ -249,6 +249,7 @@ module Redmine
cmd << " -p #{shell_quote path_with_project}" cmd << " -p #{shell_quote path_with_project}"
cat = nil cat = nil
shellout(cmd) do |io| shellout(cmd) do |io|
io.binmode
cat = io.read cat = io.read
end end
return nil if $? && $?.exitstatus != 0 return nil if $? && $?.exitstatus != 0
+40 -11
View File
@@ -31,16 +31,14 @@ module Redmine
end end
def darcs_binary_version def darcs_binary_version
cmd = "#{DARCS_BIN} --version" darcsversion = darcs_binary_version_from_command_line
version = nil if m = darcsversion.match(%r{\A(.*?)((\d+\.)+\d+)})
shellout(cmd) do |io| m[2].scan(%r{\d+}).collect(&:to_i)
# Read darcs version in first returned line
if m = io.gets.match(%r{((\d+\.)+\d+)})
version = m[0].scan(%r{\d+}).collect(&:to_i)
end
end end
return nil if $? && $?.exitstatus != 0 end
version
def darcs_binary_version_from_command_line
shellout("#{DARCS_BIN} --version") { |io| io.read }.to_s
end end
end end
@@ -64,7 +62,9 @@ module Redmine
# or nil if the given path doesn't exist in the repository # or nil if the given path doesn't exist in the repository
def entries(path=nil, identifier=nil) def entries(path=nil, identifier=nil)
path_prefix = (path.blank? ? '' : "#{path}/") path_prefix = (path.blank? ? '' : "#{path}/")
path = '.' if path.blank? if path.blank?
path = ( self.class.client_version_above?([2, 2, 0]) ? @url : '.' )
end
entries = Entries.new entries = Entries.new
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output" cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output"
cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
@@ -167,9 +167,38 @@ module Redmine
}) })
}) })
end end
def get_paths_for_patch(hash)
paths = get_paths_for_patch_raw(hash)
if self.class.client_version_above?([2, 4])
orig_paths = paths
paths = []
add_paths = []
add_paths_name = []
mod_paths = []
other_paths = []
orig_paths.each do |path|
if path[:action] == 'A'
add_paths << path
add_paths_name << path[:path]
elsif path[:action] == 'M'
mod_paths << path
else
other_paths << path
end
end
add_paths_name.each do |add_path|
mod_paths.delete_if { |m| m[:path] == add_path }
end
paths.concat add_paths
paths.concat mod_paths
paths.concat other_paths
end
paths
end
# Retrieve changed paths for a single patch # Retrieve changed paths for a single patch
def get_paths_for_patch(hash) def get_paths_for_patch_raw(hash)
cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output" cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output"
cmd << " --match #{shell_quote("hash #{hash}")} " cmd << " --match #{shell_quote("hash #{hash}")} "
paths = [] paths = []
+15 -8
View File
@@ -89,12 +89,13 @@ module Redmine
cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --date=iso --pretty=fuller --no-merges -n 1 " cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --date=iso --pretty=fuller --no-merges -n 1 "
cmd << " #{shell_quote rev} " if rev cmd << " #{shell_quote rev} " if rev
cmd << "-- #{shell_quote path} " unless path.empty? cmd << "-- #{shell_quote path} " unless path.empty?
shellout(cmd) do |io| lines = []
begin shellout(cmd) { |io| lines = io.readlines }
id = io.gets.split[1] return nil if $? && $?.exitstatus != 0
author = io.gets.match('Author:\s+(.*)$')[1] begin
2.times { io.gets } id = lines[0].split[1]
time = Time.parse(io.gets.match('CommitDate:\s+(.*)$')[1]).localtime author = lines[1].match('Author:\s+(.*)$')[1]
time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1]).localtime
Revision.new({ Revision.new({
:identifier => id, :identifier => id,
@@ -104,10 +105,9 @@ module Redmine
:message => nil, :message => nil,
:paths => nil :paths => nil
}) })
rescue NoMethodError => e rescue NoMethodError => e
logger.error("The revision '#{path}' has a wrong format") logger.error("The revision '#{path}' has a wrong format")
return nil return nil
end
end end
end end
@@ -264,6 +264,13 @@ module Redmine
return nil if $? && $?.exitstatus != 0 return nil if $? && $?.exitstatus != 0
cat cat
end end
class Revision < Redmine::Scm::Adapters::Revision
# Returns the readable identifier
def format_identifier
identifier[0,8]
end
end
end end
end end
end end
@@ -3,10 +3,10 @@ changeset_quiet = 'This template must be used with --debug option\n'
changeset_verbose = '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' 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|escape}</path>\n' file = '<path action="M">{file|urlescape}</path>\n'
file_add = '<path action="A">{file_add|escape}</path>\n' file_add = '<path action="A">{file_add|urlescape}</path>\n'
file_del = '<path action="D">{file_del|escape}</path>\n' file_del = '<path action="D">{file_del|urlescape}</path>\n'
file_copy = '<path-copied copyfrom-path="{source|escape}">{name|urlescape}</path-copied>\n' file_copy = '<path-copied copyfrom-path="{source|urlescape}">{name|urlescape}</path-copied>\n'
tag = '<tag>{tag|escape}</tag>\n' tag = '<tag>{tag|escape}</tag>\n'
header='<?xml version="1.0" encoding="UTF-8" ?>\n<log>\n\n' header='<?xml version="1.0" encoding="UTF-8" ?>\n<log>\n\n'
# footer="</log>" # footer="</log>"
@@ -3,10 +3,10 @@ changeset_quiet = 'This template must be used with --debug option\n'
changeset_verbose = '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|isodatesec}</date>\n<paths>\n{file_mods}{file_adds}{file_dels}{file_copies}</paths>\n<msg>{desc|escape}</msg>\n{tags}</logentry>\n\n' changeset_debug = '<logentry revision="{rev}" node="{node|short}">\n<author>{author|escape}</author>\n<date>{date|isodatesec}</date>\n<paths>\n{file_mods}{file_adds}{file_dels}{file_copies}</paths>\n<msg>{desc|escape}</msg>\n{tags}</logentry>\n\n'
file_mod = '<path action="M">{file_mod|escape}</path>\n' file_mod = '<path action="M">{file_mod|urlescape}</path>\n'
file_add = '<path action="A">{file_add|escape}</path>\n' file_add = '<path action="A">{file_add|urlescape}</path>\n'
file_del = '<path action="D">{file_del|escape}</path>\n' file_del = '<path action="D">{file_del|urlescape}</path>\n'
file_copy = '<path-copied copyfrom-path="{source|escape}">{name|urlescape}</path-copied>\n' file_copy = '<path-copied copyfrom-path="{source|urlescape}">{name|urlescape}</path-copied>\n'
tag = '<tag>{tag|escape}</tag>\n' tag = '<tag>{tag|escape}</tag>\n'
header='<?xml version="1.0" encoding="UTF-8" ?>\n<log>\n\n' header='<?xml version="1.0" encoding="UTF-8" ?>\n<log>\n\n'
# footer="</log>" # footer="</log>"
@@ -16,6 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'redmine/scm/adapters/abstract_adapter' require 'redmine/scm/adapters/abstract_adapter'
require 'cgi'
module Redmine module Redmine
module Scm module Scm
@@ -127,8 +128,8 @@ module Redmine
from_rev = logentry.attributes['revision'] from_rev = logentry.attributes['revision']
end end
paths << {:action => path.attributes['action'], paths << {:action => path.attributes['action'],
:path => "/#{path.text}", :path => "/#{CGI.unescape(path.text)}",
:from_path => from_path ? "/#{from_path}" : nil, :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil,
:from_revision => from_rev ? from_rev : nil :from_revision => from_rev ? from_rev : nil
} }
end end
+3 -3
View File
@@ -3,14 +3,14 @@ require 'rexml/document'
module Redmine module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 1 MAJOR = 1
MINOR = 0 MINOR = 1
TINY = 5 TINY = 2
# Branch values: # Branch values:
# * official release: nil # * official release: nil
# * stable branch: stable # * stable branch: stable
# * trunk: devel # * trunk: devel
BRANCH = 'devel' BRANCH = 'stable'
def self.revision def self.revision
revision = nil revision = nil
+1
View File
@@ -16,6 +16,7 @@ namespace :ci do
Rake::Task["db:create"].invoke Rake::Task["db:create"].invoke
Rake::Task["db:migrate"].invoke Rake::Task["db:migrate"].invoke
Rake::Task["db:schema:dump"].invoke Rake::Task["db:schema:dump"].invoke
Rake::Task["test:scm:update"].invoke
end end
desc "Build Redmine" desc "Build Redmine"
+27
View File
@@ -1,3 +1,10 @@
desc 'Updates and checks locales against en.yml'
task :locales do
%w(locales:update locales:check_interpolation).collect do |task|
Rake::Task[task].invoke
end
end
namespace :locales do namespace :locales do
desc 'Updates language files based on en.yml content (only works for new top level keys).' desc 'Updates language files based on en.yml content (only works for new top level keys).'
task :update do task :update do
@@ -28,6 +35,26 @@ namespace :locales do
lang.close lang.close
end end
end end
desc 'Checks interpolation arguments in locals against en.yml'
task :check_interpolation do
dir = ENV['DIR'] || './config/locales'
en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
files.each do |file|
file_strings = YAML.load(File.read(file))
file_strings = file_strings[file_strings.keys.first]
file_strings.each do |key, string|
next unless string.is_a?(String)
string.scan /%\{\w+\}/ do |match|
unless en_strings[key].nil? || en_strings[key].include?(match)
puts "#{file}: #{key} uses #{match} not found in en.yml"
end
end
end
end
end
desc <<-END_DESC desc <<-END_DESC
Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows). Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
+1 -1
View File
@@ -289,7 +289,7 @@ task :migrate_from_mantis => :environment do
project.versions.each do |version| project.versions.each do |version|
v = Version.new :name => encode(version.version), v = Version.new :name => encode(version.version),
:description => encode(version.description), :description => encode(version.description),
:effective_date => version.date_order.to_date :effective_date => (version.date_order ? version.date_order.to_date : nil)
v.project = p v.project = p
v.save v.save
versions_map[version.id] = v.id versions_map[version.id] = v.id
+90 -68
View File
@@ -1,68 +1,90 @@
### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake ### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake
namespace :test do namespace :test do
desc 'Measures test coverage' desc 'Measures test coverage'
task :coverage do task :coverage do
rm_f "coverage" rm_f "coverage"
rm_f "coverage.data" rm_f "coverage.data"
rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib --html" rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib --html"
files = Dir.glob("test/**/*_test.rb").join(" ") files = Dir.glob("test/**/*_test.rb").join(" ")
system("#{rcov} #{files}") system("#{rcov} #{files}")
system("open coverage/index.html") if PLATFORM['darwin'] system("open coverage/index.html") if PLATFORM['darwin']
end end
desc 'Run unit and functional scm tests' desc 'Run unit and functional scm tests'
task :scm do task :scm do
errors = %w(test:scm:units test:scm:functionals).collect do |task| errors = %w(test:scm:units test:scm:functionals).collect do |task|
begin begin
Rake::Task[task].invoke Rake::Task[task].invoke
nil nil
rescue => e rescue => e
task task
end end
end.compact end.compact
abort "Errors running #{errors.to_sentence(:locale => :en)}!" if errors.any? abort "Errors running #{errors.to_sentence(:locale => :en)}!" if errors.any?
end end
namespace :scm do namespace :scm do
namespace :setup do namespace :setup do
desc "Creates directory for test repositories" desc "Creates directory for test repositories"
task :create_dir do task :create_dir do
FileUtils.mkdir_p Rails.root + '/tmp/test' FileUtils.mkdir_p Rails.root + '/tmp/test'
end end
supported_scms = [:subversion, :cvs, :bazaar, :mercurial, :git, :darcs, :filesystem] supported_scms = [:subversion, :cvs, :bazaar, :mercurial, :git, :darcs, :filesystem]
desc "Creates a test subversion repository" desc "Creates a test subversion repository"
task :subversion => :create_dir do task :subversion => :create_dir do
repo_path = "tmp/test/subversion_repository" repo_path = "tmp/test/subversion_repository"
system "svnadmin create #{repo_path}" system "svnadmin create #{repo_path}"
system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}" system "gunzip < test/fixtures/repositories/subversion_repository.dump.gz | svnadmin load #{repo_path}"
end end
(supported_scms - [:subversion]).each do |scm| desc "Creates a test mercurial repository"
desc "Creates a test #{scm} repository" task :mercurial => :create_dir do
task scm => :create_dir do repo_path = "tmp/test/mercurial_repository"
system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test" bundle_path = "test/fixtures/repositories/mercurial_repository.hg"
end system "hg init #{repo_path}"
end system "hg -R #{repo_path} pull #{bundle_path}"
end
desc "Creates all test repositories"
task :all => supported_scms (supported_scms - [:subversion, :mercurial]).each do |scm|
end desc "Creates a test #{scm} repository"
task scm => :create_dir do
Rake::TestTask.new(:units => "db:test:prepare") do |t| system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
t.libs << "test" end
t.verbose = true end
t.test_files = FileList['test/unit/repository*_test.rb'] + FileList['test/unit/lib/redmine/scm/**/*_test.rb']
end desc "Creates all test repositories"
Rake::Task['test:scm:units'].comment = "Run the scm unit tests" task :all => supported_scms
end
Rake::TestTask.new(:functionals => "db:test:prepare") do |t|
t.libs << "test" desc "Updates installed test repositories"
t.verbose = true task :update do
t.test_files = FileList['test/functional/repositories*_test.rb'] require 'fileutils'
end Dir.glob("tmp/test/*_repository").each do |dir|
Rake::Task['test:scm:functionals'].comment = "Run the scm functional tests" next unless File.basename(dir) =~ %r{^(.+)_repository$} && File.directory?(dir)
end scm = $1
end next unless fixture = Dir.glob("test/fixtures/repositories/#{scm}_repository.*").first
next if File.stat(dir).ctime > File.stat(fixture).mtime
FileUtils.rm_rf dir
Rake::Task["test:scm:setup:#{scm}"].execute
end
end
Rake::TestTask.new(:units => "db:test:prepare") do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList['test/unit/repository*_test.rb'] + FileList['test/unit/lib/redmine/scm/**/*_test.rb']
end
Rake::Task['test:scm:units'].comment = "Run the scm unit tests"
Rake::TestTask.new(:functionals => "db:test:prepare") do |t|
t.libs << "test"
t.verbose = true
t.test_files = FileList['test/functional/repositories*_test.rb']
end
Rake::Task['test:scm:functionals'].comment = "Run the scm functional tests"
end
end
+18
View File
@@ -232,6 +232,24 @@ function observeRelatedIssueField(url) {
}); });
} }
function setVisible(id, visible) {
var el = $(id);
if (el) {if (visible) {el.show();} else {el.hide();}}
}
function observeProjectModules() {
var f = function() {
/* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
var c = ($('project_enabled_module_names_issue_tracking').checked == true);
setVisible('project_trackers', c);
setVisible('project_issue_custom_fields', c);
};
Event.observe(window, 'load', f);
Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
}
/* shows and hides ajax indicator */ /* shows and hides ajax indicator */
Ajax.Responders.register({ Ajax.Responders.register({
onCreate: function(){ onCreate: function(){
+1 -4
View File
@@ -11,7 +11,7 @@ ContextMenu.prototype = {
if (!observingContextMenuClick) { if (!observingContextMenuClick) {
Event.observe(document, 'click', this.Click.bindAsEventListener(this)); Event.observe(document, 'click', this.Click.bindAsEventListener(this));
Event.observe(document, (window.opera ? 'click' : 'contextmenu'), this.RightClick.bindAsEventListener(this)); Event.observe(document, 'contextmenu', this.RightClick.bindAsEventListener(this));
observingContextMenuClick = true; observingContextMenuClick = true;
} }
@@ -23,8 +23,6 @@ ContextMenu.prototype = {
this.hideMenu(); this.hideMenu();
// do not show the context menu on links // do not show the context menu on links
if (Event.element(e).tagName == 'A') { return; } if (Event.element(e).tagName == 'A') { return; }
// right-click simulated by Alt+Click with Opera
if (window.opera && !e.altKey) { return; }
var tr = Event.findElement(e, 'tr'); var tr = Event.findElement(e, 'tr');
if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; } if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; }
Event.stop(e); Event.stop(e);
@@ -39,7 +37,6 @@ ContextMenu.prototype = {
Click: function(e) { Click: function(e) {
this.hideMenu(); this.hideMenu();
if (Event.element(e).tagName == 'A') { return; } if (Event.element(e).tagName == 'A') { return; }
if (window.opera && e.altKey) { return; }
if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) { if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {
var tr = Event.findElement(e, 'tr'); var tr = Event.findElement(e, 'tr');
if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) { if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) {
+5 -2
View File
@@ -179,6 +179,8 @@ tr.user td { white-space: nowrap; }
tr.user.locked, tr.user.registered { color: #aaa; } tr.user.locked, tr.user.registered { color: #aaa; }
tr.user.locked a, tr.user.registered a { color: #aaa; } tr.user.locked a, tr.user.registered a { color: #aaa; }
tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;}
tr.time-entry { text-align: center; white-space: nowrap; } tr.time-entry { text-align: center; white-space: nowrap; }
tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; } tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; } td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
@@ -781,6 +783,7 @@ background-image:url('../images/close_hl.png');
} }
.gantt_subjects { font-size: 0.8em; } .gantt_subjects { font-size: 0.8em; }
.gantt_subjects div { line-height:1.2em;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
.task { .task {
position: absolute; position: absolute;
@@ -912,8 +915,8 @@ h4 img.gravatar {
} }
td.username img.gravatar { td.username img.gravatar {
float: left; margin: 0 0.5em 0 0;
margin: 0 1em 0 0; vertical-align: top;
} }
#activity dt img.gravatar { #activity dt img.gravatar {
+7
View File
@@ -20,3 +20,10 @@ journal_details_003:
value: "6" value: "6"
prop_key: fixed_version_id prop_key: fixed_version_id
journal_id: 4 journal_id: 4
journal_details_005:
old_value: Old value
property: cf
id: 5
value: New value
prop_key: 2
journal_id: 3
Binary file not shown.
Binary file not shown.
+1
View File
@@ -7,6 +7,7 @@ roles_001:
--- ---
- :add_project - :add_project
- :edit_project - :edit_project
- :select_project_modules
- :manage_members - :manage_members
- :manage_versions - :manage_versions
- :manage_categories - :manage_categories
+8
View File
@@ -95,4 +95,12 @@ wiki_contents_009:
version: 1 version: 1
author_id: 1 author_id: 1
comments: comments:
wiki_contents_010:
text: Page with cyrillic title
updated_on: 2007-03-08 00:18:07 +01:00
page_id: 10
id: 10
version: 1
author_id: 1
comments:
+7 -1
View File
@@ -62,4 +62,10 @@ wiki_pages_009:
wiki_id: 2 wiki_id: 2
protected: false protected: false
parent_id: 8 parent_id: 8
wiki_pages_010:
created_on: 2007-03-08 00:18:07 +01:00
title: Этика_менеджмента
id: 10
wiki_id: 1
protected: false
parent_id:
@@ -33,6 +33,19 @@ class IssueRelationsControllerTest < ActionController::TestCase
end end
end end
def test_new_xhr
assert_difference 'IssueRelation.count' do
@request.session[:user_id] = 3
xhr :post, :new,
:issue_id => 3,
:relation => {:issue_to_id => '1', :relation_type => 'relates', :delay => ''}
assert_select_rjs 'relations' do
assert_select 'table', 1
assert_select 'tr', 2 # relations
end
end
end
def test_new_should_accept_id_with_hash def test_new_should_accept_id_with_hash
assert_difference 'IssueRelation.count' do assert_difference 'IssueRelation.count' do
@request.session[:user_id] = 3 @request.session[:user_id] = 3
@@ -68,4 +81,20 @@ class IssueRelationsControllerTest < ActionController::TestCase
post :destroy, :id => '2', :issue_id => '3' post :destroy, :id => '2', :issue_id => '3'
end end
end end
def test_destroy_xhr
IssueRelation.create!(:relation_type => IssueRelation::TYPE_RELATES) do |r|
r.issue_from_id = 3
r.issue_to_id = 1
end
assert_difference 'IssueRelation.count', -1 do
@request.session[:user_id] = 3
xhr :post, :destroy, :id => '2', :issue_id => '3'
assert_select_rjs 'relations' do
assert_select 'table', 1
assert_select 'tr', 1 # relation left
end
end
end
end end
+2 -1
View File
@@ -22,7 +22,8 @@ require 'journals_controller'
class JournalsController; def rescue_action(e) raise e end; end class JournalsController; def rescue_action(e) raise e end; end
class JournalsControllerTest < ActionController::TestCase class JournalsControllerTest < ActionController::TestCase
fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules,
:trackers, :issue_statuses, :enumerations, :custom_fields, :custom_values, :custom_fields_projects
def setup def setup
@controller = JournalsController.new @controller = JournalsController.new
+30 -3
View File
@@ -154,7 +154,8 @@ class ProjectsControllerTest < ActionController::TestCase
:custom_field_values => { '3' => 'Beta' }, :custom_field_values => { '3' => 'Beta' },
:tracker_ids => ['1', '3'], :tracker_ids => ['1', '3'],
# an issue custom field that is not for all project # an issue custom field that is not for all project
:issue_custom_field_ids => ['9'] :issue_custom_field_ids => ['9'],
:enabled_module_names => ['issue_tracking', 'news', 'repository']
} }
assert_redirected_to '/projects/blog/settings' assert_redirected_to '/projects/blog/settings'
@@ -167,6 +168,7 @@ class ProjectsControllerTest < ActionController::TestCase
assert_nil project.parent assert_nil project.parent
assert_equal 'Beta', project.custom_value_for(3).value assert_equal 'Beta', project.custom_value_for(3).value
assert_equal [1, 3], project.trackers.map(&:id).sort assert_equal [1, 3], project.trackers.map(&:id).sort
assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort
assert project.issue_custom_fields.include?(IssueCustomField.find(9)) assert project.issue_custom_fields.include?(IssueCustomField.find(9))
end end
@@ -197,7 +199,9 @@ class ProjectsControllerTest < ActionController::TestCase
:description => "weblog", :description => "weblog",
:identifier => "blog", :identifier => "blog",
:is_public => 1, :is_public => 1,
:custom_field_values => { '3' => 'Beta' } :custom_field_values => { '3' => 'Beta' },
:tracker_ids => ['1', '3'],
:enabled_module_names => ['issue_tracking', 'news', 'repository']
} }
assert_redirected_to '/projects/blog/settings' assert_redirected_to '/projects/blog/settings'
@@ -206,6 +210,8 @@ class ProjectsControllerTest < ActionController::TestCase
assert_kind_of Project, project assert_kind_of Project, project
assert_equal 'weblog', project.description assert_equal 'weblog', project.description
assert_equal true, project.is_public? assert_equal true, project.is_public?
assert_equal [1, 3], project.trackers.map(&:id).sort
assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort
# User should be added as a project member # User should be added as a project member
assert User.find(9).member_of?(project) assert User.find(9).member_of?(project)
@@ -282,6 +288,12 @@ class ProjectsControllerTest < ActionController::TestCase
end end
end end
def test_create_should_not_accept_get
@request.session[:user_id] = 1
get :create
assert_response :method_not_allowed
end
def test_show_by_id def test_show_by_id
get :show, :id => 1 get :show, :id => 1
assert_response :success assert_response :success
@@ -359,6 +371,21 @@ class ProjectsControllerTest < ActionController::TestCase
project = Project.find(1) project = Project.find(1)
assert_equal 'Test changed name', project.name assert_equal 'Test changed name', project.name
end end
def test_modules
@request.session[:user_id] = 2
Project.find(1).enabled_module_names = ['issue_tracking', 'news']
post :modules, :id => 1, :enabled_module_names => ['issue_tracking', 'repository', 'documents']
assert_redirected_to '/projects/ecookbook/settings/modules'
assert_equal ['documents', 'issue_tracking', 'repository'], Project.find(1).enabled_module_names.sort
end
def test_modules_should_not_allow_get
@request.session[:user_id] = 1
get :modules, :id => 1
assert_response :method_not_allowed
end
def test_get_destroy def test_get_destroy
@request.session[:user_id] = 1 # admin @request.session[:user_id] = 1 # admin
@@ -429,7 +456,7 @@ class ProjectsControllerTest < ActionController::TestCase
@request.session[:user_id] = 1 # admin @request.session[:user_id] = 1 # admin
post :copy, :id => 1, :project => {:name => 'Copy', :identifier => 'unique-copy'} post :copy, :id => 1, :project => {:name => 'Copy', :identifier => 'unique-copy'}
assert_response :redirect assert_response :redirect
assert_redirected_to :controller => 'projects', :action => 'settings' assert_redirected_to :controller => 'projects', :action => 'settings', :id => 'unique-copy'
end end
end end
@@ -33,9 +33,10 @@ class RepositoriesGitControllerTest < ActionController::TestCase
@request = ActionController::TestRequest.new @request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new @response = ActionController::TestResponse.new
User.current = nil User.current = nil
Repository::Git.create(:project => Project.find(3), :url => REPOSITORY_PATH) @repository = Repository::Git.create(:project => Project.find(3), :url => REPOSITORY_PATH)
assert @repository
end end
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
def test_show def test_show
get :show, :id => 3 get :show, :id => 3
@@ -126,8 +127,11 @@ class RepositoriesGitControllerTest < ActionController::TestCase
assert_not_nil assigns(:entry) assert_not_nil assigns(:entry)
assert_equal 'sources', assigns(:entry).name assert_equal 'sources', assigns(:entry).name
end end
def test_diff def test_diff
@repository.fetch_changesets
@repository.reload
# Full diff of changeset 2f9c0091 # Full diff of changeset 2f9c0091
get :diff, :id => 3, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' get :diff, :id => 3, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success assert_response :success
@@ -138,6 +142,21 @@ class RepositoriesGitControllerTest < ActionController::TestCase
:sibling => { :tag => 'td', :sibling => { :tag => 'td',
:attributes => { :class => /diff_out/ }, :attributes => { :class => /diff_out/ },
:content => /def remove/ } :content => /def remove/ }
assert_tag :tag => 'h2', :content => /2f9c0091/
end
def test_diff_two_revs
@repository.fetch_changesets
@repository.reload
get :diff, :id => 3, :rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
:rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success
assert_template 'diff'
diff = assigns(:diff)
assert_not_nil diff
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
end end
def test_annotate def test_annotate
@@ -150,13 +169,33 @@ class RepositoriesGitControllerTest < ActionController::TestCase
:sibling => { :tag => 'td', :content => /jsmith/ }, :sibling => { :tag => 'td', :content => /jsmith/ },
:sibling => { :tag => 'td', :content => /watcher =/ } :sibling => { :tag => 'td', :content => /watcher =/ }
end end
def test_annotate_binary_file def test_annotate_binary_file
get :annotate, :id => 3, :path => ['images', 'edit.png'] get :annotate, :id => 3, :path => ['images', 'edit.png']
assert_response 500 assert_response 500
assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ }, assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
:content => /can not be annotated/ :content => /can not be annotated/
end end
def test_revision
@repository.fetch_changesets
@repository.reload
['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r|
get :revision, :id => 3, :rev => r
assert_response :success
assert_template 'revision'
end
end
def test_empty_revision
@repository.fetch_changesets
@repository.reload
['', ' ', nil].each do |r|
get :revision, :id => 3, :rev => r
assert_response 404
assert_error_tag :content => /was not found/
end
end
else else
puts "Git test repository NOT FOUND. Skipping functional tests !!!" puts "Git test repository NOT FOUND. Skipping functional tests !!!"
def test_fake; assert true end def test_fake; assert true end
@@ -32,9 +32,10 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
@request = ActionController::TestRequest.new @request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new @response = ActionController::TestResponse.new
User.current = nil User.current = nil
Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH) @repository = Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH)
assert @repository
end end
if File.directory?(REPOSITORY_PATH) if File.directory?(REPOSITORY_PATH)
def test_show def test_show
get :show, :id => 3 get :show, :id => 3
@@ -49,10 +50,10 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
assert_response :success assert_response :success
assert_template 'show' assert_template 'show'
assert_not_nil assigns(:entries) assert_not_nil assigns(:entries)
assert_equal 3, assigns(:entries).size assert_equal 4, assigns(:entries).size
assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
end end
def test_show_directory def test_show_directory
@@ -74,7 +75,21 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
assert_not_nil assigns(:entries) assert_not_nil assigns(:entries)
assert_equal ['delete.png'], assigns(:entries).collect(&:name) assert_equal ['delete.png'], assigns(:entries).collect(&:name)
end end
def test_show_directory_sql_escape_percent
get :show, :id => 3, :path => ['sql_escape', 'percent%dir'], :rev => 13
assert_response :success
assert_template 'show'
assert_not_nil assigns(:entries)
assert_equal ['percent%file1.txt', 'percentfile1.txt'], assigns(:entries).collect(&:name)
changesets = assigns(:changesets)
## This is not yet implemented.
# assert_not_nil changesets
# assert_equal %w(13 11 10 9), changesets.collect(&:revision)
end
def test_changes def test_changes
get :changes, :id => 3, :path => ['images', 'edit.png'] get :changes, :id => 3, :path => ['images', 'edit.png']
assert_response :success assert_response :success
@@ -86,10 +101,10 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb'] get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb']
assert_response :success assert_response :success
assert_template 'entry' assert_template 'entry'
# Line 19 # Line 10
assert_tag :tag => 'th', assert_tag :tag => 'th',
:content => /10/, :content => '10',
:attributes => { :class => /line-num/ }, :attributes => { :class => 'line-num' },
:sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ } :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
end end
@@ -115,7 +130,7 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
assert_template 'diff' assert_template 'diff'
# Line 22 removed # Line 22 removed
assert_tag :tag => 'th', assert_tag :tag => 'th',
:content => /22/, :content => '22',
:sibling => { :tag => 'td', :sibling => { :tag => 'td',
:attributes => { :class => /diff_out/ }, :attributes => { :class => /diff_out/ },
:content => /def remove/ } :content => /def remove/ }
@@ -125,12 +140,41 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase
get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb'] get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb']
assert_response :success assert_response :success
assert_template 'annotate' assert_template 'annotate'
# Line 23, revision 4 # Line 23, revision 4:def6d2f1254a
assert_tag :tag => 'th', :content => /23/, assert_tag :tag => 'th',
:sibling => { :tag => 'td', :child => { :tag => 'a', :content => /4/ } }, :content => '23',
:sibling => { :tag => 'td', :content => /jsmith/ }, :attributes => { :class => 'line-num' },
:sibling =>
{
:tag => 'td',
:attributes => { :class => 'revision' },
:child => { :tag => 'a', :content => '4' }
# :child => { :tag => 'a', :content => /4:def6d2f1/ }
}
assert_tag :tag => 'th',
:content => '23',
:attributes => { :class => 'line-num' },
:sibling =>
{
:tag => 'td' ,
:content => 'jsmith' ,
:attributes => { :class => 'author' },
}
assert_tag :tag => 'th',
:content => '23',
:attributes => { :class => 'line-num' },
:sibling => { :tag => 'td', :content => /watcher =/ } :sibling => { :tag => 'td', :content => /watcher =/ }
end end
def test_empty_revision
@repository.fetch_changesets
@repository.reload
['', ' ', nil].each do |r|
get :revision, :id => 3, :rev => r
assert_response 404
assert_error_tag :content => /was not found/
end
end
else else
puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!" puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
def test_fake; assert true end def test_fake; assert true end
@@ -168,10 +168,24 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
def test_invalid_revision def test_invalid_revision
get :revision, :id => 1, :rev => 'something_weird' get :revision, :id => 1, :rev => 'something_weird'
assert_response 500 assert_response 404
assert_error_tag :content => /was not found/ assert_error_tag :content => /was not found/
end end
def test_invalid_revision_diff
get :diff, :id => 1, :rev => '1', :rev_to => 'something_weird'
assert_response 404
assert_error_tag :content => /was not found/
end
def test_empty_revision
['', ' ', nil].each do |r|
get :revision, :id => 1, :rev => r
assert_response 404
assert_error_tag :content => /was not found/
end
end
def test_revision_with_repository_pointing_to_a_subdirectory def test_revision_with_repository_pointing_to_a_subdirectory
r = Project.find(1).repository r = Project.find(1).repository
# Changes repository url to a subdirectory # Changes repository url to a subdirectory
@@ -198,6 +212,8 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
get :diff, :id => 1, :rev => 3 get :diff, :id => 1, :rev => 3
assert_response :success assert_response :success
assert_template 'diff' assert_template 'diff'
assert_tag :tag => 'h2', :content => /3/
end end
def test_directory_diff def test_directory_diff
@@ -209,6 +225,8 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase
assert_not_nil diff assert_not_nil diff
# 2 files modified # 2 files modified
assert_equal 2, Redmine::UnifiedDiff.new(diff).size assert_equal 2, Redmine::UnifiedDiff.new(diff).size
assert_tag :tag => 'h2', :content => /2:6/
end end
def test_annotate def test_annotate
+46 -1
View File
@@ -122,12 +122,35 @@ class ApiTest::ProjectsTest < ActionController::IntegrationTest
project = Project.first(:order => 'id DESC') project = Project.first(:order => 'id DESC')
assert_equal 'API test', project.name assert_equal 'API test', project.name
assert_equal 'api-test', project.identifier assert_equal 'api-test', project.identifier
assert_equal ['issue_tracking', 'repository'], project.enabled_module_names assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort
assert_equal Tracker.all.size, project.trackers.size
assert_response :created assert_response :created
assert_equal 'application/xml', @response.content_type assert_equal 'application/xml', @response.content_type
assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s} assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s}
end end
should "accept enabled_module_names attribute" do
@parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
assert_difference('Project.count') do
post '/projects.xml', @parameters, :authorization => credentials('admin')
end
project = Project.first(:order => 'id DESC')
assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
end
should "accept tracker_ids attribute" do
@parameters[:project].merge!({:tracker_ids => [1, 3]})
assert_difference('Project.count') do
post '/projects.xml', @parameters, :authorization => credentials('admin')
end
project = Project.first(:order => 'id DESC')
assert_equal [1, 3], project.trackers.map(&:id).sort
end
end end
end end
@@ -171,6 +194,28 @@ class ApiTest::ProjectsTest < ActionController::IntegrationTest
project = Project.find(2) project = Project.find(2)
assert_equal 'API update', project.name assert_equal 'API update', project.name
end end
should "accept enabled_module_names attribute" do
@parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
assert_no_difference 'Project.count' do
put '/projects/2.xml', @parameters, :authorization => credentials('admin')
end
assert_response :ok
project = Project.find(2)
assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
end
should "accept tracker_ids attribute" do
@parameters[:project].merge!({:tracker_ids => [1, 3]})
assert_no_difference 'Project.count' do
put '/projects/2.xml', @parameters, :authorization => credentials('admin')
end
assert_response :ok
project = Project.find(2)
assert_equal [1, 3], project.trackers.map(&:id).sort
end
end end
end end
+39 -18
View File
@@ -72,24 +72,40 @@ class ChangesetTest < ActiveSupport::TestCase
Setting.commit_ref_keywords = '*' Setting.commit_ref_keywords = '*'
Setting.commit_logtime_enabled = '1' Setting.commit_logtime_enabled = '1'
c = Changeset.new(:repository => Project.find(1).repository, {
:committed_on => 24.hours.ago, '2' => 2.0,
:comments => 'Worked on this issue #1 @2h', '2h' => 2.0,
:revision => '520', '2hours' => 2.0,
:user => User.find(2)) '15m' => 0.25,
assert_difference 'TimeEntry.count' do '15min' => 0.25,
c.scan_comment_for_issue_ids '3h15' => 3.25,
'3h15m' => 3.25,
'3h15min' => 3.25,
'3:15' => 3.25,
'3.25' => 3.25,
'3.25h' => 3.25,
'3,25' => 3.25,
'3,25h' => 3.25,
}.each do |syntax, expected_hours|
c = Changeset.new(:repository => Project.find(1).repository,
:committed_on => 24.hours.ago,
:comments => "Worked on this issue #1 @#{syntax}",
:revision => '520',
:user => User.find(2))
assert_difference 'TimeEntry.count' do
c.scan_comment_for_issue_ids
end
assert_equal [1], c.issue_ids.sort
time = TimeEntry.first(:order => 'id desc')
assert_equal 1, time.issue_id
assert_equal 1, time.project_id
assert_equal 2, time.user_id
assert_equal expected_hours, time.hours, "@#{syntax} should be logged as #{expected_hours} hours but was #{time.hours}"
assert_equal Date.yesterday, time.spent_on
assert time.activity.is_default?
assert time.comments.include?('r520'), "r520 was expected in time_entry comments: #{time.comments}"
end end
assert_equal [1], c.issue_ids.sort
time = TimeEntry.first(:order => 'id desc')
assert_equal 1, time.issue_id
assert_equal 1, time.project_id
assert_equal 2, time.user_id
assert_equal 2.0, time.hours
assert_equal Date.yesterday, time.spent_on
assert time.activity.is_default?
assert time.comments.include?('r520'), "r520 was expected in time_entry comments: #{time.comments}"
end end
def test_ref_keywords_closing_with_timelog def test_ref_keywords_closing_with_timelog
@@ -100,7 +116,7 @@ class ChangesetTest < ActiveSupport::TestCase
c = Changeset.new(:repository => Project.find(1).repository, c = Changeset.new(:repository => Project.find(1).repository,
:committed_on => Time.now, :committed_on => Time.now,
:comments => 'This is a comment. Fixes #1 @2.5, #2 @1', :comments => 'This is a comment. Fixes #1 @4.5, #2 @1',
:user => User.find(2)) :user => User.find(2))
assert_difference 'TimeEntry.count', 2 do assert_difference 'TimeEntry.count', 2 do
c.scan_comment_for_issue_ids c.scan_comment_for_issue_ids
@@ -218,4 +234,9 @@ class ChangesetTest < ActiveSupport::TestCase
c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt") c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
assert_equal "Texte encod en ISO-8859-1.", c.comments assert_equal "Texte encod en ISO-8859-1.", c.comments
end end
def test_identifier
c = Changeset.find_by_revision('1')
assert_equal c.revision, c.identifier
end
end end
@@ -610,6 +610,7 @@ EXPECTED
Date.today - 100 => 'about 3 months late', Date.today - 100 => 'about 3 months late',
Date.today - 20000 => 'over 54 years late', Date.today - 20000 => 'over 54 years late',
} }
::I18n.locale = :en
to_test.each do |date, expected| to_test.each do |date, expected|
assert_equal expected, due_date_distance_in_words(date) assert_equal expected, due_date_distance_in_words(date)
end end
@@ -0,0 +1,53 @@
require File.expand_path('../../../../../../test_helper', __FILE__)
begin
require 'mocha'
class DarcsAdapterTest < ActiveSupport::TestCase
REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
if File.directory?(REPOSITORY_PATH)
def setup
@adapter = Redmine::Scm::Adapters::DarcsAdapter.new(REPOSITORY_PATH)
end
def test_darcsversion
to_test = { "1.0.9 (release)\n" => [1,0,9] ,
"2.2.0 (release)\n" => [2,2,0] }
to_test.each do |s, v|
test_darcsversion_for(s, v)
end
end
def test_revisions
id1 = '20080308225258-98289-761f654d669045eabee90b91b53a21ce5593cadf.gz'
revs = @adapter.revisions('', nil, nil, {:with_path => true})
assert_equal 6, revs.size
assert_equal id1, revs[5].scmid
paths = revs[5].paths
assert_equal 5, paths.size
assert_equal 'A', paths[0][:action]
assert_equal '/README', paths[0][:path]
assert_equal 'A', paths[1][:action]
assert_equal '/images', paths[1][:path]
end
private
def test_darcsversion_for(darcsversion, version)
@adapter.class.expects(:darcs_binary_version_from_command_line).returns(darcsversion)
assert_equal version, @adapter.class.darcs_binary_version
end
else
puts "Darcs test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end
end
end
rescue LoadError
class DarcsMochaFake < ActiveSupport::TestCase
def test_fake; assert(false, "Requires mocha to run those tests") end
end
end
@@ -1,57 +1,70 @@
require File.expand_path('../../../../../../test_helper', __FILE__) require File.expand_path('../../../../../../test_helper', __FILE__)
begin begin
require 'mocha' require 'mocha'
class MercurialAdapterTest < ActiveSupport::TestCase class MercurialAdapterTest < ActiveSupport::TestCase
TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
def test_hgversion
to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
"Mercurial Distributed SCM (1.0)\n" => [1,0],
"Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil,
"Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1],
"Mercurial Distributed SCM (1916e629a29d)\n" => nil,
"Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5],
"(1.6)\n(1.7)\n(1.8)" => [1,6],
"(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]}
to_test.each do |s, v| REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
test_hgversion_for(s, v)
if File.directory?(REPOSITORY_PATH)
def setup
@adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
end end
end
def test_hgversion
def test_template_path to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
to_test = { [0,9,5] => "0.9.5", "Mercurial Distributed SCM (1.0)\n" => [1,0],
[1,0] => "1.0", "Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil,
[] => "1.0", "Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1],
[1,0,1] => "1.0", "Mercurial Distributed SCM (1916e629a29d)\n" => nil,
[1,7] => "1.0", "Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5],
[1,7,1] => "1.0"} "(1.6)\n(1.7)\n(1.8)" => [1,6],
to_test.each do |v, template| "(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]}
test_template_path_for(v, template)
to_test.each do |s, v|
test_hgversion_for(s, v)
end
end end
end
def test_template_path
private to_test = { [0,9,5] => "0.9.5",
[1,0] => "1.0",
def test_hgversion_for(hgversion, version) [] => "1.0",
Redmine::Scm::Adapters::MercurialAdapter.expects(:hgversion_from_command_line).returns(hgversion) [1,0,1] => "1.0",
adapter = Redmine::Scm::Adapters::MercurialAdapter [1,7] => "1.0",
assert_equal version, adapter.hgversion [1,7,1] => "1.0" }
end to_test.each do |v, template|
test_template_path_for(v, template)
def test_template_path_for(version, template) end
adapter = Redmine::Scm::Adapters::MercurialAdapter end
assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}", adapter.template_path_for(version)
assert File.exist?(adapter.template_path_for(version)) def test_cat
assert @adapter.cat("sources/welcome_controller.rb", 2)
assert_nil @adapter.cat("sources/welcome_controller.rb")
end
private
def test_hgversion_for(hgversion, version)
@adapter.class.expects(:hgversion_from_command_line).returns(hgversion)
assert_equal version, @adapter.class.hgversion
end
def test_template_path_for(version, template)
assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
@adapter.class.template_path_for(version)
assert File.exist?(@adapter.class.template_path_for(version))
end
else
puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end
end end
end end
rescue LoadError rescue LoadError
class MercurialMochaFake < ActiveSupport::TestCase class MercurialMochaFake < ActiveSupport::TestCase
def test_fake; assert(false, "Requires mocha to run those tests") end def test_fake; assert(false, "Requires mocha to run those tests") end
+94 -34
View File
@@ -19,40 +19,100 @@ require File.expand_path('../../test_helper', __FILE__)
class ProjectNestedSetTest < ActiveSupport::TestCase class ProjectNestedSetTest < ActiveSupport::TestCase
def setup context "nested set" do
Project.delete_all setup do
end Project.delete_all
def test_destroy_root_and_chldren_should_not_mess_up_the_tree @a = Project.create!(:name => 'Project A', :identifier => 'projecta')
a = Project.create!(:name => 'Project A', :identifier => 'projecta') @a1 = Project.create!(:name => 'Project A1', :identifier => 'projecta1')
a1 = Project.create!(:name => 'Project A1', :identifier => 'projecta1') @a1.set_parent!(@a)
a2 = Project.create!(:name => 'Project A2', :identifier => 'projecta2') @a2 = Project.create!(:name => 'Project A2', :identifier => 'projecta2')
a1.set_parent!(a) @a2.set_parent!(@a)
a2.set_parent!(a)
b = Project.create!(:name => 'Project B', :identifier => 'projectb') @b = Project.create!(:name => 'Project B', :identifier => 'projectb')
b1 = Project.create!(:name => 'Project B1', :identifier => 'projectb1') @b1 = Project.create!(:name => 'Project B1', :identifier => 'projectb1')
b1.set_parent!(b) @b1.set_parent!(@b)
@b11 = Project.create!(:name => 'Project B11', :identifier => 'projectb11')
a.reload @b11.set_parent!(@b1)
a1.reload @b2 = Project.create!(:name => 'Project B2', :identifier => 'projectb2')
a2.reload @b2.set_parent!(@b)
b.reload
b1.reload @c = Project.create!(:name => 'Project C', :identifier => 'projectc')
@c1 = Project.create!(:name => 'Project C1', :identifier => 'projectc1')
assert_equal [nil, 1, 6], [a.parent_id, a.lft, a.rgt] @c1.set_parent!(@c)
assert_equal [a.id, 2, 3], [a1.parent_id, a1.lft, a1.rgt]
assert_equal [a.id, 4, 5], [a2.parent_id, a2.lft, a2.rgt] [@a, @a1, @a2, @b, @b1, @b11, @b2, @c, @c1].each(&:reload)
assert_equal [nil, 7, 10], [b.parent_id, b.lft, b.rgt]
assert_equal [b.id, 8, 9], [b1.parent_id, b1.lft, b1.rgt]
assert_difference 'Project.count', -3 do
a.destroy
end end
b.reload context "#create" do
b1.reload should "build valid tree" do
assert_nested_set_values({
assert_equal [nil, 1, 4], [b.parent_id, b.lft, b.rgt] @a => [nil, 1, 6],
assert_equal [b.id, 2, 3], [b1.parent_id, b1.lft, b1.rgt] @a1 => [@a.id, 2, 3],
@a2 => [@a.id, 4, 5],
@b => [nil, 7, 14],
@b1 => [@b.id, 8, 11],
@b11 => [@b1.id,9, 10],
@b2 => [@b.id,12, 13],
@c => [nil, 15, 18],
@c1 => [@c.id,16, 17]
})
end
end
context "#set_parent!" do
should "keep valid tree" do
assert_no_difference 'Project.count' do
Project.find_by_name('Project B1').set_parent!(Project.find_by_name('Project A2'))
end
assert_nested_set_values({
@a => [nil, 1, 10],
@a2 => [@a.id, 4, 9],
@b1 => [@a2.id,5, 8],
@b11 => [@b1.id,6, 7],
@b => [nil, 11, 14],
@c => [nil, 15, 18]
})
end
end
context "#destroy" do
context "a root with children" do
should "not mess up the tree" do
assert_difference 'Project.count', -4 do
Project.find_by_name('Project B').destroy
end
assert_nested_set_values({
@a => [nil, 1, 6],
@a1 => [@a.id, 2, 3],
@a2 => [@a.id, 4, 5],
@c => [nil, 7, 10],
@c1 => [@c.id, 8, 9]
})
end
end
context "a child with children" do
should "not mess up the tree" do
assert_difference 'Project.count', -2 do
Project.find_by_name('Project B1').destroy
end
assert_nested_set_values({
@a => [nil, 1, 6],
@b => [nil, 7, 10],
@b2 => [@b.id, 8, 9],
@c => [nil, 11, 14]
})
end
end
end
end end
end
def assert_nested_set_values(h)
assert Project.valid?
h.each do |project, expected|
project.reload
assert_equal expected, [project.parent_id, project.lft, project.rgt], "Unexpected nested set values for #{project.name}"
end
end
end
+16
View File
@@ -770,6 +770,22 @@ class ProjectTest < ActiveSupport::TestCase
assert_equal @project, membership.project assert_equal @project, membership.project
end end
end end
should "copy memberships with groups and additional roles" do
group = Group.create!(:lastname => "Copy group")
user = User.find(7)
group.users << user
# group role
Member.create!(:project_id => @source_project.id, :principal => group, :role_ids => [2])
member = Member.find_by_user_id_and_project_id(user.id, @source_project.id)
# additional role
member.role_ids = [1]
assert @project.copy(@source_project)
member = Member.find_by_user_id_and_project_id(user.id, @project.id)
assert_not_nil member
assert_equal [1, 2], member.role_ids.sort
end
should "copy project specific queries" do should "copy project specific queries" do
assert @project.valid? assert @project.valid?
+32 -2
View File
@@ -484,7 +484,6 @@ class QueryTest < ActiveSupport::TestCase
# Users not in a group # Users not in a group
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')" assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
assert_find_issues_with_query_is_successful @query assert_find_issues_with_query_is_successful @query
end end
should "search assigned to any group member (all)" do should "search assigned to any group member (all)" do
@@ -494,7 +493,22 @@ class QueryTest < ActiveSupport::TestCase
# Only users in a group # Only users in a group
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')" assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
assert_find_issues_with_query_is_successful @query assert_find_issues_with_query_is_successful @query
end
should "return an empty set with = empty group" do
@empty_group = Group.generate!
@query = Query.new(:name => '_')
@query.add_filter('member_of_group', '=', [@empty_group.id.to_s])
assert_equal [], find_issues_with_query(@query)
end
should "return issues with ! empty group" do
@empty_group = Group.generate!
@query = Query.new(:name => '_')
@query.add_filter('member_of_group', '!', [@empty_group.id.to_s])
assert_find_issues_with_query_is_successful @query
end end
end end
@@ -540,6 +554,22 @@ class QueryTest < ActiveSupport::TestCase
assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
assert_find_issues_with_query_is_successful @query assert_find_issues_with_query_is_successful @query
end end
should "return an empty set with empty role" do
@empty_role = Role.generate!
@query = Query.new(:name => '_')
@query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s])
assert_equal [], find_issues_with_query(@query)
end
should "return issues with ! empty role" do
@empty_role = Role.generate!
@query = Query.new(:name => '_')
@query.add_filter('member_of_group', '!', [@empty_role.id.to_s])
assert_find_issues_with_query_is_successful @query
end
end end
end end
+1 -1
View File
@@ -77,7 +77,7 @@ class RepositoryBazaarTest < ActiveSupport::TestCase
def test_annotate def test_annotate
annotate = @repository.scm.annotate('doc-mkdir.txt') annotate = @repository.scm.annotate('doc-mkdir.txt')
assert_equal 17, annotate.lines.size assert_equal 17, annotate.lines.size
assert_equal 1, annotate.revisions[0].identifier assert_equal '1', annotate.revisions[0].identifier
assert_equal 'jsmith@', annotate.revisions[0].author assert_equal 'jsmith@', annotate.revisions[0].author
assert_equal 'mkdir', annotate.lines[0] assert_equal 'mkdir', annotate.lines[0]
end end
+7 -5
View File
@@ -54,12 +54,14 @@ class RepositoryDarcsTest < ActiveSupport::TestCase
assert entries.detect {|e| e.name == 'watchers_controller.rb'} assert entries.detect {|e| e.name == 'watchers_controller.rb'}
assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'} assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'}
end end
def test_cat def test_cat
@repository.fetch_changesets if @repository.scm.supports_cat?
cat = @repository.cat("sources/welcome_controller.rb", 2) @repository.fetch_changesets
assert_not_nil cat cat = @repository.cat("sources/welcome_controller.rb", 2)
assert cat.include?('class WelcomeController < ApplicationController') assert_not_nil cat
assert cat.include?('class WelcomeController < ApplicationController')
end
end end
else else
puts "Darcs test repository NOT FOUND. Skipping unit tests !!!" puts "Darcs test repository NOT FOUND. Skipping unit tests !!!"
+42 -1
View File
@@ -18,7 +18,7 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class RepositoryGitTest < ActiveSupport::TestCase class RepositoryGitTest < ActiveSupport::TestCase
fixtures :projects fixtures :projects, :repositories, :enabled_modules, :users, :roles
# No '..' in the repository path # No '..' in the repository path
REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository' REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
@@ -62,6 +62,47 @@ class RepositoryGitTest < ActiveSupport::TestCase
@repository.fetch_changesets @repository.fetch_changesets
assert_equal 15, @repository.changesets.count assert_equal 15, @repository.changesets.count
end end
def test_find_changeset_by_name
@repository.fetch_changesets
@repository.reload
['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r|
assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518',
@repository.find_changeset_by_name(r).revision
end
end
def test_find_changeset_by_empty_name
@repository.fetch_changesets
@repository.reload
['', ' ', nil].each do |r|
assert_nil @repository.find_changeset_by_name(r)
end
end
def test_identifier
@repository.fetch_changesets
@repository.reload
c = @repository.changesets.find_by_revision('7234cb2750b63f47bff735edc50a1c0a433c2518')
assert_equal c.scmid, c.identifier
end
def test_format_identifier
@repository.fetch_changesets
@repository.reload
c = @repository.changesets.find_by_revision('7234cb2750b63f47bff735edc50a1c0a433c2518')
assert_equal '7234cb27', c.format_identifier
end
def test_activities
c = Changeset.new(:repository => @repository,
:committed_on => Time.now,
:revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
:scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
:comments => 'test')
assert c.event_title.include?('abc7234c:')
assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
end
else else
puts "Git test repository NOT FOUND. Skipping unit tests !!!" puts "Git test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end def test_fake; assert true end
+56 -10
View File
@@ -33,8 +33,8 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
@repository.fetch_changesets @repository.fetch_changesets
@repository.reload @repository.reload
assert_equal 6, @repository.changesets.count assert_equal 17, @repository.changesets.count
assert_equal 11, @repository.changes.count assert_equal 25, @repository.changes.count
assert_equal "Initial import.\nThe repository contains 3 files.", @repository.changesets.find_by_revision('0').comments assert_equal "Initial import.\nThe repository contains 3 files.", @repository.changesets.find_by_revision('0').comments
end end
@@ -46,7 +46,7 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
assert_equal 3, @repository.changesets.count assert_equal 3, @repository.changesets.count
@repository.fetch_changesets @repository.fetch_changesets
assert_equal 6, @repository.changesets.count assert_equal 17, @repository.changesets.count
end end
def test_entries def test_entries
@@ -55,18 +55,11 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
end end
def test_locate_on_outdated_repository def test_locate_on_outdated_repository
# Change the working dir state
%x{hg -R #{REPOSITORY_PATH} up -r 0}
assert_equal 1, @repository.entries("images", 0).size assert_equal 1, @repository.entries("images", 0).size
assert_equal 2, @repository.entries("images").size assert_equal 2, @repository.entries("images").size
assert_equal 2, @repository.entries("images", 2).size assert_equal 2, @repository.entries("images", 2).size
end end
def test_cat
assert @repository.scm.cat("sources/welcome_controller.rb", 2)
assert_nil @repository.scm.cat("sources/welcome_controller.rb")
end
def test_isodatesec def test_isodatesec
# Template keyword 'isodatesec' supported in Mercurial 1.0 and higher # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
if @repository.scm.class.client_version_above?([1, 0]) if @repository.scm.class.client_version_above?([1, 0])
@@ -76,6 +69,59 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
end end
end end
def test_changeset_order_by_revision
@repository.fetch_changesets
@repository.reload
c0 = @repository.latest_changeset
c1 = @repository.changesets.find_by_revision('0')
# sorted by revision (id), not by date
assert c0.revision.to_i > c1.revision.to_i
assert c0.committed_on < c1.committed_on
end
def test_latest_changesets
@repository.fetch_changesets
@repository.reload
# with_limit
changesets = @repository.latest_changesets('', nil, 2)
assert_equal @repository.latest_changesets('', nil)[0, 2], changesets
# with_filepath
changesets = @repository.latest_changesets('/sql_escape/percent%dir/percent%file1.txt', nil)
assert_equal %w|11 10 9|, changesets.collect(&:revision)
changesets = @repository.latest_changesets('/sql_escape/underscore_dir/understrike_file.txt', nil)
assert_equal %w|12 9|, changesets.collect(&:revision)
end
def test_copied_files
@repository.fetch_changesets
@repository.reload
cs1 = @repository.changesets.find_by_revision('13')
assert_not_nil cs1
c1 = cs1.changes.sort_by(&:path)
assert_equal 2, c1.size
assert_equal 'A', c1[0].action
assert_equal '/sql_escape/percent%dir/percentfile1.txt', c1[0].path
assert_equal '/sql_escape/percent%dir/percent%file1.txt', c1[0].from_path
assert_equal 'A', c1[1].action
assert_equal '/sql_escape/underscore_dir/understrike-file.txt', c1[1].path
assert_equal '/sql_escape/underscore_dir/understrike_file.txt', c1[1].from_path
cs2 = @repository.changesets.find_by_revision('15')
c2 = cs2.changes
assert_equal 1, c2.size
assert_equal 'A', c2[0].action
assert_equal '/README (1)[2]&,%.-3_4', c2[0].path
assert_equal '/README', c2[0].from_path
end
else else
puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!" puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end def test_fake; assert true end
+49 -1
View File
@@ -18,7 +18,7 @@
require File.expand_path('../../test_helper', __FILE__) require File.expand_path('../../test_helper', __FILE__)
class RepositorySubversionTest < ActiveSupport::TestCase class RepositorySubversionTest < ActiveSupport::TestCase
fixtures :projects, :repositories fixtures :projects, :repositories, :enabled_modules, :users, :roles
def setup def setup
@project = Project.find(1) @project = Project.find(1)
@@ -88,6 +88,54 @@ class RepositorySubversionTest < ActiveSupport::TestCase
assert_equal 1, entries.size, 'Expect a single entry' assert_equal 1, entries.size, 'Expect a single entry'
assert_equal 'README.txt', entries.first.name assert_equal 'README.txt', entries.first.name
end end
def test_identifier
@repository.fetch_changesets
@repository.reload
c = @repository.changesets.find_by_revision('1')
assert_equal c.revision, c.identifier
end
def test_find_changeset_by_empty_name
@repository.fetch_changesets
@repository.reload
['', ' ', nil].each do |r|
assert_nil @repository.find_changeset_by_name(r)
end
end
def test_identifier_nine_digit
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
:revision => '123456789', :comments => 'test')
assert_equal c.identifier, c.revision
end
def test_format_identifier
@repository.fetch_changesets
@repository.reload
c = @repository.changesets.find_by_revision('1')
assert_equal c.format_identifier, c.revision
end
def test_format_identifier_nine_digit
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
:revision => '123456789', :comments => 'test')
assert_equal c.format_identifier, c.revision
end
def test_activities
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
:revision => '1', :comments => 'test')
assert c.event_title.include?('1:')
assert_equal '1', c.event_url[:rev]
end
def test_activities_nine_digit
c = Changeset.new(:repository => @repository, :committed_on => Time.now,
:revision => '123456789', :comments => 'test')
assert c.event_title.include?('123456789:')
assert_equal '123456789', c.event_url[:rev]
end
else else
puts "Subversion test repository NOT FOUND. Skipping unit tests !!!" puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
def test_fake; assert true end def test_fake; assert true end
+36
View File
@@ -48,6 +48,42 @@ class TimeEntryTest < ActiveSupport::TestCase
def test_hours_should_default_to_nil def test_hours_should_default_to_nil
assert_nil TimeEntry.new.hours assert_nil TimeEntry.new.hours
end end
def test_spent_on_with_blank
c = TimeEntry.new
c.spent_on = ''
assert_nil c.spent_on
end
def test_spent_on_with_nil
c = TimeEntry.new
c.spent_on = nil
assert_nil c.spent_on
end
def test_spent_on_with_string
c = TimeEntry.new
c.spent_on = "2011-01-14"
assert_equal Date.parse("2011-01-14"), c.spent_on
end
def test_spent_on_with_invalid_string
c = TimeEntry.new
c.spent_on = "foo"
assert_nil c.spent_on
end
def test_spent_on_with_date
c = TimeEntry.new
c.spent_on = Date.today
assert_equal Date.today, c.spent_on
end
def test_spent_on_with_time
c = TimeEntry.new
c.spent_on = Time.now
assert_equal Date.today, c.spent_on
end
context "#earilest_date_for_project" do context "#earilest_date_for_project" do
setup do setup do
+32 -2
View File
@@ -1,5 +1,5 @@
# redMine - project management software # Redmine - project management software
# Copyright (C) 2006 Jean-Philippe Lang # Copyright (C) 2006-2011 Jean-Philippe Lang
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@@ -303,6 +303,19 @@ class UserTest < ActiveSupport::TestCase
assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?} assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?}
end end
def test_valid_notification_options
# without memberships
assert_equal 5, User.find(7).valid_notification_options.size
# with memberships
assert_equal 6, User.find(2).valid_notification_options.size
end
def test_valid_notification_options_class_method
assert_equal 5, User.valid_notification_options.size
assert_equal 5, User.valid_notification_options(User.find(7)).size
assert_equal 6, User.valid_notification_options(User.find(2)).size
end
def test_mail_notification_all def test_mail_notification_all
@jsmith.mail_notification = 'all' @jsmith.mail_notification = 'all'
@jsmith.notified_project_ids = [] @jsmith.notified_project_ids = []
@@ -455,6 +468,7 @@ class UserTest < ActiveSupport::TestCase
should "be false for a user with :only_my_events and isn't an author, creator, or assignee" do should "be false for a user with :only_my_events and isn't an author, creator, or assignee" do
@user = User.generate_with_protected!(:mail_notification => 'only_my_events') @user = User.generate_with_protected!(:mail_notification => 'only_my_events')
Member.create!(:user => @user, :project => @project, :role_ids => [1])
assert ! @user.notify_about?(@issue) assert ! @user.notify_about?(@issue)
end end
@@ -487,6 +501,22 @@ class UserTest < ActiveSupport::TestCase
@assignee.update_attribute(:mail_notification, 'only_owner') @assignee.update_attribute(:mail_notification, 'only_owner')
assert ! @assignee.notify_about?(@issue) assert ! @assignee.notify_about?(@issue)
end end
should "be true for a user with :selected and is the author" do
@author.update_attribute(:mail_notification, 'selected')
assert @author.notify_about?(@issue)
end
should "be true for a user with :selected and is the assignee" do
@assignee.update_attribute(:mail_notification, 'selected')
assert @assignee.notify_about?(@issue)
end
should "be false for a user with :selected and is not the author or assignee" do
@user = User.generate_with_protected!(:mail_notification => 'selected')
Member.create!(:user => @user, :project => @project, :role_ids => [1])
assert ! @user.notify_about?(@issue)
end
end end
context "other events" do context "other events" do
+5 -5
View File
@@ -60,15 +60,15 @@ class WatcherTest < ActiveSupport::TestCase
assert @issue.watcher_recipients.empty? assert @issue.watcher_recipients.empty?
assert @issue.add_watcher(@user) assert @issue.add_watcher(@user)
@user.mail_notification = true @user.mail_notification = 'all'
@user.save @user.save!
@issue.reload @issue.reload
assert @issue.watcher_recipients.include?(@user.mail) assert @issue.watcher_recipients.include?(@user.mail)
@user.mail_notification = false @user.mail_notification = 'none'
@user.save @user.save!
@issue.reload @issue.reload
assert @issue.watcher_recipients.include?(@user.mail) assert !@issue.watcher_recipients.include?(@user.mail)
end end
def test_unwatch def test_unwatch
+3
View File
@@ -46,6 +46,9 @@ class WikiTest < ActiveSupport::TestCase
assert_equal page, wiki.find_page('Another_page') assert_equal page, wiki.find_page('Another_page')
assert_equal page, wiki.find_page('Another page') assert_equal page, wiki.find_page('Another page')
assert_equal page, wiki.find_page('ANOTHER page') assert_equal page, wiki.find_page('ANOTHER page')
page = WikiPage.find(10)
assert_equal page, wiki.find_page('Этика_менеджмента')
end end
def test_titleize def test_titleize

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