changeset 245:051f544170fe

* Update to SVN trunk revision 4993
author Chris Cannam
date Thu, 03 Mar 2011 11:42:28 +0000
parents 8972b600f4fb
children eeebe205a056 cbce1fd3b1b7 9ee5fd0b9bd3
files .gitignore .hgignore .svn/all-wcprops .svn/entries .svn/text-base/.gitignore.svn-base .svn/text-base/.hgignore.svn-base .svn/tmp/.hgignore.tmp app/.svn/all-wcprops app/.svn/entries app/controllers/.svn/all-wcprops app/controllers/.svn/entries app/controllers/.svn/text-base/journals_controller.rb.svn-base app/controllers/.svn/text-base/repositories_controller.rb.svn-base app/controllers/.svn/text-base/workflows_controller.rb.svn-base app/controllers/journals_controller.rb app/controllers/repositories_controller.rb app/controllers/workflows_controller.rb app/helpers/.svn/all-wcprops app/helpers/.svn/entries app/helpers/.svn/text-base/application_helper.rb.svn-base app/helpers/.svn/text-base/issues_helper.rb.svn-base app/helpers/.svn/text-base/repositories_helper.rb.svn-base app/helpers/.svn/text-base/wiki_helper.rb.svn-base app/helpers/application_helper.rb app/helpers/issues_helper.rb app/helpers/repositories_helper.rb app/helpers/wiki_helper.rb app/models/.svn/all-wcprops app/models/.svn/entries app/models/.svn/text-base/auth_source.rb.svn-base app/models/.svn/text-base/auth_source_ldap.rb.svn-base app/models/.svn/text-base/changeset.rb.svn-base app/models/.svn/text-base/issue.rb.svn-base app/models/.svn/text-base/issue_status.rb.svn-base app/models/.svn/text-base/journal_detail.rb.svn-base app/models/.svn/text-base/mail_handler.rb.svn-base app/models/.svn/text-base/query.rb.svn-base app/models/.svn/text-base/repository.rb.svn-base app/models/.svn/text-base/setting.rb.svn-base app/models/.svn/text-base/user.rb.svn-base app/models/.svn/text-base/user_preference.rb.svn-base app/models/.svn/text-base/wiki_page.rb.svn-base app/models/auth_source.rb app/models/auth_source_ldap.rb app/models/changeset.rb app/models/issue.rb app/models/issue_status.rb app/models/journal_detail.rb app/models/mail_handler.rb app/models/query.rb app/models/repository.rb app/models/repository/.svn/all-wcprops app/models/repository/.svn/entries app/models/repository/.svn/text-base/bazaar.rb.svn-base app/models/repository/.svn/text-base/cvs.rb.svn-base app/models/repository/.svn/text-base/darcs.rb.svn-base app/models/repository/.svn/text-base/filesystem.rb.svn-base app/models/repository/.svn/text-base/git.rb.svn-base app/models/repository/.svn/text-base/mercurial.rb.svn-base app/models/repository/.svn/text-base/subversion.rb.svn-base app/models/repository/bazaar.rb app/models/repository/cvs.rb app/models/repository/darcs.rb app/models/repository/filesystem.rb app/models/repository/git.rb app/models/repository/mercurial.rb app/models/repository/subversion.rb app/models/setting.rb app/models/user.rb app/models/user_preference.rb app/models/wiki_page.rb app/sweepers/.svn/entries app/views/.svn/all-wcprops app/views/.svn/entries app/views/account/.svn/entries app/views/activities/.svn/entries app/views/admin/.svn/entries app/views/attachments/.svn/entries app/views/auth_sources/.svn/entries app/views/auto_completes/.svn/entries app/views/boards/.svn/all-wcprops app/views/boards/.svn/entries app/views/boards/.svn/text-base/show.rhtml.svn-base app/views/boards/show.rhtml app/views/calendars/.svn/all-wcprops app/views/calendars/.svn/entries app/views/calendars/.svn/text-base/show.html.erb.svn-base app/views/calendars/show.html.erb app/views/common/.svn/entries app/views/context_menus/.svn/entries app/views/custom_fields/.svn/entries app/views/documents/.svn/entries app/views/enumerations/.svn/entries app/views/files/.svn/entries app/views/gantts/.svn/all-wcprops app/views/gantts/.svn/entries app/views/gantts/.svn/text-base/show.html.erb.svn-base app/views/gantts/show.html.erb app/views/groups/.svn/entries app/views/issue_categories/.svn/entries app/views/issue_moves/.svn/entries app/views/issue_relations/.svn/entries app/views/issue_statuses/.svn/entries app/views/issues/.svn/all-wcprops app/views/issues/.svn/entries app/views/issues/.svn/text-base/_sidebar.rhtml.svn-base app/views/issues/_sidebar.rhtml app/views/journals/.svn/all-wcprops app/views/journals/.svn/entries app/views/journals/.svn/prop-base/diff.html.erb.svn-base app/views/journals/.svn/text-base/diff.html.erb.svn-base app/views/journals/diff.html.erb app/views/layouts/.svn/all-wcprops app/views/layouts/.svn/entries app/views/layouts/.svn/text-base/base.rhtml.svn-base app/views/layouts/base.rhtml app/views/ldap_auth_sources/.svn/entries app/views/mailer/.svn/all-wcprops app/views/mailer/.svn/entries app/views/mailer/.svn/text-base/_issue_text_html.rhtml.svn-base app/views/mailer/.svn/text-base/_issue_text_plain.rhtml.svn-base app/views/mailer/_issue_text_html.rhtml app/views/mailer/_issue_text_plain.rhtml app/views/members/.svn/entries app/views/messages/.svn/all-wcprops app/views/messages/.svn/entries app/views/messages/.svn/text-base/edit.rhtml.svn-base app/views/messages/edit.rhtml app/views/my/.svn/entries app/views/my/blocks/.svn/entries app/views/news/.svn/entries app/views/previews/.svn/entries app/views/projects/.svn/entries app/views/projects/settings/.svn/entries app/views/queries/.svn/entries app/views/reports/.svn/entries app/views/repositories/.svn/all-wcprops app/views/repositories/.svn/entries app/views/repositories/.svn/text-base/_dir_list_content.rhtml.svn-base app/views/repositories/_dir_list_content.rhtml app/views/roles/.svn/entries app/views/search/.svn/entries app/views/settings/.svn/all-wcprops app/views/settings/.svn/entries app/views/settings/.svn/text-base/_display.rhtml.svn-base app/views/settings/.svn/text-base/_repositories.rhtml.svn-base app/views/settings/_display.rhtml app/views/settings/_repositories.rhtml app/views/time_entry_reports/.svn/entries app/views/timelog/.svn/entries app/views/trackers/.svn/entries app/views/users/.svn/all-wcprops app/views/users/.svn/entries app/views/users/.svn/text-base/_preferences.html.erb.svn-base app/views/users/_preferences.html.erb app/views/versions/.svn/entries app/views/watchers/.svn/entries app/views/welcome/.svn/entries app/views/wiki/.svn/all-wcprops app/views/wiki/.svn/entries app/views/wiki/.svn/text-base/diff.rhtml.svn-base app/views/wiki/diff.rhtml app/views/wikis/.svn/entries app/views/workflows/.svn/all-wcprops app/views/workflows/.svn/entries app/views/workflows/.svn/prop-base/_form.html.erb.svn-base app/views/workflows/.svn/text-base/_form.html.erb.svn-base app/views/workflows/.svn/text-base/edit.rhtml.svn-base app/views/workflows/.svn/text-base/index.rhtml.svn-base app/views/workflows/_form.html.erb app/views/workflows/edit.rhtml app/views/workflows/index.rhtml config/.svn/all-wcprops config/.svn/entries config/.svn/text-base/configuration.yml.example.svn-base config/.svn/text-base/environment.rb.svn-base config/configuration.yml.example config/environment.rb config/environments/.svn/entries config/initializers/.svn/all-wcprops config/initializers/.svn/entries config/initializers/.svn/text-base/10-patches.rb.svn-base config/initializers/10-patches.rb config/locales/.svn/all-wcprops config/locales/.svn/entries config/locales/.svn/prop-base/fa.yml.svn-base config/locales/.svn/text-base/bg.yml.svn-base config/locales/.svn/text-base/bs.yml.svn-base config/locales/.svn/text-base/ca.yml.svn-base config/locales/.svn/text-base/cs.yml.svn-base config/locales/.svn/text-base/da.yml.svn-base config/locales/.svn/text-base/de.yml.svn-base config/locales/.svn/text-base/el.yml.svn-base config/locales/.svn/text-base/en-GB.yml.svn-base config/locales/.svn/text-base/en.yml.svn-base config/locales/.svn/text-base/es.yml.svn-base config/locales/.svn/text-base/eu.yml.svn-base config/locales/.svn/text-base/fa.yml.svn-base config/locales/.svn/text-base/fi.yml.svn-base config/locales/.svn/text-base/fr.yml.svn-base config/locales/.svn/text-base/gl.yml.svn-base config/locales/.svn/text-base/he.yml.svn-base config/locales/.svn/text-base/hr.yml.svn-base config/locales/.svn/text-base/hu.yml.svn-base config/locales/.svn/text-base/id.yml.svn-base config/locales/.svn/text-base/it.yml.svn-base config/locales/.svn/text-base/ja.yml.svn-base config/locales/.svn/text-base/ko.yml.svn-base config/locales/.svn/text-base/lt.yml.svn-base config/locales/.svn/text-base/lv.yml.svn-base config/locales/.svn/text-base/mk.yml.svn-base config/locales/.svn/text-base/mn.yml.svn-base config/locales/.svn/text-base/nl.yml.svn-base config/locales/.svn/text-base/no.yml.svn-base config/locales/.svn/text-base/pl.yml.svn-base config/locales/.svn/text-base/pt-BR.yml.svn-base config/locales/.svn/text-base/pt.yml.svn-base config/locales/.svn/text-base/ro.yml.svn-base config/locales/.svn/text-base/ru.yml.svn-base config/locales/.svn/text-base/sk.yml.svn-base config/locales/.svn/text-base/sl.yml.svn-base config/locales/.svn/text-base/sr-YU.yml.svn-base config/locales/.svn/text-base/sr.yml.svn-base config/locales/.svn/text-base/sv.yml.svn-base config/locales/.svn/text-base/th.yml.svn-base config/locales/.svn/text-base/tr.yml.svn-base config/locales/.svn/text-base/uk.yml.svn-base config/locales/.svn/text-base/vi.yml.svn-base config/locales/.svn/text-base/zh-TW.yml.svn-base config/locales/.svn/text-base/zh.yml.svn-base config/locales/bg.yml config/locales/bs.yml config/locales/ca.yml config/locales/cs.yml config/locales/da.yml config/locales/de.yml config/locales/el.yml config/locales/en-GB.yml config/locales/en.yml config/locales/es.yml config/locales/eu.yml config/locales/fa.yml config/locales/fi.yml config/locales/fr.yml config/locales/gl.yml config/locales/he.yml config/locales/hr.yml config/locales/hu.yml config/locales/id.yml config/locales/it.yml config/locales/ja.yml config/locales/ko.yml config/locales/lt.yml config/locales/lv.yml config/locales/mk.yml config/locales/mn.yml config/locales/nl.yml config/locales/no.yml config/locales/pl.yml config/locales/pt-BR.yml config/locales/pt.yml config/locales/ro.yml config/locales/ru.yml config/locales/sk.yml config/locales/sl.yml config/locales/sr-YU.yml config/locales/sr.yml config/locales/sv.yml config/locales/th.yml config/locales/tr.yml config/locales/uk.yml config/locales/vi.yml config/locales/zh-TW.yml config/locales/zh.yml db/.svn/all-wcprops db/.svn/entries db/migrate/.svn/all-wcprops db/migrate/.svn/entries db/migrate/.svn/prop-base/20110220160626_add_workflows_assignee_and_author.rb.svn-base db/migrate/.svn/prop-base/20110223180944_add_users_salt.rb.svn-base db/migrate/.svn/prop-base/20110223180953_salt_user_passwords.rb.svn-base db/migrate/.svn/prop-base/20110226120112_change_repositories_password_limit.rb.svn-base db/migrate/.svn/prop-base/20110226120132_change_auth_sources_account_password_limit.rb.svn-base db/migrate/.svn/prop-base/20110227125750_change_journal_details_values_to_text.rb.svn-base db/migrate/.svn/text-base/20110220160626_add_workflows_assignee_and_author.rb.svn-base db/migrate/.svn/text-base/20110223180944_add_users_salt.rb.svn-base db/migrate/.svn/text-base/20110223180953_salt_user_passwords.rb.svn-base db/migrate/.svn/text-base/20110224000000_add_repositories_path_encoding.rb.svn-base db/migrate/.svn/text-base/20110226120112_change_repositories_password_limit.rb.svn-base db/migrate/.svn/text-base/20110226120132_change_auth_sources_account_password_limit.rb.svn-base db/migrate/.svn/text-base/20110227125750_change_journal_details_values_to_text.rb.svn-base db/migrate/.svn/text-base/20110228000000_add_repositories_log_encoding.rb.svn-base db/migrate/.svn/text-base/20110228000100_copy_repositories_log_encoding.rb.svn-base db/migrate/20110220160626_add_workflows_assignee_and_author.rb db/migrate/20110223180944_add_users_salt.rb db/migrate/20110223180953_salt_user_passwords.rb db/migrate/20110224000000_add_repositories_path_encoding.rb db/migrate/20110226120112_change_repositories_password_limit.rb db/migrate/20110226120132_change_auth_sources_account_password_limit.rb db/migrate/20110227125750_change_journal_details_values_to_text.rb db/migrate/20110228000000_add_repositories_log_encoding.rb db/migrate/20110228000100_copy_repositories_log_encoding.rb doc/.svn/entries extra/.svn/all-wcprops extra/.svn/entries extra/mail_handler/.svn/entries extra/sample_plugin/.svn/entries extra/sample_plugin/app/.svn/entries extra/sample_plugin/app/controllers/.svn/entries extra/sample_plugin/app/models/.svn/entries extra/sample_plugin/app/views/.svn/entries extra/sample_plugin/app/views/example/.svn/entries extra/sample_plugin/app/views/my/.svn/entries extra/sample_plugin/app/views/my/blocks/.svn/entries extra/sample_plugin/app/views/settings/.svn/entries extra/sample_plugin/assets/.svn/entries extra/sample_plugin/assets/images/.svn/entries extra/sample_plugin/assets/stylesheets/.svn/entries extra/sample_plugin/config/.svn/entries extra/sample_plugin/config/locales/.svn/entries extra/sample_plugin/db/.svn/entries extra/sample_plugin/db/migrate/.svn/entries extra/svn/.svn/all-wcprops extra/svn/.svn/entries extra/svn/.svn/text-base/Redmine.pm.svn-base extra/svn/Redmine.pm files/.svn/entries lib/.svn/all-wcprops lib/.svn/entries lib/.svn/text-base/redmine.rb.svn-base lib/SVG/.svn/entries lib/SVG/Graph/.svn/entries lib/generators/.svn/entries lib/generators/redmine_plugin/.svn/entries lib/generators/redmine_plugin/templates/.svn/entries lib/generators/redmine_plugin_controller/.svn/entries lib/generators/redmine_plugin_controller/templates/.svn/entries lib/generators/redmine_plugin_model/.svn/entries lib/generators/redmine_plugin_model/templates/.svn/entries lib/plugins/.svn/entries lib/redmine.rb lib/redmine/.svn/all-wcprops lib/redmine/.svn/entries lib/redmine/.svn/prop-base/ciphering.rb.svn-base lib/redmine/.svn/text-base/ciphering.rb.svn-base lib/redmine/.svn/text-base/configuration.rb.svn-base lib/redmine/.svn/text-base/i18n.rb.svn-base lib/redmine/.svn/text-base/unified_diff.rb.svn-base lib/redmine/activity/.svn/entries lib/redmine/ciphering.rb lib/redmine/configuration.rb lib/redmine/core_ext/.svn/entries lib/redmine/core_ext/string/.svn/entries lib/redmine/default_data/.svn/entries lib/redmine/export/.svn/entries lib/redmine/helpers/.svn/all-wcprops lib/redmine/helpers/.svn/entries lib/redmine/helpers/.svn/prop-base/diff.rb.svn-base lib/redmine/helpers/.svn/text-base/diff.rb.svn-base lib/redmine/helpers/.svn/text-base/gantt.rb.svn-base lib/redmine/helpers/diff.rb lib/redmine/helpers/gantt.rb lib/redmine/i18n.rb lib/redmine/scm/.svn/all-wcprops lib/redmine/scm/.svn/entries lib/redmine/scm/adapters/.svn/all-wcprops lib/redmine/scm/adapters/.svn/entries lib/redmine/scm/adapters/.svn/text-base/abstract_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/bazaar_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/cvs_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/darcs_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/filesystem_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/git_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter.rb.svn-base lib/redmine/scm/adapters/.svn/text-base/subversion_adapter.rb.svn-base lib/redmine/scm/adapters/abstract_adapter.rb lib/redmine/scm/adapters/bazaar_adapter.rb lib/redmine/scm/adapters/cvs_adapter.rb lib/redmine/scm/adapters/darcs_adapter.rb lib/redmine/scm/adapters/filesystem_adapter.rb lib/redmine/scm/adapters/git_adapter.rb lib/redmine/scm/adapters/mercurial/.svn/all-wcprops lib/redmine/scm/adapters/mercurial/.svn/dir-prop-base lib/redmine/scm/adapters/mercurial/.svn/entries lib/redmine/scm/adapters/mercurial/.svn/text-base/redminehelper.py.svn-base lib/redmine/scm/adapters/mercurial/redminehelper.py lib/redmine/scm/adapters/mercurial_adapter.rb lib/redmine/scm/adapters/subversion_adapter.rb lib/redmine/unified_diff.rb lib/redmine/views/.svn/entries lib/redmine/views/builders/.svn/entries lib/redmine/views/my_page/.svn/entries lib/redmine/wiki_formatting/.svn/entries lib/redmine/wiki_formatting/textile/.svn/entries lib/tasks/.svn/all-wcprops lib/tasks/.svn/entries lib/tasks/.svn/prop-base/ciphering.rake.svn-base lib/tasks/.svn/text-base/ciphering.rake.svn-base lib/tasks/.svn/text-base/locales.rake.svn-base lib/tasks/.svn/text-base/testing.rake.svn-base lib/tasks/ciphering.rake lib/tasks/locales.rake lib/tasks/testing.rake log/.svn/entries public/.svn/all-wcprops public/.svn/entries public/help/.svn/entries public/images/.svn/entries public/images/files/.svn/entries public/images/jstoolbar/.svn/entries public/javascripts/.svn/all-wcprops public/javascripts/.svn/entries public/javascripts/.svn/text-base/application.js.svn-base public/javascripts/.svn/text-base/context_menu.js.svn-base public/javascripts/application.js public/javascripts/calendar/.svn/all-wcprops public/javascripts/calendar/.svn/entries public/javascripts/calendar/lang/.svn/all-wcprops public/javascripts/calendar/lang/.svn/entries public/javascripts/calendar/lang/.svn/prop-base/calendar-fa.js.svn-base public/javascripts/calendar/lang/.svn/text-base/calendar-fa.js.svn-base public/javascripts/calendar/lang/calendar-fa.js public/javascripts/context_menu.js public/javascripts/jstoolbar/.svn/all-wcprops public/javascripts/jstoolbar/.svn/entries public/javascripts/jstoolbar/lang/.svn/all-wcprops public/javascripts/jstoolbar/lang/.svn/entries public/javascripts/jstoolbar/lang/.svn/prop-base/jstoolbar-fa.js.svn-base public/javascripts/jstoolbar/lang/.svn/text-base/jstoolbar-fa.js.svn-base public/javascripts/jstoolbar/lang/jstoolbar-fa.js public/stylesheets/.svn/all-wcprops public/stylesheets/.svn/entries public/stylesheets/.svn/text-base/application.css.svn-base public/stylesheets/application.css public/themes/.svn/entries public/themes/alternate/.svn/entries public/themes/alternate/stylesheets/.svn/entries public/themes/classic/.svn/entries public/themes/classic/images/.svn/entries public/themes/classic/stylesheets/.svn/entries script/.svn/entries script/performance/.svn/entries script/process/.svn/entries test/.svn/all-wcprops test/.svn/entries test/exemplars/.svn/entries test/fixtures/.svn/all-wcprops test/fixtures/.svn/entries test/fixtures/.svn/text-base/issue_statuses.yml.svn-base test/fixtures/.svn/text-base/journal_details.yml.svn-base test/fixtures/.svn/text-base/users.yml.svn-base test/fixtures/configuration/.svn/entries test/fixtures/diffs/.svn/entries test/fixtures/encoding/.svn/entries test/fixtures/files/.svn/entries test/fixtures/issue_statuses.yml test/fixtures/journal_details.yml test/fixtures/ldap/.svn/entries test/fixtures/mail_handler/.svn/entries test/fixtures/mailer/.svn/entries test/fixtures/repositories/.svn/all-wcprops test/fixtures/repositories/.svn/entries test/fixtures/repositories/.svn/text-base/git_repository.tar.gz.svn-base test/fixtures/repositories/git_repository.tar.gz test/fixtures/users.yml test/functional/.svn/all-wcprops test/functional/.svn/entries test/functional/.svn/text-base/journals_controller_test.rb.svn-base test/functional/.svn/text-base/repositories_bazaar_controller_test.rb.svn-base test/functional/.svn/text-base/repositories_cvs_controller_test.rb.svn-base test/functional/.svn/text-base/repositories_darcs_controller_test.rb.svn-base test/functional/.svn/text-base/repositories_mercurial_controller_test.rb.svn-base test/functional/.svn/text-base/repositories_subversion_controller_test.rb.svn-base test/functional/.svn/text-base/welcome_controller_test.rb.svn-base test/functional/.svn/text-base/workflows_controller_test.rb.svn-base test/functional/journals_controller_test.rb test/functional/repositories_bazaar_controller_test.rb test/functional/repositories_cvs_controller_test.rb test/functional/repositories_darcs_controller_test.rb test/functional/repositories_mercurial_controller_test.rb test/functional/repositories_subversion_controller_test.rb test/functional/welcome_controller_test.rb test/functional/workflows_controller_test.rb test/integration/.svn/entries test/integration/api_test/.svn/entries test/integration/lib/.svn/entries test/integration/lib/redmine/.svn/entries test/mocks/.svn/entries test/mocks/development/.svn/entries test/mocks/test/.svn/entries test/unit/.svn/all-wcprops test/unit/.svn/entries test/unit/.svn/text-base/changeset_test.rb.svn-base test/unit/.svn/text-base/issue_status_test.rb.svn-base test/unit/.svn/text-base/issue_test.rb.svn-base test/unit/.svn/text-base/query_test.rb.svn-base test/unit/.svn/text-base/repository_bazaar_test.rb.svn-base test/unit/.svn/text-base/repository_cvs_test.rb.svn-base test/unit/.svn/text-base/repository_darcs_test.rb.svn-base test/unit/.svn/text-base/repository_git_test.rb.svn-base test/unit/.svn/text-base/repository_mercurial_test.rb.svn-base test/unit/.svn/text-base/repository_subversion_test.rb.svn-base test/unit/.svn/text-base/repository_test.rb.svn-base test/unit/.svn/text-base/user_test.rb.svn-base test/unit/changeset_test.rb test/unit/helpers/.svn/all-wcprops test/unit/helpers/.svn/entries test/unit/helpers/.svn/text-base/application_helper_test.rb.svn-base test/unit/helpers/.svn/text-base/repository_helper_test.rb.svn-base test/unit/helpers/application_helper_test.rb test/unit/helpers/repository_helper_test.rb test/unit/issue_status_test.rb test/unit/issue_test.rb test/unit/lib/.svn/all-wcprops test/unit/lib/.svn/entries test/unit/lib/redmine/.svn/all-wcprops test/unit/lib/redmine/.svn/entries test/unit/lib/redmine/.svn/prop-base/ciphering_test.rb.svn-base test/unit/lib/redmine/.svn/text-base/ciphering_test.rb.svn-base test/unit/lib/redmine/.svn/text-base/configuration_test.rb.svn-base test/unit/lib/redmine/.svn/text-base/i18n_test.rb.svn-base test/unit/lib/redmine/.svn/text-base/unified_diff_test.rb.svn-base test/unit/lib/redmine/ciphering_test.rb test/unit/lib/redmine/configuration_test.rb test/unit/lib/redmine/helpers/.svn/entries test/unit/lib/redmine/i18n_test.rb test/unit/lib/redmine/menu_manager/.svn/entries test/unit/lib/redmine/scm/.svn/all-wcprops test/unit/lib/redmine/scm/.svn/entries test/unit/lib/redmine/scm/adapters/.svn/all-wcprops test/unit/lib/redmine/scm/adapters/.svn/entries test/unit/lib/redmine/scm/adapters/.svn/text-base/bazaar_adapter_test.rb.svn-base test/unit/lib/redmine/scm/adapters/.svn/text-base/cvs_adapter_test.rb.svn-base test/unit/lib/redmine/scm/adapters/.svn/text-base/git_adapter_test.rb.svn-base test/unit/lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter_test.rb.svn-base test/unit/lib/redmine/scm/adapters/.svn/text-base/subversion_adapter_test.rb.svn-base test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb test/unit/lib/redmine/scm/adapters/git_adapter_test.rb test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb test/unit/lib/redmine/unified_diff_test.rb test/unit/lib/redmine/views/.svn/entries test/unit/lib/redmine/views/builders/.svn/entries test/unit/lib/redmine/wiki_formatting/.svn/entries test/unit/query_test.rb test/unit/repository_bazaar_test.rb test/unit/repository_cvs_test.rb test/unit/repository_darcs_test.rb test/unit/repository_git_test.rb test/unit/repository_mercurial_test.rb test/unit/repository_subversion_test.rb test/unit/repository_test.rb test/unit/user_test.rb tmp/.svn/entries tmp/cache/.svn/entries tmp/sessions/.svn/entries tmp/sockets/.svn/entries tmp/test/.svn/entries vendor/.svn/all-wcprops vendor/.svn/entries vendor/gems/.svn/entries vendor/gems/coderay-0.9.7/.svn/entries vendor/gems/coderay-0.9.7/bin/.svn/entries vendor/gems/coderay-0.9.7/lib/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/encoders/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/encoders/html/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/helpers/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/scanners/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/scanners/java/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/.svn/entries vendor/gems/coderay-0.9.7/lib/coderay/styles/.svn/entries vendor/gems/coderay-0.9.7/test/.svn/entries vendor/gems/coderay-0.9.7/test/functional/.svn/entries vendor/gems/rubytree-0.5.2/.svn/entries vendor/gems/rubytree-0.5.2/lib/.svn/entries vendor/gems/rubytree-0.5.2/lib/tree/.svn/entries vendor/gems/rubytree-0.5.2/test/.svn/entries vendor/plugins/.svn/all-wcprops vendor/plugins/.svn/entries vendor/plugins/acts_as_activity_provider/.svn/entries vendor/plugins/acts_as_activity_provider/lib/.svn/entries vendor/plugins/acts_as_attachable/.svn/entries vendor/plugins/acts_as_attachable/lib/.svn/entries vendor/plugins/acts_as_customizable/.svn/all-wcprops vendor/plugins/acts_as_customizable/.svn/entries vendor/plugins/acts_as_customizable/lib/.svn/all-wcprops vendor/plugins/acts_as_customizable/lib/.svn/entries vendor/plugins/acts_as_customizable/lib/.svn/text-base/acts_as_customizable.rb.svn-base vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb vendor/plugins/acts_as_event/.svn/entries vendor/plugins/acts_as_event/lib/.svn/entries vendor/plugins/acts_as_list/.svn/entries vendor/plugins/acts_as_list/lib/.svn/entries vendor/plugins/acts_as_list/lib/active_record/.svn/entries vendor/plugins/acts_as_list/lib/active_record/acts/.svn/entries vendor/plugins/acts_as_list/test/.svn/entries vendor/plugins/acts_as_searchable/.svn/entries vendor/plugins/acts_as_searchable/lib/.svn/entries vendor/plugins/acts_as_tree/.svn/entries vendor/plugins/acts_as_tree/lib/.svn/entries vendor/plugins/acts_as_tree/lib/active_record/.svn/entries vendor/plugins/acts_as_tree/lib/active_record/acts/.svn/entries vendor/plugins/acts_as_tree/test/.svn/entries vendor/plugins/acts_as_tree/test/fixtures/.svn/entries vendor/plugins/acts_as_versioned/.svn/entries vendor/plugins/acts_as_versioned/lib/.svn/entries vendor/plugins/acts_as_versioned/test/.svn/entries vendor/plugins/acts_as_versioned/test/fixtures/.svn/entries vendor/plugins/acts_as_versioned/test/fixtures/migrations/.svn/entries vendor/plugins/acts_as_watchable/.svn/entries vendor/plugins/acts_as_watchable/lib/.svn/entries vendor/plugins/awesome_nested_set/.svn/entries vendor/plugins/awesome_nested_set/lib/.svn/entries vendor/plugins/awesome_nested_set/lib/awesome_nested_set/.svn/entries vendor/plugins/awesome_nested_set/rails/.svn/entries vendor/plugins/awesome_nested_set/test/.svn/entries vendor/plugins/awesome_nested_set/test/awesome_nested_set/.svn/entries vendor/plugins/awesome_nested_set/test/db/.svn/entries vendor/plugins/awesome_nested_set/test/fixtures/.svn/entries vendor/plugins/classic_pagination/.svn/entries vendor/plugins/classic_pagination/lib/.svn/entries vendor/plugins/classic_pagination/test/.svn/entries vendor/plugins/classic_pagination/test/fixtures/.svn/entries vendor/plugins/engines/.svn/entries vendor/plugins/engines/generators/.svn/entries vendor/plugins/engines/generators/plugin_migration/.svn/entries vendor/plugins/engines/generators/plugin_migration/templates/.svn/entries vendor/plugins/engines/lib/.svn/entries vendor/plugins/engines/lib/engines/.svn/entries vendor/plugins/engines/lib/engines/plugin/.svn/entries vendor/plugins/engines/lib/engines/rails_extensions/.svn/entries vendor/plugins/engines/tasks/.svn/entries vendor/plugins/engines/test/.svn/entries vendor/plugins/engines/test/app/.svn/entries vendor/plugins/engines/test/app/controllers/.svn/entries vendor/plugins/engines/test/app/controllers/namespace/.svn/entries vendor/plugins/engines/test/app/helpers/.svn/entries vendor/plugins/engines/test/app/models/.svn/entries vendor/plugins/engines/test/app/things/.svn/entries vendor/plugins/engines/test/app/views/.svn/entries vendor/plugins/engines/test/app/views/app_and_plugin/.svn/entries vendor/plugins/engines/test/app/views/namespace/.svn/entries vendor/plugins/engines/test/app/views/namespace/app_and_plugin/.svn/entries vendor/plugins/engines/test/app/views/notify_mail/.svn/entries vendor/plugins/engines/test/app/views/plugin_mail/.svn/entries vendor/plugins/engines/test/functional/.svn/entries vendor/plugins/engines/test/lib/.svn/entries vendor/plugins/engines/test/plugins/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/models/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/lib/.svn/entries vendor/plugins/engines/test/plugins/alpha_plugin/locales/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/models/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/views/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/.svn/entries vendor/plugins/engines/test/plugins/beta_plugin/locales/.svn/entries vendor/plugins/engines/test/plugins/not_a_plugin/.svn/entries vendor/plugins/engines/test/plugins/not_a_plugin/public/.svn/entries vendor/plugins/engines/test/plugins/test_assets/.svn/entries vendor/plugins/engines/test/plugins/test_assets/app/.svn/entries vendor/plugins/engines/test/plugins/test_assets/app/controllers/.svn/entries vendor/plugins/engines/test/plugins/test_assets/app/views/.svn/entries vendor/plugins/engines/test/plugins/test_assets/app/views/assets/.svn/entries vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/.svn/entries vendor/plugins/engines/test/plugins/test_assets/public/.svn/entries vendor/plugins/engines/test/plugins/test_assets/public/subfolder/.svn/entries vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/.svn/entries vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/.svn/entries vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder/.svn/entries vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/.svn/entries vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets/.svn/entries vendor/plugins/engines/test/plugins/test_code_mixing/.svn/entries vendor/plugins/engines/test/plugins/test_code_mixing/app/.svn/entries vendor/plugins/engines/test/plugins/test_code_mixing/app/things/.svn/entries vendor/plugins/engines/test/plugins/test_load_path/.svn/entries vendor/plugins/engines/test/plugins/test_migration/.svn/entries vendor/plugins/engines/test/plugins/test_migration/db/.svn/entries vendor/plugins/engines/test/plugins/test_migration/db/migrate/.svn/entries vendor/plugins/engines/test/plugins/test_plugin_mailing/.svn/entries vendor/plugins/engines/test/plugins/test_plugin_mailing/app/.svn/entries vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/.svn/entries vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/.svn/entries vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/.svn/entries vendor/plugins/engines/test/plugins/test_routing/.svn/entries vendor/plugins/engines/test/plugins/test_routing/app/.svn/entries vendor/plugins/engines/test/plugins/test_routing/app/controllers/.svn/entries vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/.svn/entries vendor/plugins/engines/test/plugins/test_routing/config/.svn/entries vendor/plugins/engines/test/plugins/test_testing/.svn/entries vendor/plugins/engines/test/plugins/test_testing/app/.svn/entries vendor/plugins/engines/test/plugins/test_testing/test/.svn/entries vendor/plugins/engines/test/plugins/test_testing/test/fixtures/.svn/entries vendor/plugins/engines/test/plugins/test_testing/test/unit/.svn/entries vendor/plugins/engines/test/unit/.svn/entries vendor/plugins/engines/test/unit/test_testing/.svn/entries vendor/plugins/gravatar/.svn/entries vendor/plugins/gravatar/lib/.svn/entries vendor/plugins/gravatar/spec/.svn/entries vendor/plugins/open_id_authentication/.svn/entries vendor/plugins/open_id_authentication/generators/.svn/entries vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/.svn/entries vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/.svn/entries vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/.svn/entries vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/.svn/entries vendor/plugins/open_id_authentication/lib/.svn/entries vendor/plugins/open_id_authentication/lib/open_id_authentication/.svn/entries vendor/plugins/open_id_authentication/tasks/.svn/entries vendor/plugins/open_id_authentication/test/.svn/entries vendor/plugins/prepend_engine_views/.svn/entries vendor/plugins/rfpdf/.svn/entries vendor/plugins/rfpdf/lib/.svn/entries vendor/plugins/rfpdf/lib/rfpdf/.svn/entries vendor/plugins/rfpdf/test/.svn/entries vendor/plugins/ruby-net-ldap-0.0.4/.svn/entries vendor/plugins/ruby-net-ldap-0.0.4/lib/.svn/entries vendor/plugins/ruby-net-ldap-0.0.4/lib/net/.svn/entries vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap/.svn/entries vendor/plugins/ruby-net-ldap-0.0.4/tests/.svn/entries
diffstat 738 files changed, 15868 insertions(+), 8144 deletions(-) [+]
line wrap: on
line diff
--- a/.gitignore	Thu Mar 03 11:40:10 2011 +0000
+++ b/.gitignore	Thu Mar 03 11:42:28 2011 +0000
@@ -1,3 +1,5 @@
+/.project
+/.loadpath
 /config/additional_environment.rb
 /config/configuration.yml
 /config/database.yml
@@ -8,6 +10,8 @@
 /db/*.sqlite3
 /db/schema.rb
 /files/*
+/lib/redmine/scm/adapters/mercurial/redminehelper.pyc
+/lib/redmine/scm/adapters/mercurial/redminehelper.pyo
 /log/*.log*
 /log/mongrel_debug
 /public/dispatch.*
--- a/.hgignore	Thu Mar 03 11:40:10 2011 +0000
+++ b/.hgignore	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,7 @@
 syntax: glob
 
+.project
+.loadpath
 config/additional_environment.rb
 config/configuration.yml
 config/database.yml
@@ -10,6 +12,8 @@
 db/*.sqlite3
 db/schema.rb
 files/*
+lib/redmine/scm/adapters/mercurial/redminehelper.pyc
+lib/redmine/scm/adapters/mercurial/redminehelper.pyo
 log/*.log*
 log/mongrel_debug
 public/dispatch.*
--- a/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 24
-/svn/!svn/ver/4802/trunk
+/svn/!svn/ver/4993/trunk
 END
 .hgignore
 K 25
 svn:wc:ra_dav:version-url
 V 34
-/svn/!svn/ver/4787/trunk/.hgignore
+/svn/!svn/ver/4834/trunk/.hgignore
 END
 Rakefile
 K 25
@@ -25,5 +25,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 35
-/svn/!svn/ver/4787/trunk/.gitignore
+/svn/!svn/ver/4834/trunk/.gitignore
 END
--- a/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 has-props
 
@@ -29,42 +29,20 @@
 test
 dir
 
-app
-dir
-
 .hgignore
 file
 
 
 
 
-2011-03-03T11:05:23.000000Z
-f7e1eefb3dfe776e3db86602594d9397
-2011-02-01T13:48:56.769696Z
-4787
+
+970b3ffe21e2c668737cf5abf0d0ac48
+2011-02-15T11:04:52.942730Z
+4834
 tmaruyama
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-342
+
+app
+dir
 
 log
 dir
@@ -103,6 +81,9 @@
 
 307
 
+extra
+dir
+
 README.rdoc
 file
 
@@ -137,9 +118,6 @@
 
 208
 
-extra
-dir
-
 db
 dir
 
@@ -155,45 +133,45 @@
 script
 dir
 
-.gitignore
-file
-
-
-
-
-2011-03-03T11:05:23.000000Z
-7dcc6fd20b6e4c018dea1a2b9253aa46
-2011-02-01T13:48:56.769696Z
-4787
-tmaruyama
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-348
+doc
+dir
 
 config
 dir
 
-doc
-dir
+.gitignore
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+84dbba0b6ddcd80d28c62a3f8e344bc4
+2011-02-15T11:04:52.942730Z
+4834
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+477
 
 lib
 dir
--- a/.svn/text-base/.gitignore.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/.svn/text-base/.gitignore.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,3 +1,5 @@
+/.project
+/.loadpath
 /config/additional_environment.rb
 /config/configuration.yml
 /config/database.yml
@@ -8,6 +10,8 @@
 /db/*.sqlite3
 /db/schema.rb
 /files/*
+/lib/redmine/scm/adapters/mercurial/redminehelper.pyc
+/lib/redmine/scm/adapters/mercurial/redminehelper.pyo
 /log/*.log*
 /log/mongrel_debug
 /public/dispatch.*
--- a/.svn/text-base/.hgignore.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/.svn/text-base/.hgignore.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,7 @@
 syntax: glob
 
+.project
+.loadpath
 config/additional_environment.rb
 config/configuration.yml
 config/database.yml
@@ -10,6 +12,8 @@
 db/*.sqlite3
 db/schema.rb
 files/*
+lib/redmine/scm/adapters/mercurial/redminehelper.pyc
+lib/redmine/scm/adapters/mercurial/redminehelper.pyo
 log/*.log*
 log/mongrel_debug
 public/dispatch.*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.svn/tmp/.hgignore.tmp	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,26 @@
+syntax: glob
+
+.project
+.loadpath
+config/additional_environment.rb
+config/configuration.yml
+config/database.yml
+config/email.yml
+config/initializers/session_store.rb
+coverage
+db/*.db
+db/*.sqlite3
+db/schema.rb
+files/*
+lib/redmine/scm/adapters/mercurial/redminehelper.pyc
+lib/redmine/scm/adapters/mercurial/redminehelper.pyo
+log/*.log*
+log/mongrel_debug
+public/dispatch.*
+public/plugin_assets
+tmp/cache/*
+tmp/sessions/*
+tmp/sockets/*
+tmp/test/*
+vendor/rails
+*.rbc
--- a/app/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 28
-/svn/!svn/ver/4802/trunk/app
+/svn/!svn/ver/4990/trunk/app
 END
--- a/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T03:30:10.954225Z
+4990
 tmaruyama
 
 
--- a/app/controllers/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 40
-/svn/!svn/ver/4764/trunk/app/controllers
+/svn/!svn/ver/4954/trunk/app/controllers
 END
 issues_controller.rb
 K 25
@@ -73,7 +73,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 63
-/svn/!svn/ver/4535/trunk/app/controllers/journals_controller.rb
+/svn/!svn/ver/4954/trunk/app/controllers/journals_controller.rb
 END
 time_entry_reports_controller.rb
 K 25
@@ -85,7 +85,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/3536/trunk/app/controllers/workflows_controller.rb
+/svn/!svn/ver/4895/trunk/app/controllers/workflows_controller.rb
 END
 reports_controller.rb
 K 25
@@ -99,11 +99,11 @@
 V 75
 /svn/!svn/ver/4075/trunk/app/controllers/project_enumerations_controller.rb
 END
-timelog_controller.rb
+custom_fields_controller.rb
 K 25
 svn:wc:ra_dav:version-url
-V 62
-/svn/!svn/ver/4511/trunk/app/controllers/timelog_controller.rb
+V 68
+/svn/!svn/ver/3627/trunk/app/controllers/custom_fields_controller.rb
 END
 settings_controller.rb
 K 25
@@ -111,11 +111,17 @@
 V 63
 /svn/!svn/ver/4432/trunk/app/controllers/settings_controller.rb
 END
-custom_fields_controller.rb
+timelog_controller.rb
 K 25
 svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/3627/trunk/app/controllers/custom_fields_controller.rb
+V 62
+/svn/!svn/ver/4511/trunk/app/controllers/timelog_controller.rb
+END
+issue_moves_controller.rb
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/4292/trunk/app/controllers/issue_moves_controller.rb
 END
 users_controller.rb
 K 25
@@ -123,12 +129,6 @@
 V 60
 /svn/!svn/ver/4729/trunk/app/controllers/users_controller.rb
 END
-issue_moves_controller.rb
-K 25
-svn:wc:ra_dav:version-url
-V 66
-/svn/!svn/ver/4292/trunk/app/controllers/issue_moves_controller.rb
-END
 files_controller.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -141,11 +141,11 @@
 V 66
 /svn/!svn/ver/4573/trunk/app/controllers/application_controller.rb
 END
-auth_sources_controller.rb
+previews_controller.rb
 K 25
 svn:wc:ra_dav:version-url
-V 67
-/svn/!svn/ver/3744/trunk/app/controllers/auth_sources_controller.rb
+V 63
+/svn/!svn/ver/4174/trunk/app/controllers/previews_controller.rb
 END
 ldap_auth_sources_controller.rb
 K 25
@@ -153,11 +153,11 @@
 V 72
 /svn/!svn/ver/3744/trunk/app/controllers/ldap_auth_sources_controller.rb
 END
-previews_controller.rb
+auth_sources_controller.rb
 K 25
 svn:wc:ra_dav:version-url
-V 63
-/svn/!svn/ver/4174/trunk/app/controllers/previews_controller.rb
+V 67
+/svn/!svn/ver/3744/trunk/app/controllers/auth_sources_controller.rb
 END
 search_controller.rb
 K 25
@@ -171,18 +171,18 @@
 V 63
 /svn/!svn/ver/3528/trunk/app/controllers/messages_controller.rb
 END
+issue_relations_controller.rb
+K 25
+svn:wc:ra_dav:version-url
+V 70
+/svn/!svn/ver/4764/trunk/app/controllers/issue_relations_controller.rb
+END
 versions_controller.rb
 K 25
 svn:wc:ra_dav:version-url
 V 63
 /svn/!svn/ver/4354/trunk/app/controllers/versions_controller.rb
 END
-issue_relations_controller.rb
-K 25
-svn:wc:ra_dav:version-url
-V 70
-/svn/!svn/ver/4764/trunk/app/controllers/issue_relations_controller.rb
-END
 boards_controller.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -235,7 +235,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 67
-/svn/!svn/ver/4733/trunk/app/controllers/repositories_controller.rb
+/svn/!svn/ver/4860/trunk/app/controllers/repositories_controller.rb
 END
 admin_controller.rb
 K 25
--- a/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/controllers
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-27T21:38:47.430923Z
-4764
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 
 
@@ -406,10 +406,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-bec68711fe4573cf428799354ea68f5d
-2010-12-18T17:11:41.680297Z
-4535
+2011-03-03T11:40:18.000000Z
+0610cb98929633e94c97f1060f4f1566
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -432,7 +432,7 @@
 
 
 
-3490
+4081
 
 time_entry_reports_controller.rb
 file
@@ -474,11 +474,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-5052c701a12ad27e88950dd4a745b0f8
-2010-03-04T05:33:45.236699Z
-3536
-edavis10
+2011-03-03T11:40:18.000000Z
+73cdba17212ad890eea7b7c7ee140d7e
+2011-02-20T15:38:07.840581Z
+4895
+jplang
 has-props
 
 
@@ -500,7 +500,7 @@
 
 
 
-3346
+4041
 
 reports_controller.rb
 file
@@ -570,6 +570,74 @@
 
 856
 
+custom_fields_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+00272455ac5be11da48f92c4a443c538
+2010-04-03T11:54:24.331654Z
+3627
+winterheart
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2373
+
+settings_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+98c4c9f33f038160a44752d229926c32
+2010-11-27T14:06:11.754120Z
+4432
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2271
+
 timelog_controller.rb
 file
 
@@ -604,73 +672,39 @@
 
 10484
 
-settings_controller.rb
+issue_moves_controller.rb
 file
 
 
 
 
 2011-03-03T11:05:10.000000Z
-98c4c9f33f038160a44752d229926c32
-2010-11-27T14:06:11.754120Z
-4432
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2271
-
-custom_fields_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-00272455ac5be11da48f92c4a443c538
-2010-04-03T11:54:24.331654Z
-3627
-winterheart
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2373
+cacd6ffe0ce299e2ede9d45b7ef8af42
+2010-10-25T18:44:46.868009Z
+4292
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2441
 
 users_controller.rb
 file
@@ -706,40 +740,6 @@
 
 8474
 
-issue_moves_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-cacd6ffe0ce299e2ede9d45b7ef8af42
-2010-10-25T18:44:46.868009Z
-4292
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2441
-
 files_controller.rb
 file
 
@@ -808,6 +808,74 @@
 
 15545
 
+previews_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+c5ae4fae18159e70fd81c2487bb1daa1
+2010-09-24T16:26:46.819682Z
+4174
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+957
+
+ldap_auth_sources_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+5f7b9cb2e9c8a60db58ea0833cf481c5
+2010-05-23T03:16:31.304135Z
+3744
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+917
+
 auth_sources_controller.rb
 file
 
@@ -842,74 +910,6 @@
 
 2542
 
-ldap_auth_sources_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-5f7b9cb2e9c8a60db58ea0833cf481c5
-2010-05-23T03:16:31.304135Z
-3744
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-917
-
-previews_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-c5ae4fae18159e70fd81c2487bb1daa1
-2010-09-24T16:26:46.819682Z
-4174
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-957
-
 search_controller.rb
 file
 
@@ -978,6 +978,40 @@
 
 5824
 
+issue_relations_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+8c5249f85056c74e0ab06b5dfa9fed72
+2011-01-27T21:38:47.430923Z
+4764
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2450
+
 versions_controller.rb
 file
 
@@ -1012,40 +1046,6 @@
 
 6241
 
-issue_relations_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-8c5249f85056c74e0ab06b5dfa9fed72
-2011-01-27T21:38:47.430923Z
-4764
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2450
-
 boards_controller.rb
 file
 
@@ -1324,10 +1324,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-4333ec6901a78a0b2a45c3713372ab84
-2011-01-21T13:22:08.161817Z
-4733
+2011-03-03T11:40:18.000000Z
+5511ecf5c7190efe44398994a222b486
+2011-02-17T14:17:04.791825Z
+4860
 tmaruyama
 has-props
 
@@ -1350,7 +1350,7 @@
 
 
 
-11435
+11539
 
 admin_controller.rb
 file
--- a/app/controllers/.svn/text-base/journals_controller.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/.svn/text-base/journals_controller.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -16,12 +16,13 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class JournalsController < ApplicationController
-  before_filter :find_journal, :only => [:edit]
+  before_filter :find_journal, :only => [:edit, :diff]
   before_filter :find_issue, :only => [:new]
   before_filter :find_optional_project, :only => [:index]
-  before_filter :authorize, :only => [:new, :edit]
+  before_filter :authorize, :only => [:new, :edit, :diff]
   accept_key_auth :index
-
+  menu_item :issues
+  
   helper :issues
   helper :queries
   include QueriesHelper
@@ -43,6 +44,17 @@
     render_404
   end
   
+  def diff
+    @issue = @journal.issue
+    if params[:detail_id].present?
+      @detail = @journal.details.find_by_id(params[:detail_id])
+    else
+      @detail = @journal.details.detect {|d| d.prop_key == 'description'}
+    end
+    (render_404; return false) unless @issue && @detail
+    @diff = Redmine::Helpers::Diff.new(@detail.value, @detail.old_value)
+  end
+  
   def new
     journal = Journal.find(params[:journal_id]) if params[:journal_id]
     if journal
@@ -67,6 +79,7 @@
   end
   
   def edit
+    (render_403; return false) unless @journal.editable_by?(User.current)
     if request.post?
       @journal.update_attributes(:notes => params[:notes]) if params[:notes]
       @journal.destroy if @journal.details.empty? && @journal.notes.blank?
@@ -75,13 +88,21 @@
         format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
         format.js { render :action => 'update' }
       end
+    else
+      respond_to do |format|
+        format.html {
+          # TODO: implement non-JS journal update
+          render :nothing => true 
+        }
+        format.js
+      end
     end
   end
   
-private
+  private
+  
   def find_journal
     @journal = Journal.find(params[:id])
-    (render_403; return false) unless @journal.editable_by?(User.current)
     @project = @journal.journalized.project
   rescue ActiveRecord::RecordNotFound
     render_404
--- a/app/controllers/.svn/text-base/repositories_controller.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/.svn/text-base/repositories_controller.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -67,13 +67,13 @@
       redirect_to :action => 'committers', :id => @project
     end
   end
-  
+
   def destroy
     @repository.destroy
     redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'repository'
   end
-  
-  def show 
+
+  def show
     @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty?
 
     @entries = @repository.entries(@path, @rev)
@@ -88,7 +88,7 @@
   end
 
   alias_method :browse, :show
-  
+
   def changes
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
@@ -96,23 +96,23 @@
     @properties = @repository.properties(@path, @rev)
     @changeset = @repository.find_changeset_by_name(@rev)
   end
-  
+
   def revisions
     @changeset_count = @repository.changesets.count
     @changeset_pages = Paginator.new self, @changeset_count,
-								      per_page_option,
-								      params['page']								
+                                     per_page_option,
+                                     params['page']
     @changesets = @repository.changesets.find(:all,
-						:limit  =>  @changeset_pages.items_per_page,
-						:offset =>  @changeset_pages.current.offset,
-            :include => [:user, :repository])
+                       :limit  =>  @changeset_pages.items_per_page,
+                       :offset =>  @changeset_pages.current.offset,
+                       :include => [:user, :repository])
 
     respond_to do |format|
       format.html { render :layout => false if request.xhr? }
       format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") }
     end
   end
-  
+
   def entry
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
@@ -122,9 +122,10 @@
 
     @content = @repository.cat(@path, @rev)
     (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
-      send_data @content, :filename => @path.split('/').last
+      send_data @content, :filename => filename_for_content_disposition(@path.split('/').last)
     else
       # Prevent empty lines when displaying a file with Windows style eol
       @content.gsub!("\r\n", "\n")
@@ -135,7 +136,7 @@
   def annotate
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
-    
+
     @annotate = @repository.scm.annotate(@path, @rev)
     (render_error l(:error_scm_annotate); return) if @annotate.nil? || @annotate.empty?
     @changeset = @repository.find_changeset_by_name(@rev)
@@ -153,7 +154,7 @@
   rescue ChangesetNotFound
     show_error_not_found
   end
-  
+
   def diff
     if params[:format] == 'diff'
       @diff = @repository.diff(@path, @rev, @rev_to)
@@ -185,11 +186,11 @@
     end
   end
 
-  def stats  
+  def stats
   end
-  
+
   def graph
-    data = nil    
+    data = nil
     case params[:graph]
     when "commits_per_month"
       data = graph_commits_per_month(@repository)
@@ -217,7 +218,7 @@
     @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip
     @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?
         raise InvalidRevisionParam
       end
--- a/app/controllers/.svn/text-base/workflows_controller.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/.svn/text-base/workflows_controller.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -32,14 +32,17 @@
     
     if request.post?
       Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id])
-      (params[:issue_status] || []).each { |old, news| 
-        news.each { |new| 
-          @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new) 
+      (params[:issue_status] || []).each { |status_id, transitions|
+        transitions.each { |new_status_id, options|
+          author = options.is_a?(Array) && options.include?('author') && !options.include?('always')
+          assignee = options.is_a?(Array) && options.include?('assignee') && !options.include?('always')
+          @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => status_id, :new_status_id => new_status_id, :author => author, :assignee => assignee) 
         }
       }
       if @role.save
         flash[:notice] = l(:notice_successful_update)
         redirect_to :action => 'edit', :role_id => @role, :tracker_id => @tracker
+        return
       end
     end
     
@@ -48,6 +51,14 @@
       @statuses = @tracker.issue_statuses
     end
     @statuses ||= IssueStatus.find(:all, :order => 'position')
+    
+    if @tracker && @role && @statuses.any?
+      workflows = Workflow.all(:conditions => {:role_id => @role.id, :tracker_id => @tracker.id})
+      @workflows = {}
+      @workflows['always'] = workflows.select {|w| !w.author && !w.assignee}
+      @workflows['author'] = workflows.select {|w| w.author}
+      @workflows['assignee'] = workflows.select {|w| w.assignee}
+    end
   end
   
   def copy
--- a/app/controllers/journals_controller.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/journals_controller.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -16,12 +16,13 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class JournalsController < ApplicationController
-  before_filter :find_journal, :only => [:edit]
+  before_filter :find_journal, :only => [:edit, :diff]
   before_filter :find_issue, :only => [:new]
   before_filter :find_optional_project, :only => [:index]
-  before_filter :authorize, :only => [:new, :edit]
+  before_filter :authorize, :only => [:new, :edit, :diff]
   accept_key_auth :index
-
+  menu_item :issues
+  
   helper :issues
   helper :queries
   include QueriesHelper
@@ -43,6 +44,17 @@
     render_404
   end
   
+  def diff
+    @issue = @journal.issue
+    if params[:detail_id].present?
+      @detail = @journal.details.find_by_id(params[:detail_id])
+    else
+      @detail = @journal.details.detect {|d| d.prop_key == 'description'}
+    end
+    (render_404; return false) unless @issue && @detail
+    @diff = Redmine::Helpers::Diff.new(@detail.value, @detail.old_value)
+  end
+  
   def new
     journal = Journal.find(params[:journal_id]) if params[:journal_id]
     if journal
@@ -67,6 +79,7 @@
   end
   
   def edit
+    (render_403; return false) unless @journal.editable_by?(User.current)
     if request.post?
       @journal.update_attributes(:notes => params[:notes]) if params[:notes]
       @journal.destroy if @journal.details.empty? && @journal.notes.blank?
@@ -75,13 +88,21 @@
         format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
         format.js { render :action => 'update' }
       end
+    else
+      respond_to do |format|
+        format.html {
+          # TODO: implement non-JS journal update
+          render :nothing => true 
+        }
+        format.js
+      end
     end
   end
   
-private
+  private
+  
   def find_journal
     @journal = Journal.find(params[:id])
-    (render_403; return false) unless @journal.editable_by?(User.current)
     @project = @journal.journalized.project
   rescue ActiveRecord::RecordNotFound
     render_404
--- a/app/controllers/repositories_controller.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/repositories_controller.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -67,13 +67,13 @@
       redirect_to :action => 'committers', :id => @project
     end
   end
-  
+
   def destroy
     @repository.destroy
     redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'repository'
   end
-  
-  def show 
+
+  def show
     @repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty?
 
     @entries = @repository.entries(@path, @rev)
@@ -88,7 +88,7 @@
   end
 
   alias_method :browse, :show
-  
+
   def changes
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
@@ -96,23 +96,23 @@
     @properties = @repository.properties(@path, @rev)
     @changeset = @repository.find_changeset_by_name(@rev)
   end
-  
+
   def revisions
     @changeset_count = @repository.changesets.count
     @changeset_pages = Paginator.new self, @changeset_count,
-								      per_page_option,
-								      params['page']								
+                                     per_page_option,
+                                     params['page']
     @changesets = @repository.changesets.find(:all,
-						:limit  =>  @changeset_pages.items_per_page,
-						:offset =>  @changeset_pages.current.offset,
-            :include => [:user, :repository])
+                       :limit  =>  @changeset_pages.items_per_page,
+                       :offset =>  @changeset_pages.current.offset,
+                       :include => [:user, :repository])
 
     respond_to do |format|
       format.html { render :layout => false if request.xhr? }
       format.atom { render_feed(@changesets, :title => "#{@project.name}: #{l(:label_revision_plural)}") }
     end
   end
-  
+
   def entry
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
@@ -122,9 +122,10 @@
 
     @content = @repository.cat(@path, @rev)
     (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
-      send_data @content, :filename => @path.split('/').last
+      send_data @content, :filename => filename_for_content_disposition(@path.split('/').last)
     else
       # Prevent empty lines when displaying a file with Windows style eol
       @content.gsub!("\r\n", "\n")
@@ -135,7 +136,7 @@
   def annotate
     @entry = @repository.entry(@path, @rev)
     (show_error_not_found; return) unless @entry
-    
+
     @annotate = @repository.scm.annotate(@path, @rev)
     (render_error l(:error_scm_annotate); return) if @annotate.nil? || @annotate.empty?
     @changeset = @repository.find_changeset_by_name(@rev)
@@ -153,7 +154,7 @@
   rescue ChangesetNotFound
     show_error_not_found
   end
-  
+
   def diff
     if params[:format] == 'diff'
       @diff = @repository.diff(@path, @rev, @rev_to)
@@ -185,11 +186,11 @@
     end
   end
 
-  def stats  
+  def stats
   end
-  
+
   def graph
-    data = nil    
+    data = nil
     case params[:graph]
     when "commits_per_month"
       data = graph_commits_per_month(@repository)
@@ -217,7 +218,7 @@
     @rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip
     @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?
         raise InvalidRevisionParam
       end
--- a/app/controllers/workflows_controller.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/controllers/workflows_controller.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -32,14 +32,17 @@
     
     if request.post?
       Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id])
-      (params[:issue_status] || []).each { |old, news| 
-        news.each { |new| 
-          @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new) 
+      (params[:issue_status] || []).each { |status_id, transitions|
+        transitions.each { |new_status_id, options|
+          author = options.is_a?(Array) && options.include?('author') && !options.include?('always')
+          assignee = options.is_a?(Array) && options.include?('assignee') && !options.include?('always')
+          @role.workflows.build(:tracker_id => @tracker.id, :old_status_id => status_id, :new_status_id => new_status_id, :author => author, :assignee => assignee) 
         }
       }
       if @role.save
         flash[:notice] = l(:notice_successful_update)
         redirect_to :action => 'edit', :role_id => @role, :tracker_id => @tracker
+        return
       end
     end
     
@@ -48,6 +51,14 @@
       @statuses = @tracker.issue_statuses
     end
     @statuses ||= IssueStatus.find(:all, :order => 'position')
+    
+    if @tracker && @role && @statuses.any?
+      workflows = Workflow.all(:conditions => {:role_id => @role.id, :tracker_id => @tracker.id})
+      @workflows = {}
+      @workflows['always'] = workflows.select {|w| !w.author && !w.assignee}
+      @workflows['author'] = workflows.select {|w| w.author}
+      @workflows['assignee'] = workflows.select {|w| w.assignee}
+    end
   end
   
   def copy
--- a/app/helpers/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 36
-/svn/!svn/ver/4760/trunk/app/helpers
+/svn/!svn/ver/4990/trunk/app/helpers
 END
 trackers_helper.rb
 K 25
@@ -37,7 +37,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4613/trunk/app/helpers/repositories_helper.rb
+/svn/!svn/ver/4990/trunk/app/helpers/repositories_helper.rb
 END
 admin_helper.rb
 K 25
@@ -79,7 +79,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 51
-/svn/!svn/ver/4375/trunk/app/helpers/wiki_helper.rb
+/svn/!svn/ver/4952/trunk/app/helpers/wiki_helper.rb
 END
 enumerations_helper.rb
 K 25
@@ -91,7 +91,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4465/trunk/app/helpers/issues_helper.rb
+/svn/!svn/ver/4954/trunk/app/helpers/issues_helper.rb
+END
+queries_helper.rb
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/!svn/ver/4387/trunk/app/helpers/queries_helper.rb
 END
 gantt_helper.rb
 K 25
@@ -99,12 +105,6 @@
 V 52
 /svn/!svn/ver/4283/trunk/app/helpers/gantt_helper.rb
 END
-queries_helper.rb
-K 25
-svn:wc:ra_dav:version-url
-V 54
-/svn/!svn/ver/4387/trunk/app/helpers/queries_helper.rb
-END
 mail_handler_helper.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -135,29 +135,29 @@
 V 53
 /svn/!svn/ver/333/trunk/app/helpers/welcome_helper.rb
 END
+journals_helper.rb
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/!svn/ver/4062/trunk/app/helpers/journals_helper.rb
+END
 workflows_helper.rb
 K 25
 svn:wc:ra_dav:version-url
 V 56
 /svn/!svn/ver/1914/trunk/app/helpers/workflows_helper.rb
 END
-journals_helper.rb
-K 25
-svn:wc:ra_dav:version-url
-V 55
-/svn/!svn/ver/4062/trunk/app/helpers/journals_helper.rb
-END
 reports_helper.rb
 K 25
 svn:wc:ra_dav:version-url
 V 53
 /svn/!svn/ver/629/trunk/app/helpers/reports_helper.rb
 END
-custom_fields_helper.rb
+timelog_helper.rb
 K 25
 svn:wc:ra_dav:version-url
-V 60
-/svn/!svn/ver/4480/trunk/app/helpers/custom_fields_helper.rb
+V 54
+/svn/!svn/ver/3708/trunk/app/helpers/timelog_helper.rb
 END
 settings_helper.rb
 K 25
@@ -165,11 +165,17 @@
 V 55
 /svn/!svn/ver/4222/trunk/app/helpers/settings_helper.rb
 END
-timelog_helper.rb
+custom_fields_helper.rb
 K 25
 svn:wc:ra_dav:version-url
-V 54
-/svn/!svn/ver/3708/trunk/app/helpers/timelog_helper.rb
+V 60
+/svn/!svn/ver/4480/trunk/app/helpers/custom_fields_helper.rb
+END
+issue_moves_helper.rb
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/3936/trunk/app/helpers/issue_moves_helper.rb
 END
 users_helper.rb
 K 25
@@ -177,17 +183,11 @@
 V 52
 /svn/!svn/ver/4497/trunk/app/helpers/users_helper.rb
 END
-issue_moves_helper.rb
-K 25
-svn:wc:ra_dav:version-url
-V 58
-/svn/!svn/ver/3936/trunk/app/helpers/issue_moves_helper.rb
-END
 application_helper.rb
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/4760/trunk/app/helpers/application_helper.rb
+/svn/!svn/ver/4900/trunk/app/helpers/application_helper.rb
 END
 auth_sources_helper.rb
 K 25
--- a/app/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/helpers
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-23T17:02:10.030897Z
-4760
-jplang
+2011-03-03T03:30:10.954225Z
+4990
+tmaruyama
 
 
 
@@ -202,10 +202,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-ec30c91fbf601169b281a5cd859df2ab
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:18.000000Z
+824b766582f7177458a587dcfcf980f5
+2011-03-03T03:30:10.954225Z
+4990
 tmaruyama
 has-props
 
@@ -228,7 +228,7 @@
 
 
 
-7902
+9702
 
 admin_helper.rb
 file
@@ -440,10 +440,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-3e6762604b5e9a201b7a7bb2edc1f78f
-2010-11-06T14:30:32.528294Z
-4375
+2011-03-03T11:40:18.000000Z
+44832549db555bb9e047a67ae330f34a
+2011-02-27T12:35:31.414622Z
+4952
 jplang
 has-props
 
@@ -466,7 +466,7 @@
 
 
 
-2297
+1315
 
 enumerations_helper.rb
 file
@@ -508,10 +508,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-5bc8f95d2852e1136e9034fe21aaa2fb
-2010-12-04T13:02:14.466576Z
-4465
+2011-03-03T11:40:18.000000Z
+9dfadb196899bf96fdff7c7c34914e8c
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -534,41 +534,7 @@
 
 
 
-10511
-
-gantt_helper.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-dfac5226f31c3c232d7dcc9416172071
-2010-10-23T09:08:55.877887Z
-4283
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1988
+11599
 
 queries_helper.rb
 file
@@ -604,6 +570,40 @@
 
 3722
 
+gantt_helper.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+dfac5226f31c3c232d7dcc9416172071
+2010-10-23T09:08:55.877887Z
+4283
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1988
+
 mail_handler_helper.rb
 file
 
@@ -774,6 +774,40 @@
 
 817
 
+journals_helper.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+b64edde44bceed7fb0911f87dba971aa
+2010-09-05T22:57:20.669640Z
+4062
+edavis10
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2266
+
 workflows_helper.rb
 file
 
@@ -808,40 +842,6 @@
 
 824
 
-journals_helper.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-b64edde44bceed7fb0911f87dba971aa
-2010-09-05T22:57:20.669640Z
-4062
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2266
-
 reports_helper.rb
 file
 
@@ -876,6 +876,74 @@
 
 1265
 
+timelog_helper.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+1888fd2d4a1be5fa0d6ad8a63238e2b4
+2010-04-30T12:18:11.536180Z
+3708
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6636
+
+settings_helper.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+868d0dc19e332ae2c817321637a8e31f
+2010-09-28T21:09:06.467392Z
+4222
+edavis10
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3858
+
 custom_fields_helper.rb
 file
 
@@ -910,73 +978,39 @@
 
 5702
 
-settings_helper.rb
+issue_moves_helper.rb
 file
 
 
 
 
 2011-03-03T11:05:09.000000Z
-868d0dc19e332ae2c817321637a8e31f
-2010-09-28T21:09:06.467392Z
-4222
+66e99bd3af036c92a773a91e92a725f9
+2010-08-11T14:42:10.119704Z
+3936
 edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3858
-
-timelog_helper.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-1888fd2d4a1be5fa0d6ad8a63238e2b4
-2010-04-30T12:18:11.536180Z
-3708
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6636
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+28
 
 users_helper.rb
 file
@@ -1012,50 +1046,16 @@
 
 2767
 
-issue_moves_helper.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-66e99bd3af036c92a773a91e92a725f9
-2010-08-11T14:42:10.119704Z
-3936
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-28
-
 application_helper.rb
 file
 
 
 
 
-2011-03-03T11:05:22.000000Z
-6eb7b882b785a0e9dbd7ebf13606f026
-2011-01-23T17:02:10.030897Z
-4760
+2011-03-03T11:40:18.000000Z
+9d39fe6e2dd4535f7a006a77150961bc
+2011-02-21T09:53:29.844413Z
+4900
 jplang
 has-props
 
@@ -1078,7 +1078,7 @@
 
 
 
-35623
+36020
 
 auth_sources_helper.rb
 file
--- a/app/helpers/.svn/text-base/application_helper.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/text-base/application_helper.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -894,6 +894,15 @@
       ''
     end
   end
+  
+  # Returns the javascript tags that are included in the html layout head
+  def javascript_heads
+    tags = javascript_include_tag(:defaults)
+    unless User.current.pref.warn_on_leaving_unsaved == '0'
+      tags << "\n" + javascript_tag("Event.observe(window, 'load', function(){ new WarnLeavingUnsaved('#{escape_javascript( l(:text_warn_on_leaving_unsaved) )}'); });")
+    end
+    tags
+  end
 
   def favicon
     "<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
--- a/app/helpers/.svn/text-base/issues_helper.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/text-base/issues_helper.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -106,13 +106,32 @@
       # Project specific queries and global queries
       visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
       @sidebar_queries = Query.find(:all, 
-                                    :select => 'id, name',
+                                    :select => 'id, name, is_public',
                                     :order => "name ASC",
                                     :conditions => visible.conditions)
     end
     @sidebar_queries
   end
 
+  def query_links(title, queries)
+    # links to #index on issues/show
+    url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : params
+  
+    content_tag('h3', title) +
+      queries.collect {|query|
+          link_to(h(query.name), url_params.merge(:query_id => query))
+        }.join('<br />')
+  end
+  
+  def render_sidebar_queries
+    out = ''
+    queries = sidebar_queries.select {|q| !q.is_public?}
+    out << query_links(l(:label_my_queries), queries) if queries.any?
+    queries = sidebar_queries.select {|q| q.is_public?}
+    out << query_links(l(:label_query_plural), queries) if queries.any?
+    out
+  end
+
   def show_detail(detail, no_html=false)
     case detail.property
     when 'attr'
@@ -164,7 +183,16 @@
       end
     end
     
-    if !detail.value.blank?
+    if detail.property == 'attr' && detail.prop_key == 'description'
+      s = l(:text_journal_changed_no_detail, :label => label)
+      unless no_html
+        diff_link = link_to 'diff', 
+          {:controller => 'journals', :action => 'diff', :id => detail.journal_id, :detail_id => detail.id},
+          :title => l(:label_view_diff)
+        s << " (#{ diff_link })"
+      end
+      s
+    elsif !detail.value.blank?
       case detail.property
       when 'attr', 'cf'
         if !detail.old_value.blank?
--- a/app/helpers/.svn/text-base/repositories_helper.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/text-base/repositories_helper.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -25,13 +25,13 @@
       revision.to_s
     end
   end
-  
+
   def truncate_at_line_break(text, length = 255)
     if text
       text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
     end
   end
-  
+
   def render_properties(properties)
     unless properties.nil? || properties.empty?
       content = ''
@@ -41,7 +41,7 @@
       content_tag('ul', content, :class => 'properties')
     end
   end
-  
+
   def render_changeset_changes
     changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change|
       case change.action
@@ -75,10 +75,10 @@
     
     render_changes_tree(tree[:s])
   end
-  
+
   def render_changes_tree(tree)
     return '' if tree.nil?
-    
+
     output = ''
     output << '<ul>'
     tree.keys.sort.each do |file|
@@ -115,15 +115,18 @@
     output << '</ul>'
     output
   end
-  
+
   def to_utf8(str)
+    return str if str.blank?
     if str.respond_to?(:force_encoding)
       str.force_encoding('UTF-8')
-      return str if str.valid_encoding?
     else
+      # TODO:
+      # Japanese Shift_JIS(CP932) is not compatible with ASCII.
+      # UTF-7 and Japanese ISO-2022-JP are 7bits clean.
       return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
     end
-    
+
     @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip)
     @encodings.each do |encoding|
       begin
@@ -132,67 +135,118 @@
         # do nothing here and try the next encoding
       end
     end
+    str = replace_invalid_utf8(str)
+  end
+
+  def replace_invalid_utf8(str)
+    if str.respond_to?(:force_encoding)
+      str.force_encoding('UTF-8')
+      if ! str.valid_encoding?
+        str = str.encode("US-ASCII", :invalid => :replace,
+              :undef => :replace, :replace => '?').encode("UTF-8")
+      end
+    end
     str
   end
-  
-  def repository_field_tags(form, repository)    
+
+  def repository_field_tags(form, repository)
     method = repository.class.name.demodulize.underscore + "_field_tags"
-    send(method, form, repository) if repository.is_a?(Repository) && respond_to?(method) && method != 'repository_field_tags'
+    if repository.is_a?(Repository) &&
+        respond_to?(method) && method != 'repository_field_tags'
+      send(method, form, repository)
+    end
   end
-  
+
   def scm_select_tag(repository)
     scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']]
     Redmine::Scm::Base.all.each do |scm|
-      scm_options << ["Repository::#{scm}".constantize.scm_name, scm] if Setting.enabled_scm.include?(scm) || (repository && repository.class.name.demodulize == scm)
+    if Setting.enabled_scm.include?(scm) ||
+          (repository && repository.class.name.demodulize == scm)
+        scm_options << ["Repository::#{scm}".constantize.scm_name, scm]
+      end
     end
-    
     select_tag('repository_scm', 
                options_for_select(scm_options, repository.class.name.demodulize),
                :disabled => (repository && !repository.new_record?),
-               :onchange => remote_function(:url => { :controller => 'repositories', :action => 'edit', :id => @project }, :method => :get, :with => "Form.serialize(this.form)")
+               :onchange => remote_function(
+                  :url => {
+                      :controller => 'repositories',
+                      :action => 'edit',
+                      :id => @project
+                        },
+               :method => :get,
+               :with => "Form.serialize(this.form)")
                )
   end
-  
+
   def with_leading_slash(path)
     path.to_s.starts_with?('/') ? path : "/#{path}"
   end
-  
+
   def without_leading_slash(path)
     path.gsub(%r{^/+}, '')
   end
 
   def subversion_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)) +
+      content_tag('p', form.text_field(:url, :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
                        '<br />(file:///, http://, https://, svn://, svn+[tunnelscheme]://)') +
       content_tag('p', form.text_field(:login, :size => 30)) +
-      content_tag('p', form.password_field(:password, :size => 30, :name => 'ignore',
-                                           :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
-                                           :onfocus => "this.value=''; this.name='repository[password]';",
-                                           :onchange => "this.name='repository[password]';"))
+      content_tag('p', form.password_field(
+                            :password, :size => 30, :name => 'ignore',
+                            :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
+                            :onfocus => "this.value=''; this.name='repository[password]';",
+                            :onchange => "this.name='repository[password]';"))
   end
 
   def darcs_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def mercurial_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />local repository (e.g. /hgrepo, c:\hgrepo)' )
   end
 
   def git_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Path to .git directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Path to repository',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />a bare and local repository (e.g. /gitrepo, c:\gitrepo)')
   end
 
   def cvs_field_tags(form, repository)
-      content_tag('p', form.text_field(:root_url, :label => 'CVSROOT', :size => 60, :required => true, :disabled => !repository.new_record?)) +
-      content_tag('p', form.text_field(:url, :label => 'Module', :size => 30, :required => true, :disabled => !repository.new_record?))
+      content_tag('p', form.text_field(:root_url,
+                       :label => 'CVSROOT', :size => 60, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.text_field(:url, :label => 'Module',
+                       :size => 30, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
 
   def bazaar_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def filesystem_field_tags(form, repository)
-    content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+    content_tag('p', form.text_field(:url, :label => 'Root directory',
+                     :size => 60, :required => true,
+                     :disabled => (repository && !repository.root_url.blank?))) +
+    content_tag('p', form.select(
+                        :path_encoding, [nil] + Setting::ENCODINGS,
+                        :label => 'Path encoding') +
+                        '<br />Default: UTF-8')
   end
 end
--- a/app/helpers/.svn/text-base/wiki_helper.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/.svn/text-base/wiki_helper.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -29,41 +29,4 @@
     end
     s
   end
-  
-  def html_diff(wdiff)
-    words = wdiff.words.collect{|word| h(word)}
-    words_add = 0
-    words_del = 0
-    dels = 0
-    del_off = 0
-    wdiff.diff.diffs.each do |diff|
-      add_at = nil
-      add_to = nil
-      del_at = nil
-      deleted = ""	    
-      diff.each do |change|
-        pos = change[1]
-        if change[0] == "+"
-          add_at = pos + dels unless add_at
-          add_to = pos + dels
-          words_add += 1
-        else
-          del_at = pos unless del_at
-          deleted << ' ' + h(change[2])
-          words_del	 += 1
-        end
-      end
-      if add_at
-        words[add_at] = '<span class="diff_in">' + words[add_at]
-        words[add_to] = words[add_to] + '</span>'
-      end
-      if del_at
-        words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>'
-        dels += 1
-        del_off += words_del
-        words_del = 0
-      end
-    end
-    simple_format_without_paragraph(words.join(' '))
-  end
 end
--- a/app/helpers/application_helper.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/application_helper.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -894,6 +894,15 @@
       ''
     end
   end
+  
+  # Returns the javascript tags that are included in the html layout head
+  def javascript_heads
+    tags = javascript_include_tag(:defaults)
+    unless User.current.pref.warn_on_leaving_unsaved == '0'
+      tags << "\n" + javascript_tag("Event.observe(window, 'load', function(){ new WarnLeavingUnsaved('#{escape_javascript( l(:text_warn_on_leaving_unsaved) )}'); });")
+    end
+    tags
+  end
 
   def favicon
     "<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
--- a/app/helpers/issues_helper.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/issues_helper.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -106,13 +106,32 @@
       # Project specific queries and global queries
       visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
       @sidebar_queries = Query.find(:all, 
-                                    :select => 'id, name',
+                                    :select => 'id, name, is_public',
                                     :order => "name ASC",
                                     :conditions => visible.conditions)
     end
     @sidebar_queries
   end
 
+  def query_links(title, queries)
+    # links to #index on issues/show
+    url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : params
+  
+    content_tag('h3', title) +
+      queries.collect {|query|
+          link_to(h(query.name), url_params.merge(:query_id => query))
+        }.join('<br />')
+  end
+  
+  def render_sidebar_queries
+    out = ''
+    queries = sidebar_queries.select {|q| !q.is_public?}
+    out << query_links(l(:label_my_queries), queries) if queries.any?
+    queries = sidebar_queries.select {|q| q.is_public?}
+    out << query_links(l(:label_query_plural), queries) if queries.any?
+    out
+  end
+
   def show_detail(detail, no_html=false)
     case detail.property
     when 'attr'
@@ -164,7 +183,16 @@
       end
     end
     
-    if !detail.value.blank?
+    if detail.property == 'attr' && detail.prop_key == 'description'
+      s = l(:text_journal_changed_no_detail, :label => label)
+      unless no_html
+        diff_link = link_to 'diff', 
+          {:controller => 'journals', :action => 'diff', :id => detail.journal_id, :detail_id => detail.id},
+          :title => l(:label_view_diff)
+        s << " (#{ diff_link })"
+      end
+      s
+    elsif !detail.value.blank?
       case detail.property
       when 'attr', 'cf'
         if !detail.old_value.blank?
--- a/app/helpers/repositories_helper.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/repositories_helper.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -25,13 +25,13 @@
       revision.to_s
     end
   end
-  
+
   def truncate_at_line_break(text, length = 255)
     if text
       text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
     end
   end
-  
+
   def render_properties(properties)
     unless properties.nil? || properties.empty?
       content = ''
@@ -41,7 +41,7 @@
       content_tag('ul', content, :class => 'properties')
     end
   end
-  
+
   def render_changeset_changes
     changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change|
       case change.action
@@ -75,10 +75,10 @@
     
     render_changes_tree(tree[:s])
   end
-  
+
   def render_changes_tree(tree)
     return '' if tree.nil?
-    
+
     output = ''
     output << '<ul>'
     tree.keys.sort.each do |file|
@@ -115,15 +115,18 @@
     output << '</ul>'
     output
   end
-  
+
   def to_utf8(str)
+    return str if str.blank?
     if str.respond_to?(:force_encoding)
       str.force_encoding('UTF-8')
-      return str if str.valid_encoding?
     else
+      # TODO:
+      # Japanese Shift_JIS(CP932) is not compatible with ASCII.
+      # UTF-7 and Japanese ISO-2022-JP are 7bits clean.
       return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
     end
-    
+
     @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip)
     @encodings.each do |encoding|
       begin
@@ -132,67 +135,118 @@
         # do nothing here and try the next encoding
       end
     end
+    str = replace_invalid_utf8(str)
+  end
+
+  def replace_invalid_utf8(str)
+    if str.respond_to?(:force_encoding)
+      str.force_encoding('UTF-8')
+      if ! str.valid_encoding?
+        str = str.encode("US-ASCII", :invalid => :replace,
+              :undef => :replace, :replace => '?').encode("UTF-8")
+      end
+    end
     str
   end
-  
-  def repository_field_tags(form, repository)    
+
+  def repository_field_tags(form, repository)
     method = repository.class.name.demodulize.underscore + "_field_tags"
-    send(method, form, repository) if repository.is_a?(Repository) && respond_to?(method) && method != 'repository_field_tags'
+    if repository.is_a?(Repository) &&
+        respond_to?(method) && method != 'repository_field_tags'
+      send(method, form, repository)
+    end
   end
-  
+
   def scm_select_tag(repository)
     scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']]
     Redmine::Scm::Base.all.each do |scm|
-      scm_options << ["Repository::#{scm}".constantize.scm_name, scm] if Setting.enabled_scm.include?(scm) || (repository && repository.class.name.demodulize == scm)
+    if Setting.enabled_scm.include?(scm) ||
+          (repository && repository.class.name.demodulize == scm)
+        scm_options << ["Repository::#{scm}".constantize.scm_name, scm]
+      end
     end
-    
     select_tag('repository_scm', 
                options_for_select(scm_options, repository.class.name.demodulize),
                :disabled => (repository && !repository.new_record?),
-               :onchange => remote_function(:url => { :controller => 'repositories', :action => 'edit', :id => @project }, :method => :get, :with => "Form.serialize(this.form)")
+               :onchange => remote_function(
+                  :url => {
+                      :controller => 'repositories',
+                      :action => 'edit',
+                      :id => @project
+                        },
+               :method => :get,
+               :with => "Form.serialize(this.form)")
                )
   end
-  
+
   def with_leading_slash(path)
     path.to_s.starts_with?('/') ? path : "/#{path}"
   end
-  
+
   def without_leading_slash(path)
     path.gsub(%r{^/+}, '')
   end
 
   def subversion_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)) +
+      content_tag('p', form.text_field(:url, :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
                        '<br />(file:///, http://, https://, svn://, svn+[tunnelscheme]://)') +
       content_tag('p', form.text_field(:login, :size => 30)) +
-      content_tag('p', form.password_field(:password, :size => 30, :name => 'ignore',
-                                           :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
-                                           :onfocus => "this.value=''; this.name='repository[password]';",
-                                           :onchange => "this.name='repository[password]';"))
+      content_tag('p', form.password_field(
+                            :password, :size => 30, :name => 'ignore',
+                            :value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
+                            :onfocus => "this.value=''; this.name='repository[password]';",
+                            :onchange => "this.name='repository[password]';"))
   end
 
   def darcs_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def mercurial_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />local repository (e.g. /hgrepo, c:\hgrepo)' )
   end
 
   def git_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Path to .git directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+      content_tag('p', form.text_field(:url, :label => 'Path to repository',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.root_url.blank?)) +
+                       '<br />a bare and local repository (e.g. /gitrepo, c:\gitrepo)')
   end
 
   def cvs_field_tags(form, repository)
-      content_tag('p', form.text_field(:root_url, :label => 'CVSROOT', :size => 60, :required => true, :disabled => !repository.new_record?)) +
-      content_tag('p', form.text_field(:url, :label => 'Module', :size => 30, :required => true, :disabled => !repository.new_record?))
+      content_tag('p', form.text_field(:root_url,
+                       :label => 'CVSROOT', :size => 60, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.text_field(:url, :label => 'Module',
+                       :size => 30, :required => true,
+                       :disabled => !repository.new_record?)) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
 
   def bazaar_field_tags(form, repository)
-      content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+      content_tag('p', form.text_field(:url, :label => 'Root directory',
+                       :size => 60, :required => true,
+                       :disabled => (repository && !repository.new_record?))) +
+      content_tag('p', form.select(:log_encoding, [nil] + Setting::ENCODINGS,
+                                 :label => 'Commit messages encoding', :required => true))
   end
-  
+
   def filesystem_field_tags(form, repository)
-    content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
+    content_tag('p', form.text_field(:url, :label => 'Root directory',
+                     :size => 60, :required => true,
+                     :disabled => (repository && !repository.root_url.blank?))) +
+    content_tag('p', form.select(
+                        :path_encoding, [nil] + Setting::ENCODINGS,
+                        :label => 'Path encoding') +
+                        '<br />Default: UTF-8')
   end
 end
--- a/app/helpers/wiki_helper.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/helpers/wiki_helper.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -29,41 +29,4 @@
     end
     s
   end
-  
-  def html_diff(wdiff)
-    words = wdiff.words.collect{|word| h(word)}
-    words_add = 0
-    words_del = 0
-    dels = 0
-    del_off = 0
-    wdiff.diff.diffs.each do |diff|
-      add_at = nil
-      add_to = nil
-      del_at = nil
-      deleted = ""	    
-      diff.each do |change|
-        pos = change[1]
-        if change[0] == "+"
-          add_at = pos + dels unless add_at
-          add_to = pos + dels
-          words_add += 1
-        else
-          del_at = pos unless del_at
-          deleted << ' ' + h(change[2])
-          words_del	 += 1
-        end
-      end
-      if add_at
-        words[add_at] = '<span class="diff_in">' + words[add_at]
-        words[add_to] = words[add_to] + '</span>'
-      end
-      if del_at
-        words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>'
-        dels += 1
-        del_off += words_del
-        words_del = 0
-      end
-    end
-    simple_format_without_paragraph(words.join(' '))
-  end
 end
--- a/app/models/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 35
-/svn/!svn/ver/4802/trunk/app/models
+/svn/!svn/ver/4982/trunk/app/models
 END
 document.rb
 K 25
@@ -13,13 +13,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 51
-/svn/!svn/ver/4682/trunk/app/models/mail_handler.rb
+/svn/!svn/ver/4820/trunk/app/models/mail_handler.rb
 END
 repository.rb
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4712/trunk/app/models/repository.rb
+/svn/!svn/ver/4982/trunk/app/models/repository.rb
 END
 time_entry.rb
 K 25
@@ -43,7 +43,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 55
-/svn/!svn/ver/3492/trunk/app/models/auth_source_ldap.rb
+/svn/!svn/ver/4950/trunk/app/models/auth_source_ldap.rb
 END
 principal.rb
 K 25
@@ -81,11 +81,17 @@
 V 50
 /svn/!svn/ver/3240/trunk/app/models/enumeration.rb
 END
+member_role.rb
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/!svn/ver/3250/trunk/app/models/member_role.rb
+END
 issue.rb
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4735/trunk/app/models/issue.rb
+/svn/!svn/ver/4954/trunk/app/models/issue.rb
 END
 time_entry_activity_custom_field.rb
 K 25
@@ -93,12 +99,6 @@
 V 71
 /svn/!svn/ver/2952/trunk/app/models/time_entry_activity_custom_field.rb
 END
-member_role.rb
-K 25
-svn:wc:ra_dav:version-url
-V 50
-/svn/!svn/ver/3250/trunk/app/models/member_role.rb
-END
 issue_priority.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -111,29 +111,29 @@
 V 55
 /svn/!svn/ver/3169/trunk/app/models/message_observer.rb
 END
+watcher.rb
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/3167/trunk/app/models/watcher.rb
+END
 wiki_content.rb
 K 25
 svn:wc:ra_dav:version-url
 V 51
 /svn/!svn/ver/4296/trunk/app/models/wiki_content.rb
 END
-watcher.rb
+enabled_module.rb
 K 25
 svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/3167/trunk/app/models/watcher.rb
+V 53
+/svn/!svn/ver/2970/trunk/app/models/enabled_module.rb
 END
 wiki_page.rb
 K 25
 svn:wc:ra_dav:version-url
 V 48
-/svn/!svn/ver/4296/trunk/app/models/wiki_page.rb
-END
-enabled_module.rb
-K 25
-svn:wc:ra_dav:version-url
-V 53
-/svn/!svn/ver/2970/trunk/app/models/enabled_module.rb
+/svn/!svn/ver/4952/trunk/app/models/wiki_page.rb
 END
 comment.rb
 K 25
@@ -151,7 +151,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4553/trunk/app/models/query.rb
+/svn/!svn/ver/4888/trunk/app/models/query.rb
 END
 member.rb
 K 25
@@ -171,18 +171,18 @@
 V 45
 /svn/!svn/ver/4752/trunk/app/models/mailer.rb
 END
+journal.rb
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4062/trunk/app/models/journal.rb
+END
 workflow.rb
 K 25
 svn:wc:ra_dav:version-url
 V 47
 /svn/!svn/ver/3709/trunk/app/models/workflow.rb
 END
-journal.rb
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/4062/trunk/app/models/journal.rb
-END
 user_custom_field.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -205,19 +205,19 @@
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/3417/trunk/app/models/setting.rb
+/svn/!svn/ver/4899/trunk/app/models/setting.rb
 END
 user.rb
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/4761/trunk/app/models/user.rb
+/svn/!svn/ver/4936/trunk/app/models/user.rb
 END
 auth_source.rb
 K 25
 svn:wc:ra_dav:version-url
 V 50
-/svn/!svn/ver/3745/trunk/app/models/auth_source.rb
+/svn/!svn/ver/4950/trunk/app/models/auth_source.rb
 END
 news_observer.rb
 K 25
@@ -283,7 +283,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 51
-/svn/!svn/ver/4599/trunk/app/models/issue_status.rb
+/svn/!svn/ver/4895/trunk/app/models/issue_status.rb
 END
 time_entry_activity.rb
 K 25
@@ -300,8 +300,8 @@
 journal_detail.rb
 K 25
 svn:wc:ra_dav:version-url
-V 52
-/svn/!svn/ver/478/trunk/app/models/journal_detail.rb
+V 53
+/svn/!svn/ver/4954/trunk/app/models/journal_detail.rb
 END
 group.rb
 K 25
@@ -319,7 +319,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 48
-/svn/!svn/ver/4613/trunk/app/models/changeset.rb
+/svn/!svn/ver/4962/trunk/app/models/changeset.rb
 END
 role.rb
 K 25
@@ -367,5 +367,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 54
-/svn/!svn/ver/1623/trunk/app/models/user_preference.rb
+/svn/!svn/ver/4900/trunk/app/models/user_preference.rb
 END
--- a/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/models
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 
 
@@ -69,11 +69,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-122f4a542fc3b0425bacdf2365e83004
-2011-01-10T19:57:41.641529Z
-4682
-jplang
+2011-03-03T11:40:18.000000Z
+ed655ccb5c306f548b3997d2dd3e3d60
+2011-02-12T10:08:11.630366Z
+4820
+jbbarth
 has-props
 
 
@@ -95,7 +95,7 @@
 
 
 
-13721
+13778
 
 repository.rb
 file
@@ -103,10 +103,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-ef582464c7d04e61c0149608ea3dd11c
-2011-01-14T22:51:12.547821Z
-4712
+2011-03-03T11:40:18.000000Z
+a3fb46324c320aab8869e523c2a35d2a
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -129,7 +129,7 @@
 
 
 
-7023
+8497
 
 time_entry.rb
 file
@@ -239,10 +239,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-87f2ff0401993963de36fe7502cd6949
-2010-02-26T09:13:12.187275Z
-3492
+2011-03-03T11:40:18.000000Z
+82898965a0c07d8fa25a52cfced3139f
+2011-02-26T13:09:25.657748Z
+4950
 jplang
 has-props
 
@@ -471,6 +471,74 @@
 
 3856
 
+issue.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+de5e44263227d075bddb23d8f478e24d
+2011-02-27T13:34:41.060565Z
+4954
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+32300
+
+member_role.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+95caba31fc55fea2d5ff257e70cf14b2
+2009-12-26T16:14:55.591181Z
+3250
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2011
+
 time_entry_activity_custom_field.rb
 file
 
@@ -505,74 +573,6 @@
 
 896
 
-member_role.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-95caba31fc55fea2d5ff257e70cf14b2
-2009-12-26T16:14:55.591181Z
-3250
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2011
-
-issue.rb
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-c204ee16bf640ce033289ec49f99b970
-2011-01-22T11:46:15.415880Z
-4735
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-32179
-
 issue_priority.rb
 file
 
@@ -641,6 +641,40 @@
 
 979
 
+watcher.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+c72443f206052fafae720378fba40163
+2009-12-13T12:39:22.716082Z
+3167
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2093
+
 wiki_content.rb
 file
 
@@ -675,74 +709,6 @@
 
 4480
 
-watcher.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-c72443f206052fafae720378fba40163
-2009-12-13T12:39:22.716082Z
-3167
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2093
-
-wiki_page.rb
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-a45da72d99c7bc05ce93eb86205942e5
-2010-10-27T16:27:06.240747Z
-4296
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6720
-
 enabled_module.rb
 file
 
@@ -777,6 +743,40 @@
 
 1296
 
+wiki_page.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+f95a3be2b4090d0bd5b7d74b9e1d0a7c
+2011-02-27T12:35:31.414622Z
+4952
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6539
+
 comment.rb
 file
 
@@ -851,10 +851,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-05f6de2ec101b91c331e3b69602f73de
-2010-12-21T21:46:54.984442Z
-4553
+2011-03-03T11:40:18.000000Z
+886a34f5ef28f29a9eadb6e24dee89d6
+2011-02-20T13:03:32.835478Z
+4888
 jplang
 has-props
 
@@ -877,7 +877,7 @@
 
 
 
-26177
+26359
 
 member.rb
 file
@@ -981,6 +981,40 @@
 
 18498
 
+journal.rb
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+f3797cd6a4b7e4d256aba15e317e98b1
+2010-09-05T22:57:20.669640Z
+4062
+edavis10
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3214
+
 workflow.rb
 file
 
@@ -1015,40 +1049,6 @@
 
 4028
 
-journal.rb
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-f3797cd6a4b7e4d256aba15e317e98b1
-2010-09-05T22:57:20.669640Z
-4062
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3214
-
 user_custom_field.rb
 file
 
@@ -1157,11 +1157,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-5a0ad520fc95e7fefd2c6e6a1c9c3e76
-2010-02-12T22:08:02.981984Z
-3417
-edavis10
+2011-03-03T11:40:18.000000Z
+2815413f18c2ff6c015f0742ac28710a
+2011-02-21T09:41:34.953350Z
+4899
+tmaruyama
 has-props
 
 
@@ -1183,7 +1183,7 @@
 
 
 
-5164
+5188
 
 user.rb
 file
@@ -1191,10 +1191,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-6b483ec94e3ac2e3955f641423089ea4
-2011-01-24T17:28:59.767504Z
-4761
+2011-03-03T11:40:18.000000Z
+8616fc89354fef549fdfc741600c1118
+2011-02-23T17:27:31.762248Z
+4936
 jplang
 has-props
 
@@ -1217,7 +1217,7 @@
 
 
 
-17982
+19152
 
 auth_source.rb
 file
@@ -1225,11 +1225,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-837db713425e094779466a392a668679
-2010-05-23T03:16:37.499264Z
-3745
-edavis10
+2011-03-03T11:40:18.000000Z
+f746a9534698bb8db5abf4bb7c9dd5ef
+2011-02-26T13:09:25.657748Z
+4950
+jplang
 has-props
 
 
@@ -1251,7 +1251,7 @@
 
 
 
-1811
+2013
 
 news_observer.rb
 file
@@ -1599,10 +1599,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-b659d10bfe8c0debcf69013051422682
-2010-12-31T15:30:50.544770Z
-4599
+2011-03-03T11:40:18.000000Z
+4670d7c2c9ef9e23b0812e79c84c02de
+2011-02-20T15:38:07.840581Z
+4895
 jplang
 has-props
 
@@ -1625,7 +1625,7 @@
 
 
 
-3392
+3396
 
 time_entry_activity.rb
 file
@@ -1701,10 +1701,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-4b700215d4c3bf72071a45448fa2b0e3
-2007-04-24T18:26:42.003879Z
-478
+2011-03-03T11:40:18.000000Z
+5f341c076b3e061541111187994969c8
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -1727,7 +1727,7 @@
 
 
 
-1028
+864
 
 group.rb
 file
@@ -1803,10 +1803,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-31b78fcec84fafc7077e80a8782e8889
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:18.000000Z
+949462e61d78ec8bd5afc1af77363985
+2011-02-28T12:09:32.515358Z
+4962
 tmaruyama
 has-props
 
@@ -1829,7 +1829,7 @@
 
 
 
-8976
+9103
 
 role.rb
 file
@@ -2075,10 +2075,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-41ea06399352eb7b8c2903357abe1ab0
-2008-07-04T17:58:14.743502Z
-1623
+2011-03-03T11:40:18.000000Z
+feac9af79af67a78c767bd3def262255
+2011-02-21T09:53:29.844413Z
+4900
 jplang
 has-props
 
@@ -2101,5 +2101,5 @@
 
 
 
-1513
+1671
 
--- a/app/models/.svn/text-base/auth_source.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/auth_source.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -16,6 +16,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class AuthSource < ActiveRecord::Base
+  include Redmine::Ciphering
+  
   has_many :users
   
   validates_presence_of :name
@@ -31,6 +33,14 @@
   def auth_method_name
     "Abstract"
   end
+  
+  def account_password
+    read_ciphered_attribute(:account_password)
+  end
+  
+  def account_password=(arg)
+    write_ciphered_attribute(:account_password, arg)
+  end
 
   def allow_password_changes?
     self.class.allow_password_changes?
--- a/app/models/.svn/text-base/auth_source_ldap.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/auth_source_ldap.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,8 +20,8 @@
 
 class AuthSourceLdap < AuthSource 
   validates_presence_of :host, :port, :attr_login
-  validates_length_of :name, :host, :account_password, :maximum => 60, :allow_nil => true
-  validates_length_of :account, :base_dn, :maximum => 255, :allow_nil => true
+  validates_length_of :name, :host, :maximum => 60, :allow_nil => true
+  validates_length_of :account, :account_password, :base_dn, :maximum => 255, :allow_nil => true
   validates_length_of :attr_login, :attr_firstname, :attr_lastname, :attr_mail, :maximum => 30, :allow_nil => true
   validates_numericality_of :port, :only_integer => true
   
--- a/app/models/.svn/text-base/changeset.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/changeset.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -56,10 +56,6 @@
       revision.to_s
     end
   end
-  
-  def comments=(comment)
-    write_attribute(:comments, Changeset.normalize_comments(comment))
-  end
 
   def committed_on=(date)
     self.commit_date = date
@@ -75,10 +71,6 @@
     end
   end
   
-  def committer=(arg)
-    write_attribute(:committer, self.class.to_utf8(arg.to_s))
-  end
-
   def project
     repository.project
   end
@@ -88,20 +80,24 @@
   end
   
   def before_create
-    self.user = repository.find_committer_user(committer)
+    self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding)
+    self.comments  = self.class.normalize_comments(self.comments, repository.repo_log_encoding)
+    self.user = repository.find_committer_user(self.committer)
   end
-  
+
   def after_create
     scan_comment_for_issue_ids
   end
   
   TIMELOG_RE = /
     (
-    (\d+([.,]\d+)?)h?
+    ((\d+)(h|hours?))((\d+)(m|min)?)?
+    |
+    ((\d+)(h|hours?|m|min))
     |
     (\d+):(\d+)
     |
-    ((\d+)(h|hours?))?((\d+)(m|min)?)?
+    (\d+([\.,]\d+)?)h?
     )
     /x
   
@@ -161,11 +157,6 @@
     @next ||= Changeset.find(:first, :conditions => ['id > ? AND repository_id = ?', self.id, self.repository_id], :order => 'id ASC')
   end
   
-  # Strips and reencodes a commit log before insertion into the database
-  def self.normalize_comments(str)
-    to_utf8(str.to_s.strip)
-  end
-
   # Creates a new Change from it's common parameters
   def create_change(change)
     Change.create(:changeset => self,
@@ -174,7 +165,7 @@
                   :from_path => change[:from_path],
                   :from_revision => change[:from_revision])
   end
-  
+
   private
 
   # Finds an issue that can be referenced by the commit message
@@ -244,15 +235,17 @@
     return @short_comments, @long_comments
   end
 
-  def self.to_utf8(str)
-    if str.respond_to?(:force_encoding)
-      str.force_encoding('UTF-8')
-      return str if str.valid_encoding?
-    else
-      return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
-    end
+  public
 
-    encoding = Setting.commit_logs_encoding.to_s.strip
+  # Strips and reencodes a commit log before insertion into the database
+  def self.normalize_comments(str, encoding)
+    Changeset.to_utf8(str.to_s.strip, encoding)
+  end
+
+  private
+
+  def self.to_utf8(str, encoding)
+    return str if str.blank?
     unless encoding.blank? || encoding == 'UTF-8'
       begin
         str = Iconv.conv('UTF-8', encoding, str)
@@ -260,12 +253,20 @@
         # do nothing here
       end
     end
-    # removes invalid UTF8 sequences
-    begin
-      Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + '  ')[0..-3]
-    rescue Iconv::InvalidEncoding
-      # "UTF-8//IGNORE" is not supported on some OS
-      str
+    if str.respond_to?(:force_encoding)
+      str.force_encoding('UTF-8')
+      if ! str.valid_encoding?
+        str = str.encode("US-ASCII", :invalid => :replace,
+              :undef => :replace, :replace => '?').encode("UTF-8")
+      end
+    else
+      # removes invalid UTF8 sequences
+      begin
+        str = Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + '  ')[0..-3]
+      rescue Iconv::InvalidEncoding
+        # "UTF-8//IGNORE" is not supported on some OS
+      end
     end
+    str
   end
 end
--- a/app/models/.svn/text-base/issue.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/issue.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -422,7 +422,12 @@
   
   # Returns an array of status that user is able to apply
   def new_statuses_allowed_to(user, include_default=false)
-    statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
+    statuses = status.find_new_statuses_allowed_to(
+      user.roles_for_project(project),
+      tracker,
+      author == user,
+      assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
+      )
     statuses << status unless statuses.empty?
     statuses << IssueStatus.default if include_default
     statuses = statuses.uniq.sort
@@ -824,7 +829,7 @@
   def create_journal
     if @current_journal
       # attributes changes
-      (Issue.column_names - %w(id description root_id lft rgt lock_version created_on updated_on)).each {|c|
+      (Issue.column_names - %w(id root_id lft rgt lock_version created_on updated_on)).each {|c|
         @current_journal.details << JournalDetail.new(:property => 'attr',
                                                       :prop_key => c,
                                                       :old_value => @issue_before_change.send(c),
--- a/app/models/.svn/text-base/issue_status.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/issue_status.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -50,10 +50,16 @@
 
   # Returns an array of all statuses the given role can switch to
   # Uses association cache when called more than one time
-  def new_statuses_allowed_to(roles, tracker)
+  def new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
     if roles && tracker
       role_ids = roles.collect(&:id)
-      new_statuses = workflows.select {|w| role_ids.include?(w.role_id) && w.tracker_id == tracker.id}.collect{|w| w.new_status}.compact.sort
+      transitions = workflows.select do |w|
+        role_ids.include?(w.role_id) &&
+        w.tracker_id == tracker.id && 
+        (author || !w.author) &&
+        (assignee || !w.assignee)
+      end
+      transitions.collect{|w| w.new_status}.compact.sort
     else
       []
     end
@@ -61,24 +67,19 @@
   
   # Same thing as above but uses a database query
   # More efficient than the previous method if called just once
-  def find_new_statuses_allowed_to(roles, tracker)
+  def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
     if roles && tracker
+      conditions = {:role_id => roles.collect(&:id), :tracker_id => tracker.id}
+      conditions[:author] = false unless author
+      conditions[:assignee] = false unless assignee
+      
       workflows.find(:all,
                      :include => :new_status,
-                     :conditions => { :role_id => roles.collect(&:id), 
-                                      :tracker_id => tracker.id}).collect{ |w| w.new_status }.compact.sort
+                     :conditions => conditions).collect{|w| w.new_status}.compact.sort
     else
       []
     end
   end
-  
-  def new_status_allowed_to?(status, roles, tracker)
-    if status && roles && tracker
-      !workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => roles.collect(&:id), :tracker_id => tracker.id}).nil?
-    else
-      false
-    end
-  end
 
   def <=>(status)
     position <=> status.position
--- a/app/models/.svn/text-base/journal_detail.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/journal_detail.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -17,9 +17,4 @@
 
 class JournalDetail < ActiveRecord::Base
   belongs_to :journal
-  
-  def before_save
-    self.value = value[0..254] if value && value.is_a?(String)
-    self.old_value = old_value[0..254] if old_value && old_value.is_a?(String)
-  end
 end
--- a/app/models/.svn/text-base/mail_handler.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/mail_handler.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -100,7 +100,7 @@
     elsif m = email.subject.match(MESSAGE_REPLY_SUBJECT_RE)
       receive_message_reply(m[1].to_i)
     else
-      receive_issue
+      dispatch_to_default
     end
   rescue ActiveRecord::RecordInvalid => e
     # TODO: send a email to the user
@@ -113,6 +113,10 @@
     logger.error "MailHandler: unauthorized attempt from #{user}" if logger
     false
   end
+
+  def dispatch_to_default
+    receive_issue
+  end
   
   # Creates a new issue
   def receive_issue
--- a/app/models/.svn/text-base/query.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/query.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -566,9 +566,19 @@
     sql = ''
     case operator
     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 "!"
-      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 "!*"
       sql = "#{db_table}.#{db_field} IS NULL"
       sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
--- a/app/models/.svn/text-base/repository.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/repository.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -16,6 +16,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class Repository < ActiveRecord::Base
+  include Redmine::Ciphering
+  
   belongs_to :project
   has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
   has_many :changes, :through => :changesets
@@ -24,29 +26,43 @@
   # has_many :changesets, :dependent => :destroy is too slow for big repositories
   before_destroy :clear_changesets
   
+  validates_length_of :password, :maximum => 255, :allow_nil => true
   # Checks if the SCM is enabled when creating a repository
   validate_on_create { |r| r.errors.add(:type, :invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
-  
+
   # Removes leading and trailing whitespace
   def url=(arg)
     write_attribute(:url, arg ? arg.to_s.strip : nil)
   end
-  
+
   # Removes leading and trailing whitespace
   def root_url=(arg)
     write_attribute(:root_url, arg ? arg.to_s.strip : nil)
   end
+  
+  def password
+    read_ciphered_attribute(:password)
+  end
+  
+  def password=(arg)
+    write_ciphered_attribute(:password, arg)
+  end
+
+  def scm_adapter
+    self.class.scm_adapter_class
+  end
 
   def scm
-    @scm ||= self.scm_adapter.new url, root_url, login, password
+    @scm ||= self.scm_adapter.new(url, root_url,
+                                  login, password, path_encoding)
     update_attribute(:root_url, @scm.root_url) if root_url.blank?
     @scm
   end
-  
+
   def scm_name
     self.class.scm_name
   end
-  
+
   def supports_cat?
     scm.supports_cat?
   end
@@ -173,18 +189,27 @@
       user
     end
   end
-  
+
+  def repo_log_encoding
+    encoding = log_encoding.to_s.strip
+    encoding.blank? ? 'UTF-8' : encoding
+  end
+
   # Fetches new changesets for all repositories of active projects
   # Can be called periodically by an external script
   # eg. ruby script/runner "Repository.fetch_changesets"
   def self.fetch_changesets
     Project.active.has_module(:repository).find(:all, :include => :repository).each do |project|
       if project.repository
-        project.repository.fetch_changesets
+        begin
+          project.repository.fetch_changesets
+        rescue Redmine::Scm::Adapters::CommandFailed => e
+          logger.error "scm: error during fetching changesets: #{e.message}"
+        end
       end
     end
   end
-  
+
   # scan changeset comments to find related and fixed issues for all repositories
   def self.scan_changesets_for_issue_ids
     find(:all).each(&:scan_changesets_for_issue_ids)
@@ -197,16 +222,50 @@
   def self.available_scm
     subclasses.collect {|klass| [klass.scm_name, klass.name]}
   end
-  
+
   def self.factory(klass_name, *args)
     klass = "Repository::#{klass_name}".constantize
     klass.new(*args)
   rescue
     nil
   end
-  
+
+  def self.scm_adapter_class
+    nil
+  end
+
+  def self.scm_command
+    ret = ""
+    begin
+      ret = self.scm_adapter_class.client_command if self.scm_adapter_class
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get command: #{e.message}"
+    end
+    ret
+  end
+
+  def self.scm_version_string
+    ret = ""
+    begin
+      ret = self.scm_adapter_class.client_version_string if self.scm_adapter_class
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get version string: #{e.message}"
+    end
+    ret
+  end
+
+  def self.scm_available
+    ret = false
+    begin
+      ret = self.scm_adapter_class.client_available if self.scm_adapter_class 
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get scm available: #{e.message}"
+    end
+    ret
+  end
+
   private
-  
+
   def before_save
     # Strips url and root_url
     url.strip!
--- a/app/models/.svn/text-base/setting.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/setting.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -65,6 +65,7 @@
                   UTF-16LE
                   EUC-JP
                   Shift_JIS
+                  CP932
                   GB18030
                   GBK
                   ISCII91
--- a/app/models/.svn/text-base/user.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/user.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -83,7 +83,9 @@
   
   def before_save
     # update hashed_password if password was set
-    self.hashed_password = User.hash_password(self.password) if self.password && self.auth_source_id.blank?
+    if self.password && self.auth_source_id.blank?
+      salt_password(password)
+    end
   end
   
   def reload(*args)
@@ -121,7 +123,7 @@
         return nil unless user.auth_source.authenticate(login, password)
       else
         # authentication with local password
-        return nil unless User.hash_password(password) == user.hashed_password        
+        return nil unless user.check_password?(password)
       end
     else
       # user is not yet registered, try to authenticate with available sources
@@ -200,13 +202,21 @@
     update_attribute(:status, STATUS_LOCKED)
   end
 
+  # Returns true if +clear_password+ is the correct user's password, otherwise false
   def check_password?(clear_password)
     if auth_source_id.present?
       auth_source.authenticate(self.login, clear_password)
     else
-      User.hash_password(clear_password) == self.hashed_password
+      User.hash_password("#{salt}#{User.hash_password clear_password}") == hashed_password
     end
   end
+  
+  # Generates a random salt and computes hashed_password for +clear_password+
+  # The hashed password is stored in the following form: SHA1(salt + SHA1(password))
+  def salt_password(clear_password)
+    self.salt = User.generate_salt
+    self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}")
+  end
 
   # Does the backend storage allow this user to change their password?
   def change_password_allowed?
@@ -473,6 +483,20 @@
     end
     anonymous_user
   end
+
+  # Salts all existing unsalted passwords
+  # It changes password storage scheme from SHA1(password) to SHA1(salt + SHA1(password))
+  # This method is used in the SaltPasswords migration and is to be kept as is
+  def self.salt_unsalted_passwords!
+    transaction do
+      User.find_each(:conditions => "salt IS NULL OR salt = ''") do |user|
+        next if user.hashed_password.blank?
+        salt = User.generate_salt
+        hashed_password = User.hash_password("#{salt}#{user.hashed_password}")
+        User.update_all("salt = '#{salt}', hashed_password = '#{hashed_password}'", ["id = ?", user.id] )
+      end
+    end
+  end
   
   protected
   
@@ -514,6 +538,12 @@
   def self.hash_password(clear_password)
     Digest::SHA1.hexdigest(clear_password || "")
   end
+  
+  # Returns a 128bits random salt as a hex string (32 chars long)
+  def self.generate_salt
+    ActiveSupport::SecureRandom.hex(16)
+  end
+  
 end
 
 class AnonymousUser < User
--- a/app/models/.svn/text-base/user_preference.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/user_preference.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -51,4 +51,7 @@
   
   def comments_sorting; self[:comments_sorting] end
   def comments_sorting=(order); self[:comments_sorting]=order end
+  
+  def warn_on_leaving_unsaved; self[:warn_on_leaving_unsaved] || '1'; end
+  def warn_on_leaving_unsaved=(value); self[:warn_on_leaving_unsaved]=value; end
 end
--- a/app/models/.svn/text-base/wiki_page.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/.svn/text-base/wiki_page.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 # Redmine - project management software
-# Copyright (C) 2006-2009  Jean-Philippe Lang
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -149,17 +149,13 @@
   end
 end
 
-class WikiDiff
-  attr_reader :diff, :words, :content_to, :content_from
+class WikiDiff < Redmine::Helpers::Diff
+  attr_reader :content_to, :content_from
   
   def initialize(content_to, content_from)
     @content_to = content_to
     @content_from = content_from
-    @words = content_to.text.split(/(\s+)/)
-    @words = @words.select {|word| word != ' '}
-    words_from = content_from.text.split(/(\s+)/)
-    words_from = words_from.select {|word| word != ' '}    
-    @diff = words_from.diff @words
+    super(content_to.text, content_from.text)
   end
 end
 
--- a/app/models/auth_source.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/auth_source.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -16,6 +16,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class AuthSource < ActiveRecord::Base
+  include Redmine::Ciphering
+  
   has_many :users
   
   validates_presence_of :name
@@ -31,6 +33,14 @@
   def auth_method_name
     "Abstract"
   end
+  
+  def account_password
+    read_ciphered_attribute(:account_password)
+  end
+  
+  def account_password=(arg)
+    write_ciphered_attribute(:account_password, arg)
+  end
 
   def allow_password_changes?
     self.class.allow_password_changes?
--- a/app/models/auth_source_ldap.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/auth_source_ldap.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -20,8 +20,8 @@
 
 class AuthSourceLdap < AuthSource 
   validates_presence_of :host, :port, :attr_login
-  validates_length_of :name, :host, :account_password, :maximum => 60, :allow_nil => true
-  validates_length_of :account, :base_dn, :maximum => 255, :allow_nil => true
+  validates_length_of :name, :host, :maximum => 60, :allow_nil => true
+  validates_length_of :account, :account_password, :base_dn, :maximum => 255, :allow_nil => true
   validates_length_of :attr_login, :attr_firstname, :attr_lastname, :attr_mail, :maximum => 30, :allow_nil => true
   validates_numericality_of :port, :only_integer => true
   
--- a/app/models/changeset.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/changeset.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -56,10 +56,6 @@
       revision.to_s
     end
   end
-  
-  def comments=(comment)
-    write_attribute(:comments, Changeset.normalize_comments(comment))
-  end
 
   def committed_on=(date)
     self.commit_date = date
@@ -75,10 +71,6 @@
     end
   end
   
-  def committer=(arg)
-    write_attribute(:committer, self.class.to_utf8(arg.to_s))
-  end
-
   def project
     repository.project
   end
@@ -88,20 +80,24 @@
   end
   
   def before_create
-    self.user = repository.find_committer_user(committer)
+    self.committer = self.class.to_utf8(self.committer, repository.repo_log_encoding)
+    self.comments  = self.class.normalize_comments(self.comments, repository.repo_log_encoding)
+    self.user = repository.find_committer_user(self.committer)
   end
-  
+
   def after_create
     scan_comment_for_issue_ids
   end
   
   TIMELOG_RE = /
     (
-    (\d+([.,]\d+)?)h?
+    ((\d+)(h|hours?))((\d+)(m|min)?)?
+    |
+    ((\d+)(h|hours?|m|min))
     |
     (\d+):(\d+)
     |
-    ((\d+)(h|hours?))?((\d+)(m|min)?)?
+    (\d+([\.,]\d+)?)h?
     )
     /x
   
@@ -161,11 +157,6 @@
     @next ||= Changeset.find(:first, :conditions => ['id > ? AND repository_id = ?', self.id, self.repository_id], :order => 'id ASC')
   end
   
-  # Strips and reencodes a commit log before insertion into the database
-  def self.normalize_comments(str)
-    to_utf8(str.to_s.strip)
-  end
-
   # Creates a new Change from it's common parameters
   def create_change(change)
     Change.create(:changeset => self,
@@ -174,7 +165,7 @@
                   :from_path => change[:from_path],
                   :from_revision => change[:from_revision])
   end
-  
+
   private
 
   # Finds an issue that can be referenced by the commit message
@@ -244,15 +235,17 @@
     return @short_comments, @long_comments
   end
 
-  def self.to_utf8(str)
-    if str.respond_to?(:force_encoding)
-      str.force_encoding('UTF-8')
-      return str if str.valid_encoding?
-    else
-      return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
-    end
+  public
 
-    encoding = Setting.commit_logs_encoding.to_s.strip
+  # Strips and reencodes a commit log before insertion into the database
+  def self.normalize_comments(str, encoding)
+    Changeset.to_utf8(str.to_s.strip, encoding)
+  end
+
+  private
+
+  def self.to_utf8(str, encoding)
+    return str if str.blank?
     unless encoding.blank? || encoding == 'UTF-8'
       begin
         str = Iconv.conv('UTF-8', encoding, str)
@@ -260,12 +253,20 @@
         # do nothing here
       end
     end
-    # removes invalid UTF8 sequences
-    begin
-      Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + '  ')[0..-3]
-    rescue Iconv::InvalidEncoding
-      # "UTF-8//IGNORE" is not supported on some OS
-      str
+    if str.respond_to?(:force_encoding)
+      str.force_encoding('UTF-8')
+      if ! str.valid_encoding?
+        str = str.encode("US-ASCII", :invalid => :replace,
+              :undef => :replace, :replace => '?').encode("UTF-8")
+      end
+    else
+      # removes invalid UTF8 sequences
+      begin
+        str = Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + '  ')[0..-3]
+      rescue Iconv::InvalidEncoding
+        # "UTF-8//IGNORE" is not supported on some OS
+      end
     end
+    str
   end
 end
--- a/app/models/issue.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/issue.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -422,7 +422,12 @@
   
   # Returns an array of status that user is able to apply
   def new_statuses_allowed_to(user, include_default=false)
-    statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
+    statuses = status.find_new_statuses_allowed_to(
+      user.roles_for_project(project),
+      tracker,
+      author == user,
+      assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
+      )
     statuses << status unless statuses.empty?
     statuses << IssueStatus.default if include_default
     statuses = statuses.uniq.sort
@@ -824,7 +829,7 @@
   def create_journal
     if @current_journal
       # attributes changes
-      (Issue.column_names - %w(id description root_id lft rgt lock_version created_on updated_on)).each {|c|
+      (Issue.column_names - %w(id root_id lft rgt lock_version created_on updated_on)).each {|c|
         @current_journal.details << JournalDetail.new(:property => 'attr',
                                                       :prop_key => c,
                                                       :old_value => @issue_before_change.send(c),
--- a/app/models/issue_status.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/issue_status.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -50,10 +50,16 @@
 
   # Returns an array of all statuses the given role can switch to
   # Uses association cache when called more than one time
-  def new_statuses_allowed_to(roles, tracker)
+  def new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
     if roles && tracker
       role_ids = roles.collect(&:id)
-      new_statuses = workflows.select {|w| role_ids.include?(w.role_id) && w.tracker_id == tracker.id}.collect{|w| w.new_status}.compact.sort
+      transitions = workflows.select do |w|
+        role_ids.include?(w.role_id) &&
+        w.tracker_id == tracker.id && 
+        (author || !w.author) &&
+        (assignee || !w.assignee)
+      end
+      transitions.collect{|w| w.new_status}.compact.sort
     else
       []
     end
@@ -61,24 +67,19 @@
   
   # Same thing as above but uses a database query
   # More efficient than the previous method if called just once
-  def find_new_statuses_allowed_to(roles, tracker)
+  def find_new_statuses_allowed_to(roles, tracker, author=false, assignee=false)
     if roles && tracker
+      conditions = {:role_id => roles.collect(&:id), :tracker_id => tracker.id}
+      conditions[:author] = false unless author
+      conditions[:assignee] = false unless assignee
+      
       workflows.find(:all,
                      :include => :new_status,
-                     :conditions => { :role_id => roles.collect(&:id), 
-                                      :tracker_id => tracker.id}).collect{ |w| w.new_status }.compact.sort
+                     :conditions => conditions).collect{|w| w.new_status}.compact.sort
     else
       []
     end
   end
-  
-  def new_status_allowed_to?(status, roles, tracker)
-    if status && roles && tracker
-      !workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => roles.collect(&:id), :tracker_id => tracker.id}).nil?
-    else
-      false
-    end
-  end
 
   def <=>(status)
     position <=> status.position
--- a/app/models/journal_detail.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/journal_detail.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -17,9 +17,4 @@
 
 class JournalDetail < ActiveRecord::Base
   belongs_to :journal
-  
-  def before_save
-    self.value = value[0..254] if value && value.is_a?(String)
-    self.old_value = old_value[0..254] if old_value && old_value.is_a?(String)
-  end
 end
--- a/app/models/mail_handler.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/mail_handler.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -100,7 +100,7 @@
     elsif m = email.subject.match(MESSAGE_REPLY_SUBJECT_RE)
       receive_message_reply(m[1].to_i)
     else
-      receive_issue
+      dispatch_to_default
     end
   rescue ActiveRecord::RecordInvalid => e
     # TODO: send a email to the user
@@ -113,6 +113,10 @@
     logger.error "MailHandler: unauthorized attempt from #{user}" if logger
     false
   end
+
+  def dispatch_to_default
+    receive_issue
+  end
   
   # Creates a new issue
   def receive_issue
--- a/app/models/query.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/query.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -566,9 +566,19 @@
     sql = ''
     case operator
     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 "!"
-      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 "!*"
       sql = "#{db_table}.#{db_field} IS NULL"
       sql << " OR #{db_table}.#{db_field} = ''" if is_custom_filter
--- a/app/models/repository.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -16,6 +16,8 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class Repository < ActiveRecord::Base
+  include Redmine::Ciphering
+  
   belongs_to :project
   has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
   has_many :changes, :through => :changesets
@@ -24,29 +26,43 @@
   # has_many :changesets, :dependent => :destroy is too slow for big repositories
   before_destroy :clear_changesets
   
+  validates_length_of :password, :maximum => 255, :allow_nil => true
   # Checks if the SCM is enabled when creating a repository
   validate_on_create { |r| r.errors.add(:type, :invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
-  
+
   # Removes leading and trailing whitespace
   def url=(arg)
     write_attribute(:url, arg ? arg.to_s.strip : nil)
   end
-  
+
   # Removes leading and trailing whitespace
   def root_url=(arg)
     write_attribute(:root_url, arg ? arg.to_s.strip : nil)
   end
+  
+  def password
+    read_ciphered_attribute(:password)
+  end
+  
+  def password=(arg)
+    write_ciphered_attribute(:password, arg)
+  end
+
+  def scm_adapter
+    self.class.scm_adapter_class
+  end
 
   def scm
-    @scm ||= self.scm_adapter.new url, root_url, login, password
+    @scm ||= self.scm_adapter.new(url, root_url,
+                                  login, password, path_encoding)
     update_attribute(:root_url, @scm.root_url) if root_url.blank?
     @scm
   end
-  
+
   def scm_name
     self.class.scm_name
   end
-  
+
   def supports_cat?
     scm.supports_cat?
   end
@@ -173,18 +189,27 @@
       user
     end
   end
-  
+
+  def repo_log_encoding
+    encoding = log_encoding.to_s.strip
+    encoding.blank? ? 'UTF-8' : encoding
+  end
+
   # Fetches new changesets for all repositories of active projects
   # Can be called periodically by an external script
   # eg. ruby script/runner "Repository.fetch_changesets"
   def self.fetch_changesets
     Project.active.has_module(:repository).find(:all, :include => :repository).each do |project|
       if project.repository
-        project.repository.fetch_changesets
+        begin
+          project.repository.fetch_changesets
+        rescue Redmine::Scm::Adapters::CommandFailed => e
+          logger.error "scm: error during fetching changesets: #{e.message}"
+        end
       end
     end
   end
-  
+
   # scan changeset comments to find related and fixed issues for all repositories
   def self.scan_changesets_for_issue_ids
     find(:all).each(&:scan_changesets_for_issue_ids)
@@ -197,16 +222,50 @@
   def self.available_scm
     subclasses.collect {|klass| [klass.scm_name, klass.name]}
   end
-  
+
   def self.factory(klass_name, *args)
     klass = "Repository::#{klass_name}".constantize
     klass.new(*args)
   rescue
     nil
   end
-  
+
+  def self.scm_adapter_class
+    nil
+  end
+
+  def self.scm_command
+    ret = ""
+    begin
+      ret = self.scm_adapter_class.client_command if self.scm_adapter_class
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get command: #{e.message}"
+    end
+    ret
+  end
+
+  def self.scm_version_string
+    ret = ""
+    begin
+      ret = self.scm_adapter_class.client_version_string if self.scm_adapter_class
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get version string: #{e.message}"
+    end
+    ret
+  end
+
+  def self.scm_available
+    ret = false
+    begin
+      ret = self.scm_adapter_class.client_available if self.scm_adapter_class 
+    rescue Redmine::Scm::Adapters::CommandFailed => e
+      logger.error "scm: error during get scm available: #{e.message}"
+    end
+    ret
+  end
+
   private
-  
+
   def before_save
     # Strips url and root_url
     url.strip!
--- a/app/models/repository/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,47 +1,47 @@
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4802/trunk/app/models/repository
+/svn/!svn/ver/4982/trunk/app/models/repository
 END
 subversion.rb
 K 25
 svn:wc:ra_dav:version-url
 V 60
-/svn/!svn/ver/3360/trunk/app/models/repository/subversion.rb
+/svn/!svn/ver/4962/trunk/app/models/repository/subversion.rb
 END
 bazaar.rb
 K 25
 svn:wc:ra_dav:version-url
 V 56
-/svn/!svn/ver/1537/trunk/app/models/repository/bazaar.rb
+/svn/!svn/ver/4982/trunk/app/models/repository/bazaar.rb
 END
 git.rb
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4613/trunk/app/models/repository/git.rb
+/svn/!svn/ver/4975/trunk/app/models/repository/git.rb
 END
 mercurial.rb
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4704/trunk/app/models/repository/mercurial.rb
+/svn/!svn/ver/4975/trunk/app/models/repository/mercurial.rb
 END
 filesystem.rb
 K 25
 svn:wc:ra_dav:version-url
 V 60
-/svn/!svn/ver/1508/trunk/app/models/repository/filesystem.rb
+/svn/!svn/ver/4975/trunk/app/models/repository/filesystem.rb
 END
 cvs.rb
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4802/trunk/app/models/repository/cvs.rb
+/svn/!svn/ver/4982/trunk/app/models/repository/cvs.rb
 END
 darcs.rb
 K 25
 svn:wc:ra_dav:version-url
 V 55
-/svn/!svn/ver/3360/trunk/app/models/repository/darcs.rb
+/svn/!svn/ver/4982/trunk/app/models/repository/darcs.rb
 END
--- a/app/models/repository/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/models/repository
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 
 
@@ -32,11 +32,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-b02ecaea01c5990cbde09689be12ec7d
-2010-02-02T17:02:32.020293Z
-3360
-edavis10
+2011-03-03T11:40:18.000000Z
+b9f366b3f38bd42149e09e6ed0ed8755
+2011-02-28T12:09:32.515358Z
+4962
+tmaruyama
 has-props
 
 
@@ -58,7 +58,7 @@
 
 
 
-3306
+3358
 
 bazaar.rb
 file
@@ -66,11 +66,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-84591e1c5afa1b74a10954dd521ceb4e
-2008-06-14T15:44:36.838876Z
-1537
-jplang
+2011-03-03T11:40:18.000000Z
+d6a230859a110341c0d64865248db51c
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
 has-props
 
 
@@ -92,7 +92,7 @@
 
 
 
-3617
+3877
 
 git.rb
 file
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-a3363c594162378e93390bb64f908183
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:18.000000Z
+dfce133f28c5c85af0740865903d5320
+2011-03-01T05:14:03.146872Z
+4975
 tmaruyama
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-3147
+4245
 
 mercurial.rb
 file
@@ -134,10 +134,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-4b0702e606f495c7db57461f3527181e
-2011-01-13T12:04:51.838288Z
-4704
+2011-03-03T11:40:18.000000Z
+d659744391dfa02d54481d4dd8752930
+2011-03-01T05:14:03.146872Z
+4975
 tmaruyama
 has-props
 
@@ -160,7 +160,7 @@
 
 
 
-5003
+4022
 
 filesystem.rb
 file
@@ -168,11 +168,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-ed75a7df6cfdc54b7059c9bb20c079d3
-2008-06-08T15:40:24.603157Z
-1508
-jplang
+2011-03-03T11:40:18.000000Z
+994276556c2feac05d149117eea01413
+2011-03-01T05:14:03.146872Z
+4975
+tmaruyama
 has-props
 
 
@@ -194,7 +194,7 @@
 
 
 
-1258
+1451
 
 cvs.rb
 file
@@ -202,10 +202,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-a5117cd6200edb62482568b4aa888153
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T11:40:18.000000Z
+5eecf7abe1216489c4d1c2f6a107c36b
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -228,7 +228,7 @@
 
 
 
-6626
+6952
 
 darcs.rb
 file
@@ -236,11 +236,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-75c2836fd6ba92e0aef7a9cfc249ebb7
-2010-02-02T17:02:32.020293Z
-3360
-edavis10
+2011-03-03T11:40:18.000000Z
+03bf9128aa09528266cabb76ff0808a9
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
 has-props
 
 
@@ -262,5 +262,5 @@
 
 
 
-3566
+3826
 
--- a/app/models/repository/.svn/text-base/bazaar.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/bazaar.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,24 @@
 
 class Repository::Bazaar < Repository
   attr_protected :root_url
-  validates_presence_of :url
+  validates_presence_of :url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::BazaarAdapter
   end
-  
+
   def self.scm_name
     'Bazaar'
   end
-  
+
   def entries(path=nil, identifier=nil)
     entries = scm.entries(path, identifier)
     if entries
--- a/app/models/repository/.svn/text-base/cvs.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/cvs.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,25 @@
 require 'digest/sha1'
 
 class Repository::Cvs < Repository
-  validates_presence_of :url, :root_url
+  validates_presence_of :url, :root_url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "CVSROOT",
+      "root_url"     => "Module",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::CvsAdapter
   end
-  
+
   def self.scm_name
     'CVS'
   end
-  
+
   def entry(path=nil, identifier=nil)
     rev = identifier.nil? ? nil : changesets.find_by_revision(identifier)
     scm.entry(path, rev.nil? ? nil : rev.committed_on)
@@ -107,10 +116,11 @@
         tmp_time = revision.time.clone
         unless changes.find_by_path_and_revision(
 	           scm.with_leading_slash(revision.paths[0][:path]), revision.paths[0][:revision])
+          cmt = Changeset.normalize_comments(revision.message, repo_log_encoding)
           cs = changesets.find(:first, :conditions=>{
             :committed_on=>tmp_time - time_delta .. tmp_time + time_delta,
             :committer=>revision.author,
-            :comments=>Changeset.normalize_comments(revision.message)
+            :comments=>cmt
           })
         
           # create a new changeset.... 
--- a/app/models/repository/.svn/text-base/darcs.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/darcs.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -18,16 +18,24 @@
 require 'redmine/scm/adapters/darcs_adapter'
 
 class Repository::Darcs < Repository
-  validates_presence_of :url
+  validates_presence_of :url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::DarcsAdapter
   end
-  
+
   def self.scm_name
     'Darcs'
   end
-  
+
   def entry(path=nil, identifier=nil)
     patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
     scm.entry(path, patch.nil? ? nil : patch.scmid)
--- a/app/models/repository/.svn/text-base/filesystem.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/filesystem.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -24,14 +24,21 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::FilesystemAdapter
   end
-  
+
   def self.scm_name
     'Filesystem'
   end
-  
+
   def entries(path=nil, identifier=nil)
     scm.entries(path, identifier)
   end
--- a/app/models/repository/.svn/text-base/git.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/git.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -21,14 +21,25 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Path to repository",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::GitAdapter
   end
-  
+
   def self.scm_name
     'Git'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   # Returns the identifier for the given git changeset
   def self.changeset_identifier(changeset)
     changeset.scmid
@@ -47,6 +58,13 @@
     scm.tags
   end
 
+  def find_changeset_by_name(name)
+    return nil if name.nil? || name.empty?
+    e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
+    return e if e
+    changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
+  end
+
   # With SCM's that have a sequential commit numbering, redmine is able to be
   # clever and only fetch changesets going forward from the most recent one
   # it knows about.  However, with git, you never know if people have merged
@@ -72,7 +90,28 @@
     revisions.reject!{|r| recent_revisions.include?(r.scmid)}
 
     # Save the remaining ones to the database
-    revisions.each{|r| r.save(self)} unless revisions.nil?
+    unless revisions.nil?
+      revisions.each do |rev|
+        transaction do
+          changeset = Changeset.new(
+              :repository => self,
+              :revision   => rev.identifier,
+              :scmid      => rev.scmid,
+              :committer  => rev.author, 
+              :committed_on => rev.time,
+              :comments   => rev.message)
+            
+          if changeset.save
+            rev.paths.each do |file|
+              Change.create(
+                  :changeset => changeset,
+                  :action    => file[:action],
+                  :path      => file[:path])
+            end
+          end
+        end
+      end
+    end
   end
 
   def latest_changesets(path,rev,limit=10)
--- a/app/models/repository/.svn/text-base/mercurial.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/mercurial.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -24,7 +24,16 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  FETCH_AT_ONCE = 100  # number of changesets to fetch at once
+
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::MercurialAdapter
   end
 
@@ -32,6 +41,10 @@
     'Mercurial'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   # Returns the readable identifier for the given mercurial changeset
   def self.format_changeset_identifier(changeset)
     "#{changeset.revision}:#{changeset.scmid}"
@@ -42,33 +55,18 @@
     changeset.scmid
   end
 
+  def branches
+    nil
+  end
+
+  def tags
+    nil
+  end
+
   def diff_format_revisions(cs, cs_to, sep=':')
     super(cs, cs_to, ' ')
   end
 
-  def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
-    if entries
-      entries.each do |entry|
-        next unless entry.is_file?
-        # Set the filesize unless browsing a specific revision
-        if identifier.nil?
-          full_path = File.join(root_url, entry.path)
-          entry.size = File.stat(full_path).size if File.file?(full_path)
-        end
-        # Search the DB for the entry's last change
-        change = changes.find(:first, :conditions => ["path = ?", scm.with_leading_slash(entry.path)], :order => "#{Changeset.table_name}.committed_on DESC")
-        if change
-          entry.lastrev.identifier = change.changeset.revision
-          entry.lastrev.name = change.changeset.revision
-          entry.lastrev.author = change.changeset.committer
-          entry.lastrev.revision = change.revision
-        end
-      end
-    end
-    entries
-  end
-
   # Finds and returns a revision with a number or the beginning of a hash
   def find_changeset_by_name(name)
     return nil if name.nil? || name.empty?
@@ -82,50 +80,39 @@
   end
 
   # Returns the latest changesets for +path+; sorted by revision number
+  # Default behavior is to search in cached changesets
   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)
+      changesets.find(:all, :select => "DISTINCT #{Changeset.table_name}.*",
+                      :joins => :changes,
+                      :conditions => ["#{Change.table_name}.path = ? OR #{Change.table_name}.path LIKE ? ESCAPE ?",
+                                      path.with_leading_slash,
+                                      "#{path.with_leading_slash.gsub(/[%_\\]/) { |s| "\\#{s}" }}/%", '\\'],
+                      :include => :user, :limit => limit)
     end
   end
 
   def fetch_changesets
-    scm_info = scm.info
-    if scm_info
-      # latest revision found in database
-      db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
-      # latest revision in the repository
-      latest_revision = scm_info.lastrev
-      return if latest_revision.nil?
-      scm_revision = latest_revision.identifier.to_i
-      if db_revision < scm_revision
-        logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug?
-        identifier_from = db_revision + 1
-        while (identifier_from <= scm_revision)
-          # loads changesets by batches of 100
-          identifier_to = [identifier_from + 99, scm_revision].min
-          revisions = scm.revisions('', identifier_from, identifier_to, :with_paths => true)
-          transaction do
-            revisions.each do |revision|
-              changeset = Changeset.create(:repository => self,
-                                           :revision => revision.identifier,
-                                           :scmid => revision.scmid,
-                                           :committer => revision.author, 
-                                           :committed_on => revision.time,
-                                           :comments => revision.message)
-              
-              revision.paths.each do |change|
-                changeset.create_change(change)
-              end
-            end
-          end unless revisions.nil?
-          identifier_from = identifier_to + 1
+    scm_rev = scm.info.lastrev.revision.to_i
+    db_rev = latest_changeset ? latest_changeset.revision.to_i : -1
+    return unless db_rev < scm_rev  # already up-to-date
+
+    logger.debug "Fetching changesets for repository #{url}" if logger
+    (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
+      transaction do
+        scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
+          cs = Changeset.create(:repository => self,
+                                :revision => re.revision,
+                                :scmid => re.scmid,
+                                :committer => re.author,
+                                :committed_on => re.time,
+                                :comments => re.message)
+          re.paths.each { |e| cs.create_change(e) }
         end
       end
     end
+    self
   end
 end
--- a/app/models/repository/.svn/text-base/subversion.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/.svn/text-base/subversion.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -22,14 +22,18 @@
   validates_presence_of :url
   validates_format_of :url, :with => /^(http|https|svn(\+[^\s:\/\\]+)?|file):\/\/.+/i
 
-  def scm_adapter
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::SubversionAdapter
   end
-  
+
   def self.scm_name
     'Subversion'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   def latest_changesets(path, rev, limit=10)
     revisions = scm.revisions(path, rev, nil, :limit => limit)
     revisions ? changesets.find_all_by_revision(revisions.collect(&:identifier), :order => "committed_on DESC", :include => :user) : []
--- a/app/models/repository/bazaar.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/bazaar.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,24 @@
 
 class Repository::Bazaar < Repository
   attr_protected :root_url
-  validates_presence_of :url
+  validates_presence_of :url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::BazaarAdapter
   end
-  
+
   def self.scm_name
     'Bazaar'
   end
-  
+
   def entries(path=nil, identifier=nil)
     entries = scm.entries(path, identifier)
     if entries
--- a/app/models/repository/cvs.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/cvs.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,25 @@
 require 'digest/sha1'
 
 class Repository::Cvs < Repository
-  validates_presence_of :url, :root_url
+  validates_presence_of :url, :root_url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "CVSROOT",
+      "root_url"     => "Module",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::CvsAdapter
   end
-  
+
   def self.scm_name
     'CVS'
   end
-  
+
   def entry(path=nil, identifier=nil)
     rev = identifier.nil? ? nil : changesets.find_by_revision(identifier)
     scm.entry(path, rev.nil? ? nil : rev.committed_on)
@@ -107,10 +116,11 @@
         tmp_time = revision.time.clone
         unless changes.find_by_path_and_revision(
 	           scm.with_leading_slash(revision.paths[0][:path]), revision.paths[0][:revision])
+          cmt = Changeset.normalize_comments(revision.message, repo_log_encoding)
           cs = changesets.find(:first, :conditions=>{
             :committed_on=>tmp_time - time_delta .. tmp_time + time_delta,
             :committer=>revision.author,
-            :comments=>Changeset.normalize_comments(revision.message)
+            :comments=>cmt
           })
         
           # create a new changeset.... 
--- a/app/models/repository/darcs.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/darcs.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -18,16 +18,24 @@
 require 'redmine/scm/adapters/darcs_adapter'
 
 class Repository::Darcs < Repository
-  validates_presence_of :url
+  validates_presence_of :url, :log_encoding
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+      "log_encoding" => "Commit messages encoding",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::DarcsAdapter
   end
-  
+
   def self.scm_name
     'Darcs'
   end
-  
+
   def entry(path=nil, identifier=nil)
     patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
     scm.entry(path, patch.nil? ? nil : patch.scmid)
--- a/app/models/repository/filesystem.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/filesystem.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -24,14 +24,21 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::FilesystemAdapter
   end
-  
+
   def self.scm_name
     'Filesystem'
   end
-  
+
   def entries(path=nil, identifier=nil)
     scm.entries(path, identifier)
   end
--- a/app/models/repository/git.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/git.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -21,14 +21,25 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Path to repository",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::GitAdapter
   end
-  
+
   def self.scm_name
     'Git'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   # Returns the identifier for the given git changeset
   def self.changeset_identifier(changeset)
     changeset.scmid
@@ -47,6 +58,13 @@
     scm.tags
   end
 
+  def find_changeset_by_name(name)
+    return nil if name.nil? || name.empty?
+    e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
+    return e if e
+    changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
+  end
+
   # With SCM's that have a sequential commit numbering, redmine is able to be
   # clever and only fetch changesets going forward from the most recent one
   # it knows about.  However, with git, you never know if people have merged
@@ -72,7 +90,28 @@
     revisions.reject!{|r| recent_revisions.include?(r.scmid)}
 
     # Save the remaining ones to the database
-    revisions.each{|r| r.save(self)} unless revisions.nil?
+    unless revisions.nil?
+      revisions.each do |rev|
+        transaction do
+          changeset = Changeset.new(
+              :repository => self,
+              :revision   => rev.identifier,
+              :scmid      => rev.scmid,
+              :committer  => rev.author, 
+              :committed_on => rev.time,
+              :comments   => rev.message)
+            
+          if changeset.save
+            rev.paths.each do |file|
+              Change.create(
+                  :changeset => changeset,
+                  :action    => file[:action],
+                  :path      => file[:path])
+            end
+          end
+        end
+      end
+    end
   end
 
   def latest_changesets(path,rev,limit=10)
--- a/app/models/repository/mercurial.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/mercurial.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -24,7 +24,16 @@
   attr_protected :root_url
   validates_presence_of :url
 
-  def scm_adapter
+  FETCH_AT_ONCE = 100  # number of changesets to fetch at once
+
+  ATTRIBUTE_KEY_NAMES = {
+      "url"          => "Root directory",
+    }
+  def self.human_attribute_name(attribute_key_name)
+    ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
+  end
+
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::MercurialAdapter
   end
 
@@ -32,6 +41,10 @@
     'Mercurial'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   # Returns the readable identifier for the given mercurial changeset
   def self.format_changeset_identifier(changeset)
     "#{changeset.revision}:#{changeset.scmid}"
@@ -42,33 +55,18 @@
     changeset.scmid
   end
 
+  def branches
+    nil
+  end
+
+  def tags
+    nil
+  end
+
   def diff_format_revisions(cs, cs_to, sep=':')
     super(cs, cs_to, ' ')
   end
 
-  def entries(path=nil, identifier=nil)
-    entries=scm.entries(path, identifier)
-    if entries
-      entries.each do |entry|
-        next unless entry.is_file?
-        # Set the filesize unless browsing a specific revision
-        if identifier.nil?
-          full_path = File.join(root_url, entry.path)
-          entry.size = File.stat(full_path).size if File.file?(full_path)
-        end
-        # Search the DB for the entry's last change
-        change = changes.find(:first, :conditions => ["path = ?", scm.with_leading_slash(entry.path)], :order => "#{Changeset.table_name}.committed_on DESC")
-        if change
-          entry.lastrev.identifier = change.changeset.revision
-          entry.lastrev.name = change.changeset.revision
-          entry.lastrev.author = change.changeset.committer
-          entry.lastrev.revision = change.revision
-        end
-      end
-    end
-    entries
-  end
-
   # Finds and returns a revision with a number or the beginning of a hash
   def find_changeset_by_name(name)
     return nil if name.nil? || name.empty?
@@ -82,50 +80,39 @@
   end
 
   # Returns the latest changesets for +path+; sorted by revision number
+  # Default behavior is to search in cached changesets
   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)
+      changesets.find(:all, :select => "DISTINCT #{Changeset.table_name}.*",
+                      :joins => :changes,
+                      :conditions => ["#{Change.table_name}.path = ? OR #{Change.table_name}.path LIKE ? ESCAPE ?",
+                                      path.with_leading_slash,
+                                      "#{path.with_leading_slash.gsub(/[%_\\]/) { |s| "\\#{s}" }}/%", '\\'],
+                      :include => :user, :limit => limit)
     end
   end
 
   def fetch_changesets
-    scm_info = scm.info
-    if scm_info
-      # latest revision found in database
-      db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
-      # latest revision in the repository
-      latest_revision = scm_info.lastrev
-      return if latest_revision.nil?
-      scm_revision = latest_revision.identifier.to_i
-      if db_revision < scm_revision
-        logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug?
-        identifier_from = db_revision + 1
-        while (identifier_from <= scm_revision)
-          # loads changesets by batches of 100
-          identifier_to = [identifier_from + 99, scm_revision].min
-          revisions = scm.revisions('', identifier_from, identifier_to, :with_paths => true)
-          transaction do
-            revisions.each do |revision|
-              changeset = Changeset.create(:repository => self,
-                                           :revision => revision.identifier,
-                                           :scmid => revision.scmid,
-                                           :committer => revision.author, 
-                                           :committed_on => revision.time,
-                                           :comments => revision.message)
-              
-              revision.paths.each do |change|
-                changeset.create_change(change)
-              end
-            end
-          end unless revisions.nil?
-          identifier_from = identifier_to + 1
+    scm_rev = scm.info.lastrev.revision.to_i
+    db_rev = latest_changeset ? latest_changeset.revision.to_i : -1
+    return unless db_rev < scm_rev  # already up-to-date
+
+    logger.debug "Fetching changesets for repository #{url}" if logger
+    (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
+      transaction do
+        scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
+          cs = Changeset.create(:repository => self,
+                                :revision => re.revision,
+                                :scmid => re.scmid,
+                                :committer => re.author,
+                                :committed_on => re.time,
+                                :comments => re.message)
+          re.paths.each { |e| cs.create_change(e) }
         end
       end
     end
+    self
   end
 end
--- a/app/models/repository/subversion.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/repository/subversion.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -22,14 +22,18 @@
   validates_presence_of :url
   validates_format_of :url, :with => /^(http|https|svn(\+[^\s:\/\\]+)?|file):\/\/.+/i
 
-  def scm_adapter
+  def self.scm_adapter_class
     Redmine::Scm::Adapters::SubversionAdapter
   end
-  
+
   def self.scm_name
     'Subversion'
   end
 
+  def repo_log_encoding
+    'UTF-8'
+  end
+
   def latest_changesets(path, rev, limit=10)
     revisions = scm.revisions(path, rev, nil, :limit => limit)
     revisions ? changesets.find_all_by_revision(revisions.collect(&:identifier), :order => "committed_on DESC", :include => :user) : []
--- a/app/models/setting.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/setting.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -65,6 +65,7 @@
                   UTF-16LE
                   EUC-JP
                   Shift_JIS
+                  CP932
                   GB18030
                   GBK
                   ISCII91
--- a/app/models/user.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/user.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -83,7 +83,9 @@
   
   def before_save
     # update hashed_password if password was set
-    self.hashed_password = User.hash_password(self.password) if self.password && self.auth_source_id.blank?
+    if self.password && self.auth_source_id.blank?
+      salt_password(password)
+    end
   end
   
   def reload(*args)
@@ -121,7 +123,7 @@
         return nil unless user.auth_source.authenticate(login, password)
       else
         # authentication with local password
-        return nil unless User.hash_password(password) == user.hashed_password        
+        return nil unless user.check_password?(password)
       end
     else
       # user is not yet registered, try to authenticate with available sources
@@ -200,13 +202,21 @@
     update_attribute(:status, STATUS_LOCKED)
   end
 
+  # Returns true if +clear_password+ is the correct user's password, otherwise false
   def check_password?(clear_password)
     if auth_source_id.present?
       auth_source.authenticate(self.login, clear_password)
     else
-      User.hash_password(clear_password) == self.hashed_password
+      User.hash_password("#{salt}#{User.hash_password clear_password}") == hashed_password
     end
   end
+  
+  # Generates a random salt and computes hashed_password for +clear_password+
+  # The hashed password is stored in the following form: SHA1(salt + SHA1(password))
+  def salt_password(clear_password)
+    self.salt = User.generate_salt
+    self.hashed_password = User.hash_password("#{salt}#{User.hash_password clear_password}")
+  end
 
   # Does the backend storage allow this user to change their password?
   def change_password_allowed?
@@ -473,6 +483,20 @@
     end
     anonymous_user
   end
+
+  # Salts all existing unsalted passwords
+  # It changes password storage scheme from SHA1(password) to SHA1(salt + SHA1(password))
+  # This method is used in the SaltPasswords migration and is to be kept as is
+  def self.salt_unsalted_passwords!
+    transaction do
+      User.find_each(:conditions => "salt IS NULL OR salt = ''") do |user|
+        next if user.hashed_password.blank?
+        salt = User.generate_salt
+        hashed_password = User.hash_password("#{salt}#{user.hashed_password}")
+        User.update_all("salt = '#{salt}', hashed_password = '#{hashed_password}'", ["id = ?", user.id] )
+      end
+    end
+  end
   
   protected
   
@@ -514,6 +538,12 @@
   def self.hash_password(clear_password)
     Digest::SHA1.hexdigest(clear_password || "")
   end
+  
+  # Returns a 128bits random salt as a hex string (32 chars long)
+  def self.generate_salt
+    ActiveSupport::SecureRandom.hex(16)
+  end
+  
 end
 
 class AnonymousUser < User
--- a/app/models/user_preference.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/user_preference.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -51,4 +51,7 @@
   
   def comments_sorting; self[:comments_sorting] end
   def comments_sorting=(order); self[:comments_sorting]=order end
+  
+  def warn_on_leaving_unsaved; self[:warn_on_leaving_unsaved] || '1'; end
+  def warn_on_leaving_unsaved=(value); self[:warn_on_leaving_unsaved]=value; end
 end
--- a/app/models/wiki_page.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/models/wiki_page.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 # Redmine - project management software
-# Copyright (C) 2006-2009  Jean-Philippe Lang
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -149,17 +149,13 @@
   end
 end
 
-class WikiDiff
-  attr_reader :diff, :words, :content_to, :content_from
+class WikiDiff < Redmine::Helpers::Diff
+  attr_reader :content_to, :content_from
   
   def initialize(content_to, content_from)
     @content_to = content_to
     @content_from = content_from
-    @words = content_to.text.split(/(\s+)/)
-    @words = @words.select {|word| word != ' '}
-    words_from = content_from.text.split(/(\s+)/)
-    words_from = words_from.select {|word| word != ' '}    
-    @diff = words_from.diff @words
+    super(content_to.text, content_from.text)
   end
 end
 
--- a/app/sweepers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/sweepers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/sweepers
 http://redmine.rubyforge.org/svn
 
--- a/app/views/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 34
-/svn/!svn/ver/4782/trunk/app/views
+/svn/!svn/ver/4983/trunk/app/views
 END
--- a/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-30T09:09:50.276451Z
-4782
-jplang
+2011-03-01T10:27:51.597350Z
+4983
+tmaruyama
 
 
 
@@ -68,22 +68,22 @@
 timelog
 dir
 
-issue_moves
+users
 dir
 
-users
+issue_moves
 dir
 
 files
 dir
 
-auth_sources
+previews
 dir
 
 ldap_auth_sources
 dir
 
-previews
+auth_sources
 dir
 
 search
@@ -92,10 +92,10 @@
 messages
 dir
 
-versions
+issue_relations
 dir
 
-issue_relations
+versions
 dir
 
 mailer
--- a/app/views/account/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/account/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/account
 http://redmine.rubyforge.org/svn
 
--- a/app/views/activities/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/activities/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/activities
 http://redmine.rubyforge.org/svn
 
--- a/app/views/admin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/admin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/admin
 http://redmine.rubyforge.org/svn
 
--- a/app/views/attachments/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/attachments/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/attachments
 http://redmine.rubyforge.org/svn
 
--- a/app/views/auth_sources/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/auth_sources/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/auth_sources
 http://redmine.rubyforge.org/svn
 
--- a/app/views/auto_completes/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/auto_completes/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/auto_completes
 http://redmine.rubyforge.org/svn
 
--- a/app/views/boards/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/boards/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 41
-/svn/!svn/ver/4047/trunk/app/views/boards
+/svn/!svn/ver/4889/trunk/app/views/boards
 END
 show.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 52
-/svn/!svn/ver/3426/trunk/app/views/boards/show.rhtml
+/svn/!svn/ver/4889/trunk/app/views/boards/show.rhtml
 END
 _form.rhtml
 K 25
--- a/app/views/boards/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/boards/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/boards
 http://redmine.rubyforge.org/svn
 
 
 
-2010-08-27T14:05:54.014502Z
-4047
-edavis10
+2011-02-20T13:11:10.508449Z
+4889
+jplang
 
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-74a37f0fbb3bb635f2c0389a2624988e
-2010-02-14T11:52:12.027647Z
-3426
+2011-03-03T11:40:18.000000Z
+0f9b1735f403a56ed575c63dc474a611
+2011-02-20T13:11:10.508449Z
+4889
 jplang
 has-props
 
@@ -58,7 +58,7 @@
 
 
 
-3365
+3402
 
 _form.rhtml
 file
--- a/app/views/boards/.svn/text-base/show.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/boards/.svn/text-base/show.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -69,4 +69,5 @@
 
 <% content_for :header_tags do %>
     <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %>
+    <%= stylesheet_link_tag 'scm' %>
 <% end %>
--- a/app/views/boards/show.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/boards/show.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -69,4 +69,5 @@
 
 <% content_for :header_tags do %>
     <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@project}: #{@board}") %>
+    <%= stylesheet_link_tag 'scm' %>
 <% end %>
--- a/app/views/calendars/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/calendars/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,11 +1,11 @@
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4238/trunk/app/views/calendars
+/svn/!svn/ver/4911/trunk/app/views/calendars
 END
 show.html.erb
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/4238/trunk/app/views/calendars/show.html.erb
+/svn/!svn/ver/4911/trunk/app/views/calendars/show.html.erb
 END
--- a/app/views/calendars/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/calendars/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/calendars
 http://redmine.rubyforge.org/svn
 
 
 
-2010-10-07T15:26:53.500793Z
-4238
-winterheart
+2011-02-21T14:02:22.565987Z
+4911
+jplang
 
 
 
@@ -32,11 +32,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-d47ece5d0e0ff017f3f1b5ce4b776ba0
-2010-10-07T15:26:53.500793Z
-4238
-winterheart
+2011-03-03T11:40:18.000000Z
+7da8933c1cb08241ebe459d9cabe8043
+2011-02-21T14:02:22.565987Z
+4911
+jplang
 has-props
 
 
@@ -58,5 +58,5 @@
 
 
 
-1946
+2007
 
--- a/app/views/calendars/.svn/text-base/show.html.erb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/calendars/.svn/text-base/show.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,10 +1,10 @@
-<h2><%= l(:label_calendar) %></h2>
+<h2><%= @query.new_record? ? l(:label_calendar) : h(@query.name) %></h2>
 
 <% form_tag(calendar_path, :method => :put, :id => 'query_form') do %>
   <%= hidden_field_tag('project_id', @project.to_param) if @project%>
-<fieldset id="filters" class="collapsible">
+<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
   <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
-  <div>
+  <div style="<%= @query.new_record? ? "" : "display: none;" %>">
     <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
   </div>
 </fieldset>
@@ -20,16 +20,16 @@
 <%= select_year(@year, :prefix => "year", :discard_type => true) %>
 
 <%= link_to_remote l(:button_apply), 
-                   { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
+                   { :url => { :set_filter => 1 },
                      :update => "content",
                      :with => "Form.serialize('query_form')"
                    }, :class => 'icon icon-checked' %>
                    
 <%= link_to_remote l(:button_clear),
-                   { :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, 
+                   { :url => { :project_id => @project, :set_filter => 1 }, 
                      :method => :put,
                      :update => "content",
-                   }, :class => 'icon icon-reload' if @query.new_record? %>
+                   }, :class => 'icon icon-reload' %>
 </p>
 <% end %>
 
--- a/app/views/calendars/show.html.erb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/calendars/show.html.erb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,10 +1,10 @@
-<h2><%= l(:label_calendar) %></h2>
+<h2><%= @query.new_record? ? l(:label_calendar) : h(@query.name) %></h2>
 
 <% form_tag(calendar_path, :method => :put, :id => 'query_form') do %>
   <%= hidden_field_tag('project_id', @project.to_param) if @project%>
-<fieldset id="filters" class="collapsible">
+<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
   <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
-  <div>
+  <div style="<%= @query.new_record? ? "" : "display: none;" %>">
     <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
   </div>
 </fieldset>
@@ -20,16 +20,16 @@
 <%= select_year(@year, :prefix => "year", :discard_type => true) %>
 
 <%= link_to_remote l(:button_apply), 
-                   { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
+                   { :url => { :set_filter => 1 },
                      :update => "content",
                      :with => "Form.serialize('query_form')"
                    }, :class => 'icon icon-checked' %>
                    
 <%= link_to_remote l(:button_clear),
-                   { :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, 
+                   { :url => { :project_id => @project, :set_filter => 1 }, 
                      :method => :put,
                      :update => "content",
-                   }, :class => 'icon icon-reload' if @query.new_record? %>
+                   }, :class => 'icon icon-reload' %>
 </p>
 <% end %>
 
--- a/app/views/common/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/common/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/common
 http://redmine.rubyforge.org/svn
 
--- a/app/views/context_menus/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/context_menus/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/context_menus
 http://redmine.rubyforge.org/svn
 
--- a/app/views/custom_fields/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/custom_fields/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/custom_fields
 http://redmine.rubyforge.org/svn
 
--- a/app/views/documents/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/documents/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/documents
 http://redmine.rubyforge.org/svn
 
--- a/app/views/enumerations/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/enumerations/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/enumerations
 http://redmine.rubyforge.org/svn
 
--- a/app/views/files/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/files/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/files
 http://redmine.rubyforge.org/svn
 
--- a/app/views/gantts/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/gantts/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,11 +1,11 @@
 K 25
 svn:wc:ra_dav:version-url
 V 41
-/svn/!svn/ver/4782/trunk/app/views/gantts
+/svn/!svn/ver/4913/trunk/app/views/gantts
 END
 show.html.erb
 K 25
 svn:wc:ra_dav:version-url
 V 55
-/svn/!svn/ver/4782/trunk/app/views/gantts/show.html.erb
+/svn/!svn/ver/4913/trunk/app/views/gantts/show.html.erb
 END
--- a/app/views/gantts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/gantts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/gantts
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-30T09:09:50.276451Z
-4782
+2011-02-21T15:06:11.321114Z
+4913
 jplang
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-85e8095f9a3c80cf6a53b73c6b694323
-2011-01-30T09:09:50.276451Z
-4782
+2011-03-03T11:40:18.000000Z
+6f609d119b323e4fd1a249dfbd614e38
+2011-02-21T15:06:11.321114Z
+4913
 jplang
 has-props
 
@@ -58,5 +58,5 @@
 
 
 
-6232
+6326
 
--- a/app/views/gantts/.svn/text-base/show.html.erb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/gantts/.svn/text-base/show.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,11 +1,11 @@
 <% @gantt.view = self %>
-<h2><%= l(:label_gantt) %></h2>
+<h2><%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2>
 
 <% form_tag(gantt_path(:month => params[:month], :year => params[:year], :months => params[:months]), :method => :put, :id => 'query_form') do %>
   <%= hidden_field_tag('project_id', @project.to_param) if @project%>
-<fieldset id="filters" class="collapsible">
+<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
   <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
-	<div>
+	<div style="<%= @query.new_record? ? "" : "display: none;" %>">
     <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
   </div>
 </fieldset>
@@ -23,16 +23,16 @@
 <%= hidden_field_tag 'zoom', @gantt.zoom %>
 
 <%= link_to_remote l(:button_apply), 
-                   { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
+                   { :url => { :set_filter => 1 },
                      :update => "content",
                      :with => "Form.serialize('query_form')"
                    }, :class => 'icon icon-checked' %>
                    
 <%= link_to_remote l(:button_clear),
-                   { :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, 
+                   { :url => { :project_id => @project, :set_filter => 1 }, 
                    	 :method => :put,
                      :update => "content",
-                   }, :class => 'icon icon-reload' if @query.new_record? %>
+                   }, :class => 'icon icon-reload' %>
 </p>
 <% end %>
 
@@ -60,7 +60,7 @@
 # Width of the entire chart    
 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
 t_height = g_height + headers_height
--- a/app/views/gantts/show.html.erb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/gantts/show.html.erb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,11 +1,11 @@
 <% @gantt.view = self %>
-<h2><%= l(:label_gantt) %></h2>
+<h2><%= @query.new_record? ? l(:label_gantt) : h(@query.name) %></h2>
 
 <% form_tag(gantt_path(:month => params[:month], :year => params[:year], :months => params[:months]), :method => :put, :id => 'query_form') do %>
   <%= hidden_field_tag('project_id', @project.to_param) if @project%>
-<fieldset id="filters" class="collapsible">
+<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
   <legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
-	<div>
+	<div style="<%= @query.new_record? ? "" : "display: none;" %>">
     <%= render :partial => 'queries/filters', :locals => {:query => @query} %>
   </div>
 </fieldset>
@@ -23,16 +23,16 @@
 <%= hidden_field_tag 'zoom', @gantt.zoom %>
 
 <%= link_to_remote l(:button_apply), 
-                   { :url => { :set_filter => (@query.new_record? ? 1 : nil) },
+                   { :url => { :set_filter => 1 },
                      :update => "content",
                      :with => "Form.serialize('query_form')"
                    }, :class => 'icon icon-checked' %>
                    
 <%= link_to_remote l(:button_clear),
-                   { :url => { :project_id => @project, :set_filter => (@query.new_record? ? 1 : nil) }, 
+                   { :url => { :project_id => @project, :set_filter => 1 }, 
                    	 :method => :put,
                      :update => "content",
-                   }, :class => 'icon icon-reload' if @query.new_record? %>
+                   }, :class => 'icon icon-reload' %>
 </p>
 <% end %>
 
@@ -60,7 +60,7 @@
 # Width of the entire chart    
 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
 t_height = g_height + headers_height
--- a/app/views/groups/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/groups/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/groups
 http://redmine.rubyforge.org/svn
 
--- a/app/views/issue_categories/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issue_categories/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/issue_categories
 http://redmine.rubyforge.org/svn
 
--- a/app/views/issue_moves/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issue_moves/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/issue_moves
 http://redmine.rubyforge.org/svn
 
--- a/app/views/issue_relations/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issue_relations/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/issue_relations
 http://redmine.rubyforge.org/svn
 
--- a/app/views/issue_statuses/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issue_statuses/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/issue_statuses
 http://redmine.rubyforge.org/svn
 
--- a/app/views/issues/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issues/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 41
-/svn/!svn/ver/4741/trunk/app/views/issues
+/svn/!svn/ver/4908/trunk/app/views/issues
 END
 _relations.rhtml
 K 25
@@ -9,17 +9,23 @@
 V 58
 /svn/!svn/ver/4741/trunk/app/views/issues/_relations.rhtml
 END
+_history.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/!svn/ver/4062/trunk/app/views/issues/_history.rhtml
+END
 _action_menu.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 60
 /svn/!svn/ver/4258/trunk/app/views/issues/_action_menu.rhtml
 END
-_history.rhtml
+bulk_edit.rhtml
 K 25
 svn:wc:ra_dav:version-url
-V 56
-/svn/!svn/ver/4062/trunk/app/views/issues/_history.rhtml
+V 57
+/svn/!svn/ver/4533/trunk/app/views/issues/bulk_edit.rhtml
 END
 _form.rhtml
 K 25
@@ -27,12 +33,6 @@
 V 53
 /svn/!svn/ver/4311/trunk/app/views/issues/_form.rhtml
 END
-bulk_edit.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 57
-/svn/!svn/ver/4533/trunk/app/views/issues/bulk_edit.rhtml
-END
 _form_update.rhtml
 K 25
 svn:wc:ra_dav:version-url
@@ -49,7 +49,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 56
-/svn/!svn/ver/4012/trunk/app/views/issues/_sidebar.rhtml
+/svn/!svn/ver/4908/trunk/app/views/issues/_sidebar.rhtml
 END
 _list.rhtml
 K 25
@@ -75,18 +75,18 @@
 V 67
 /svn/!svn/ver/2827/trunk/app/views/issues/_form_custom_fields.rhtml
 END
+_list_simple.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/!svn/ver/3924/trunk/app/views/issues/_list_simple.rhtml
+END
 _changesets.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 59
 /svn/!svn/ver/4652/trunk/app/views/issues/_changesets.rhtml
 END
-_list_simple.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 60
-/svn/!svn/ver/3924/trunk/app/views/issues/_list_simple.rhtml
-END
 _edit.rhtml
 K 25
 svn:wc:ra_dav:version-url
--- a/app/views/issues/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issues/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/issues
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-22T13:28:20.816262Z
-4741
+2011-02-21T13:34:33.010064Z
+4908
 jplang
 
 
@@ -60,40 +60,6 @@
 
 1763
 
-_action_menu.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-74c6e939ebb113c49a367fff0f463f63
-2010-10-15T23:11:05.712143Z
-4258
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1285
-
 _history.rhtml
 file
 
@@ -128,6 +94,74 @@
 
 859
 
+_action_menu.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+74c6e939ebb113c49a367fff0f463f63
+2010-10-15T23:11:05.712143Z
+4258
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1285
+
+bulk_edit.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+f3bdc270087564333ffdacd38f1d363c
+2010-12-18T14:14:04.023240Z
+4533
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3443
+
 _form.rhtml
 file
 
@@ -162,40 +196,6 @@
 
 2033
 
-bulk_edit.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-f3bdc270087564333ffdacd38f1d363c
-2010-12-18T14:14:04.023240Z
-4533
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3443
-
 _form_update.rhtml
 file
 
@@ -270,11 +270,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-c2e4e73b27a58d99224ccc2d7f35dc84
-2010-08-22T18:30:26.413363Z
-4012
-edavis10
+2011-03-03T11:40:18.000000Z
+b9c2ef98cde787dfe8b1b0b4df497613
+2011-02-21T13:34:33.010064Z
+4908
+jplang
 has-props
 
 
@@ -296,7 +296,7 @@
 
 
 
-1135
+901
 
 _list.rhtml
 file
@@ -434,6 +434,40 @@
 
 353
 
+_list_simple.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+334ec8cd87b661a181185092c242c41d
+2010-08-08T07:07:20.961363Z
+3924
+jbbarth
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+989
+
 _changesets.rhtml
 file
 
@@ -468,40 +502,6 @@
 
 470
 
-_list_simple.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-334ec8cd87b661a181185092c242c41d
-2010-08-08T07:07:20.961363Z
-3924
-jbbarth
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-989
-
 _edit.rhtml
 file
 
--- a/app/views/issues/.svn/text-base/_sidebar.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issues/.svn/text-base/_sidebar.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -13,11 +13,5 @@
 <% end %>
 <%= call_hook(:view_issues_sidebar_planning_bottom) %>
 
-<% unless sidebar_queries.empty? -%>
-<h3><%= l(:label_query_plural) %></h3>
-
-<% sidebar_queries.each do |query| -%>
-<%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
-<% end -%>
+<%= render_sidebar_queries %>
 <%= call_hook(:view_issues_sidebar_queries_bottom) %>
-<% end -%>
--- a/app/views/issues/_sidebar.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/issues/_sidebar.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -13,11 +13,5 @@
 <% end %>
 <%= call_hook(:view_issues_sidebar_planning_bottom) %>
 
-<% unless sidebar_queries.empty? -%>
-<h3><%= l(:label_query_plural) %></h3>
-
-<% sidebar_queries.each do |query| -%>
-<%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
-<% end -%>
+<%= render_sidebar_queries %>
 <%= call_hook(:view_issues_sidebar_queries_bottom) %>
-<% end -%>
--- a/app/views/journals/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/journals/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/4034/trunk/app/views/journals
+/svn/!svn/ver/4954/trunk/app/views/journals
 END
 _notes_form.rhtml
 K 25
@@ -21,6 +21,12 @@
 V 52
 /svn/!svn/ver/1105/trunk/app/views/journals/edit.rjs
 END
+diff.html.erb
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/!svn/ver/4954/trunk/app/views/journals/diff.html.erb
+END
 index.rxml
 K 25
 svn:wc:ra_dav:version-url
--- a/app/views/journals/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/journals/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/journals
 http://redmine.rubyforge.org/svn
 
 
 
-2010-08-23T15:04:36.844654Z
-4034
-edavis10
+2011-02-27T13:34:41.060565Z
+4954
+jplang
 
 
 
@@ -128,6 +128,40 @@
 
 140
 
+diff.html.erb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+073352211ae7cecb9e1ff5ea1ce17150
+2011-02-27T13:34:41.060565Z
+4954
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+408
+
 index.rxml
 file
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/journals/.svn/prop-base/diff.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/journals/.svn/text-base/diff.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,10 @@
+<h2><%=h @issue.tracker %> #<%= @issue.id %></h2>
+<p><%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %></p>
+
+<div class="text-diff">
+<%= simple_format_without_paragraph @diff.to_html %>
+</div>
+
+<p><%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %></p>
+
+<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/journals/diff.html.erb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,10 @@
+<h2><%=h @issue.tracker %> #<%= @issue.id %></h2>
+<p><%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %></p>
+
+<div class="text-diff">
+<%= simple_format_without_paragraph @diff.to_html %>
+</div>
+
+<p><%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %></p>
+
+<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
--- a/app/views/layouts/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/layouts/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 42
-/svn/!svn/ver/4731/trunk/app/views/layouts
+/svn/!svn/ver/4965/trunk/app/views/layouts
 END
 base.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4731/trunk/app/views/layouts/base.rhtml
+/svn/!svn/ver/4965/trunk/app/views/layouts/base.rhtml
 END
 mailer.text.plain.erb
 K 25
--- a/app/views/layouts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/layouts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/layouts
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-16T16:36:58.753919Z
-4731
+2011-02-28T16:44:02.921792Z
+4965
 jplang
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-0bc162aa0af44b46e02548061da67700
-2011-01-16T16:36:58.753919Z
-4731
+2011-03-03T11:40:18.000000Z
+be984c02903b5fdba04df41a14c73242
+2011-02-28T16:44:02.921792Z
+4965
 jplang
 has-props
 
@@ -58,7 +58,7 @@
 
 
 
-2927
+2912
 
 mailer.text.plain.erb
 file
--- a/app/views/layouts/.svn/text-base/base.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/layouts/.svn/text-base/base.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -8,7 +8,7 @@
 <%= favicon %>
 <%= stylesheet_link_tag 'application', :media => 'all' %>
 <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
-<%= javascript_include_tag :defaults %>
+<%= javascript_heads %>
 <%= heads_for_theme %>
 <%= heads_for_wiki_formatter %>
 <!--[if IE 6]>
@@ -21,7 +21,7 @@
 <!-- page specific tags -->
 <%= yield :header_tags -%>
 </head>
-<body class="<%= body_css_classes %>">
+<body class="<%=h body_css_classes %>">
 <div id="wrapper">
 <div id="wrapper2">
 <div id="top-menu">
--- a/app/views/layouts/base.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/layouts/base.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -8,7 +8,7 @@
 <%= favicon %>
 <%= stylesheet_link_tag 'application', :media => 'all' %>
 <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
-<%= javascript_include_tag :defaults %>
+<%= javascript_heads %>
 <%= heads_for_theme %>
 <%= heads_for_wiki_formatter %>
 <!--[if IE 6]>
@@ -21,7 +21,7 @@
 <!-- page specific tags -->
 <%= yield :header_tags -%>
 </head>
-<body class="<%= body_css_classes %>">
+<body class="<%=h body_css_classes %>">
 <div id="wrapper">
 <div id="wrapper2">
 <div id="top-menu">
--- a/app/views/ldap_auth_sources/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/ldap_auth_sources/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/ldap_auth_sources
 http://redmine.rubyforge.org/svn
 
--- a/app/views/mailer/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 41
-/svn/!svn/ver/4296/trunk/app/views/mailer
+/svn/!svn/ver/4892/trunk/app/views/mailer
 END
 wiki_content_added.text.plain.rhtml
 K 25
@@ -108,14 +108,20 @@
 _issue_text_plain.rhtml
 K 25
 svn:wc:ra_dav:version-url
-V 64
-/svn/!svn/ver/877/trunk/app/views/mailer/_issue_text_plain.rhtml
+V 65
+/svn/!svn/ver/4892/trunk/app/views/mailer/_issue_text_plain.rhtml
 END
 _issue_text_html.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/3452/trunk/app/views/mailer/_issue_text_html.rhtml
+/svn/!svn/ver/4892/trunk/app/views/mailer/_issue_text_html.rhtml
+END
+news_added.text.plain.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/877/trunk/app/views/mailer/news_added.text.plain.rhtml
 END
 attachments_added.text.html.rhtml
 K 25
@@ -123,12 +129,6 @@
 V 75
 /svn/!svn/ver/3452/trunk/app/views/mailer/attachments_added.text.html.rhtml
 END
-news_added.text.plain.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/877/trunk/app/views/mailer/news_added.text.plain.rhtml
-END
 news_added.text.html.rhtml
 K 25
 svn:wc:ra_dav:version-url
@@ -141,35 +141,41 @@
 V 72
 /svn/!svn/ver/877/trunk/app/views/mailer/document_added.text.plain.rhtml
 END
+document_added.text.html.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/3452/trunk/app/views/mailer/document_added.text.html.rhtml
+END
 issue_add.text.plain.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 68
 /svn/!svn/ver/2493/trunk/app/views/mailer/issue_add.text.plain.rhtml
 END
-document_added.text.html.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 72
-/svn/!svn/ver/3452/trunk/app/views/mailer/document_added.text.html.rhtml
-END
 account_information.text.plain.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 77
 /svn/!svn/ver/877/trunk/app/views/mailer/account_information.text.plain.rhtml
 END
+message_posted.text.plain.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/932/trunk/app/views/mailer/message_posted.text.plain.rhtml
+END
 account_information.text.html.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 77
 /svn/!svn/ver/3452/trunk/app/views/mailer/account_information.text.html.rhtml
 END
-message_posted.text.plain.rhtml
+wiki_content_updated.text.plain.rhtml
 K 25
 svn:wc:ra_dav:version-url
-V 72
-/svn/!svn/ver/932/trunk/app/views/mailer/message_posted.text.plain.rhtml
+V 79
+/svn/!svn/ver/4296/trunk/app/views/mailer/wiki_content_updated.text.plain.rhtml
 END
 lost_password.text.plain.rhtml
 K 25
@@ -177,12 +183,6 @@
 V 72
 /svn/!svn/ver/1683/trunk/app/views/mailer/lost_password.text.plain.rhtml
 END
-wiki_content_updated.text.plain.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 79
-/svn/!svn/ver/4296/trunk/app/views/mailer/wiki_content_updated.text.plain.rhtml
-END
 wiki_content_updated.text.html.rhtml
 K 25
 svn:wc:ra_dav:version-url
--- a/app/views/mailer/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/mailer
 http://redmine.rubyforge.org/svn
 
 
 
-2010-10-27T16:27:06.240747Z
-4296
-edavis10
+2011-02-20T14:27:34.168395Z
+4892
+jplang
 
 
 
@@ -610,8 +610,76 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-1f73b58bdc0fd4474073437ce2e219bd
+2011-03-03T11:40:18.000000Z
+76a51edc640a60b59fca8e679d0161b6
+2011-02-20T14:27:34.168395Z
+4892
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+498
+
+_issue_text_html.rhtml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+68467469e0b5a8d3dc67dba7ba7e42b0
+2011-02-20T14:27:34.168395Z
+4892
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+635
+
+news_added.text.plain.rhtml
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+0cbce1fe1b288482af3095ce9bc555ed
 2007-11-04T10:43:39.403792Z
 877
 jplang
@@ -636,41 +704,7 @@
 
 
 
-492
-
-_issue_text_html.rhtml
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-871cf6abc13d895f9de91ef4ac36c2bd
-2010-02-18T19:13:38.135448Z
-3452
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-629
+87
 
 attachments_added.text.html.rhtml
 file
@@ -706,40 +740,6 @@
 
 144
 
-news_added.text.plain.rhtml
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-0cbce1fe1b288482af3095ce9bc555ed
-2007-11-04T10:43:39.403792Z
-877
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-87
-
 news_added.text.html.rhtml
 file
 
@@ -808,6 +808,40 @@
 
 107
 
+document_added.text.html.rhtml
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+06d5fbff057e28328f2be88419207f80
+2010-02-18T19:13:38.135448Z
+3452
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+163
+
 issue_add.text.plain.rhtml
 file
 
@@ -842,40 +876,6 @@
 
 224
 
-document_added.text.html.rhtml
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-06d5fbff057e28328f2be88419207f80
-2010-02-18T19:13:38.135448Z
-3452
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-163
-
 account_information.text.plain.rhtml
 file
 
@@ -910,6 +910,40 @@
 
 295
 
+message_posted.text.plain.rhtml
+file
+
+
+
+
+2011-03-03T11:05:10.000000Z
+9b7ab36ebc57f0c02756d2b076e67b19
+2007-11-26T18:47:49.588558Z
+932
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+68
+
 account_information.text.html.rhtml
 file
 
@@ -944,17 +978,17 @@
 
 368
 
-message_posted.text.plain.rhtml
+wiki_content_updated.text.plain.rhtml
 file
 
 
 
 
 2011-03-03T11:05:10.000000Z
-9b7ab36ebc57f0c02756d2b076e67b19
-2007-11-26T18:47:49.588558Z
-932
-jplang
+0cb005c22ad144fdbe29238b0080f28b
+2010-10-27T16:27:06.240747Z
+4296
+edavis10
 has-props
 
 
@@ -976,7 +1010,7 @@
 
 
 
-68
+288
 
 lost_password.text.plain.rhtml
 file
@@ -1012,40 +1046,6 @@
 
 97
 
-wiki_content_updated.text.plain.rhtml
-file
-
-
-
-
-2011-03-03T11:05:10.000000Z
-0cb005c22ad144fdbe29238b0080f28b
-2010-10-27T16:27:06.240747Z
-4296
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-288
-
 lost_password.text.html.rhtml
 file
 
--- a/app/views/mailer/.svn/text-base/_issue_text_html.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/.svn/text-base/_issue_text_html.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -7,7 +7,7 @@
 <li><%=l(:field_assigned_to)%>: <%=h issue.assigned_to %></li>
 <li><%=l(:field_category)%>: <%=h issue.category %></li>
 <li><%=l(:field_fixed_version)%>: <%=h issue.fixed_version %></li>
-<% issue.custom_values.each do |c| %>
+<% issue.custom_field_values.each do |c| %>
   <li><%=h c.custom_field.name %>: <%=h show_value(c) %></li>
 <% end %>
 </ul>
--- a/app/views/mailer/.svn/text-base/_issue_text_plain.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/.svn/text-base/_issue_text_plain.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -7,7 +7,7 @@
 <%=l(:field_assigned_to)%>: <%= issue.assigned_to %>
 <%=l(:field_category)%>: <%= issue.category %>
 <%=l(:field_fixed_version)%>: <%= issue.fixed_version %>
-<% issue.custom_values.each do |c| %><%= c.custom_field.name %>: <%= show_value(c) %>
+<% issue.custom_field_values.each do |c| %><%= c.custom_field.name %>: <%= show_value(c) %>
 <% end %>
 
 <%= issue.description %>
--- a/app/views/mailer/_issue_text_html.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/_issue_text_html.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -7,7 +7,7 @@
 <li><%=l(:field_assigned_to)%>: <%=h issue.assigned_to %></li>
 <li><%=l(:field_category)%>: <%=h issue.category %></li>
 <li><%=l(:field_fixed_version)%>: <%=h issue.fixed_version %></li>
-<% issue.custom_values.each do |c| %>
+<% issue.custom_field_values.each do |c| %>
   <li><%=h c.custom_field.name %>: <%=h show_value(c) %></li>
 <% end %>
 </ul>
--- a/app/views/mailer/_issue_text_plain.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/mailer/_issue_text_plain.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -7,7 +7,7 @@
 <%=l(:field_assigned_to)%>: <%= issue.assigned_to %>
 <%=l(:field_category)%>: <%= issue.category %>
 <%=l(:field_fixed_version)%>: <%= issue.fixed_version %>
-<% issue.custom_values.each do |c| %><%= c.custom_field.name %>: <%= show_value(c) %>
+<% issue.custom_field_values.each do |c| %><%= c.custom_field.name %>: <%= show_value(c) %>
 <% end %>
 
 <%= issue.description %>
--- a/app/views/members/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/members/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/members
 http://redmine.rubyforge.org/svn
 
--- a/app/views/messages/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/messages/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/3877/trunk/app/views/messages
+/svn/!svn/ver/4889/trunk/app/views/messages
 END
 show.rhtml
 K 25
@@ -19,7 +19,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 54
-/svn/!svn/ver/1205/trunk/app/views/messages/edit.rhtml
+/svn/!svn/ver/4889/trunk/app/views/messages/edit.rhtml
 END
 new.rhtml
 K 25
--- a/app/views/messages/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/messages/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/messages
 http://redmine.rubyforge.org/svn
 
 
 
-2010-07-25T10:02:12.905073Z
-3877
+2011-02-20T13:11:10.508449Z
+4889
 jplang
 
 
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-72a4fb6eecd42aceb751370901633f24
-2008-03-07T17:49:44.664945Z
-1205
+2011-03-03T11:40:18.000000Z
+65fbdcd20ac7f10349863c836306f7d3
+2011-02-20T13:11:10.508449Z
+4889
 jplang
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-883
+965
 
 new.rhtml
 file
--- a/app/views/messages/.svn/text-base/edit.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/messages/.svn/text-base/edit.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -12,3 +12,7 @@
                      }, :accesskey => accesskey(:preview) %>
 <% end %>
 <div id="preview" class="wiki"></div>
+
+<% content_for :header_tags do %>
+    <%= stylesheet_link_tag 'scm' %>
+<% end %>
--- a/app/views/messages/edit.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/messages/edit.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -12,3 +12,7 @@
                      }, :accesskey => accesskey(:preview) %>
 <% end %>
 <div id="preview" class="wiki"></div>
+
+<% content_for :header_tags do %>
+    <%= stylesheet_link_tag 'scm' %>
+<% end %>
--- a/app/views/my/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/my/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/my
 http://redmine.rubyforge.org/svn
 
--- a/app/views/my/blocks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/my/blocks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/my/blocks
 http://redmine.rubyforge.org/svn
 
--- a/app/views/news/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/news/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/news
 http://redmine.rubyforge.org/svn
 
--- a/app/views/previews/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/previews/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/previews
 http://redmine.rubyforge.org/svn
 
--- a/app/views/projects/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/projects/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/projects
 http://redmine.rubyforge.org/svn
 
--- a/app/views/projects/settings/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/projects/settings/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/projects/settings
 http://redmine.rubyforge.org/svn
 
--- a/app/views/queries/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/queries/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/queries
 http://redmine.rubyforge.org/svn
 
--- a/app/views/reports/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/reports/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/reports
 http://redmine.rubyforge.org/svn
 
--- a/app/views/repositories/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/repositories/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 47
-/svn/!svn/ver/4733/trunk/app/views/repositories
+/svn/!svn/ver/4921/trunk/app/views/repositories
 END
-_navigation.rhtml
+stats.rhtml
 K 25
 svn:wc:ra_dav:version-url
-V 65
-/svn/!svn/ver/3086/trunk/app/views/repositories/_navigation.rhtml
+V 59
+/svn/!svn/ver/2895/trunk/app/views/repositories/stats.rhtml
 END
 revision.rhtml
 K 25
@@ -15,11 +15,11 @@
 V 62
 /svn/!svn/ver/4613/trunk/app/views/repositories/revision.rhtml
 END
-stats.rhtml
+_navigation.rhtml
 K 25
 svn:wc:ra_dav:version-url
-V 59
-/svn/!svn/ver/2895/trunk/app/views/repositories/stats.rhtml
+V 65
+/svn/!svn/ver/3086/trunk/app/views/repositories/_navigation.rhtml
 END
 entry.rhtml
 K 25
@@ -31,7 +31,19 @@
 K 25
 svn:wc:ra_dav:version-url
 V 71
-/svn/!svn/ver/4613/trunk/app/views/repositories/_dir_list_content.rhtml
+/svn/!svn/ver/4921/trunk/app/views/repositories/_dir_list_content.rhtml
+END
+diff.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/4698/trunk/app/views/repositories/diff.rhtml
+END
+changes.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/!svn/ver/2840/trunk/app/views/repositories/changes.rhtml
 END
 _dir_list.rhtml
 K 25
@@ -39,54 +51,42 @@
 V 63
 /svn/!svn/ver/1032/trunk/app/views/repositories/_dir_list.rhtml
 END
-changes.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 61
-/svn/!svn/ver/2840/trunk/app/views/repositories/changes.rhtml
-END
-diff.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 58
-/svn/!svn/ver/4698/trunk/app/views/repositories/diff.rhtml
-END
 annotate.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 62
 /svn/!svn/ver/4613/trunk/app/views/repositories/annotate.rhtml
 END
+show.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/!svn/ver/2849/trunk/app/views/repositories/show.rhtml
+END
 _revisions.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 64
 /svn/!svn/ver/4613/trunk/app/views/repositories/_revisions.rhtml
 END
-show.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 58
-/svn/!svn/ver/2849/trunk/app/views/repositories/show.rhtml
-END
 revisions.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 63
 /svn/!svn/ver/2840/trunk/app/views/repositories/revisions.rhtml
 END
+committers.rhtml
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/2137/trunk/app/views/repositories/committers.rhtml
+END
 _link_to_functions.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 72
 /svn/!svn/ver/2849/trunk/app/views/repositories/_link_to_functions.rhtml
 END
-committers.rhtml
-K 25
-svn:wc:ra_dav:version-url
-V 64
-/svn/!svn/ver/2137/trunk/app/views/repositories/committers.rhtml
-END
 _breadcrumbs.rhtml
 K 25
 svn:wc:ra_dav:version-url
--- a/app/views/repositories/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/repositories/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/repositories
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-21T13:22:08.161817Z
-4733
+2011-02-22T08:16:05.081549Z
+4921
 tmaruyama
 
 
@@ -26,6 +26,74 @@
 
 e93f8b46-1217-0410-a6f0-8f06a7374b81
 
+stats.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+bafc924316c90c31dc1cd9a6daf124ef
+2009-09-20T14:06:57.257282Z
+2895
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+581
+
+revision.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+8599ffd3e73ccf24e2c81c6e0a20c906
+2011-01-02T09:45:05.291687Z
+4613
+tmaruyama
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1931
+
 _navigation.rhtml
 file
 
@@ -60,74 +128,6 @@
 
 910
 
-revision.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-8599ffd3e73ccf24e2c81c6e0a20c906
-2011-01-02T09:45:05.291687Z
-4613
-tmaruyama
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1931
-
-stats.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-bafc924316c90c31dc1cd9a6daf124ef
-2009-09-20T14:06:57.257282Z
-2895
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-581
-
 entry.rhtml
 file
 
@@ -168,10 +168,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-e22fd8ddf680ee0773ea1da9b5ed9518
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:18.000000Z
+9e9a1bb7f64971403644f55f38f9ccce
+2011-02-22T08:16:05.081549Z
+4921
 tmaruyama
 has-props
 
@@ -194,7 +194,75 @@
 
 
 
-1715
+1839
+
+diff.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+76c0335206cfde112a6416937072848b
+2011-01-11T16:04:07.541291Z
+4698
+tmaruyama
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+944
+
+changes.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+cde7a86a5ec0cf9915b0540c9acbb820
+2009-08-15T22:41:40.505056Z
+2840
+edavis10
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+636
 
 _dir_list.rhtml
 file
@@ -230,74 +298,6 @@
 
 350
 
-changes.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-cde7a86a5ec0cf9915b0540c9acbb820
-2009-08-15T22:41:40.505056Z
-2840
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-636
-
-diff.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-76c0335206cfde112a6416937072848b
-2011-01-11T16:04:07.541291Z
-4698
-tmaruyama
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-944
-
 annotate.rhtml
 file
 
@@ -332,6 +332,40 @@
 
 1333
 
+show.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+5608dc13675382cd62688058ca0b77d1
+2009-09-01T12:13:17.386587Z
+2849
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1461
+
 _revisions.rhtml
 file
 
@@ -366,40 +400,6 @@
 
 1341
 
-show.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-5608dc13675382cd62688058ca0b77d1
-2009-09-01T12:13:17.386587Z
-2849
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1461
-
 revisions.rhtml
 file
 
@@ -434,6 +434,40 @@
 
 810
 
+committers.rhtml
+file
+
+
+
+
+2011-03-03T11:05:11.000000Z
+2db96b0dcaab42c8e67b7fc590618fd3
+2008-12-15T18:02:25.843227Z
+2137
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+857
+
 _link_to_functions.rhtml
 file
 
@@ -468,40 +502,6 @@
 
 847
 
-committers.rhtml
-file
-
-
-
-
-2011-03-03T11:05:11.000000Z
-2db96b0dcaab42c8e67b7fc590618fd3
-2008-12-15T18:02:25.843227Z
-2137
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-857
-
 _breadcrumbs.rhtml
 file
 
--- a/app/views/repositories/.svn/text-base/_dir_list_content.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/repositories/.svn/text-base/_dir_list_content.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,25 +1,27 @@
 <% @entries.each do |entry| %>
 <% tr_id = Digest::MD5.hexdigest(entry.path)
    depth = params[:depth].to_i %>
+<%  ent_path = replace_invalid_utf8(entry.path)   %>
+<%  ent_name = replace_invalid_utf8(entry.name)   %>
 <tr id="<%= tr_id %>" class="<%= h params[:parent_id] %> entry <%= entry.kind %>">
 <td style="padding-left: <%=18 * depth%>px;" class="filename">
 <% if entry.is_dir? %>
-<span class="expander" onclick="<%=  remote_function :url => {:action => 'show', :id => @project, :path => to_path_param(entry.path), :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
-									:method => :get,
+<span class="expander" onclick="<%=  remote_function :url => {:action => 'show', :id => @project, :path => to_path_param(ent_path), :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
+                  :method => :get,
                   :update => { :success => tr_id },
                   :position => :after,
                   :success => "scmEntryLoaded('#{tr_id}')",
                   :condition => "scmEntryClick('#{tr_id}')"%>">&nbsp</span>
 <% end %>
-<%=  link_to h(entry.name),
-          {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(entry.path), :rev => @rev},
-          :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(entry.name)}")%>
+<%=  link_to h(ent_name),
+          {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(ent_path), :rev => @rev},
+          :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(ent_name)}")%>
 </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.find_changeset_by_name(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
 <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="author"><%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %></td>
+<td class="author"><%= changeset.nil? ? h(replace_invalid_utf8(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>
 </tr>
 <% end %>
--- a/app/views/repositories/_dir_list_content.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/repositories/_dir_list_content.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -1,25 +1,27 @@
 <% @entries.each do |entry| %>
 <% tr_id = Digest::MD5.hexdigest(entry.path)
    depth = params[:depth].to_i %>
+<%  ent_path = replace_invalid_utf8(entry.path)   %>
+<%  ent_name = replace_invalid_utf8(entry.name)   %>
 <tr id="<%= tr_id %>" class="<%= h params[:parent_id] %> entry <%= entry.kind %>">
 <td style="padding-left: <%=18 * depth%>px;" class="filename">
 <% if entry.is_dir? %>
-<span class="expander" onclick="<%=  remote_function :url => {:action => 'show', :id => @project, :path => to_path_param(entry.path), :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
-									:method => :get,
+<span class="expander" onclick="<%=  remote_function :url => {:action => 'show', :id => @project, :path => to_path_param(ent_path), :rev => @rev, :depth => (depth + 1), :parent_id => tr_id},
+                  :method => :get,
                   :update => { :success => tr_id },
                   :position => :after,
                   :success => "scmEntryLoaded('#{tr_id}')",
                   :condition => "scmEntryClick('#{tr_id}')"%>">&nbsp</span>
 <% end %>
-<%=  link_to h(entry.name),
-          {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(entry.path), :rev => @rev},
-          :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(entry.name)}")%>
+<%=  link_to h(ent_name),
+          {:action => (entry.is_dir? ? 'show' : 'changes'), :id => @project, :path => to_path_param(ent_path), :rev => @rev},
+          :class => (entry.is_dir? ? 'icon icon-folder' : "icon icon-file #{Redmine::MimeType.css_class_of(ent_name)}")%>
 </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.find_changeset_by_name(entry.lastrev.identifier) if entry.lastrev && entry.lastrev.identifier %>
 <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="author"><%= changeset.nil? ? h(entry.lastrev.author.to_s.split('<').first) : changeset.author if entry.lastrev %></td>
+<td class="author"><%= changeset.nil? ? h(replace_invalid_utf8(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>
 </tr>
 <% end %>
--- a/app/views/roles/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/roles/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/roles
 http://redmine.rubyforge.org/svn
 
--- a/app/views/search/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/search/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/search
 http://redmine.rubyforge.org/svn
 
--- a/app/views/settings/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/4730/trunk/app/views/settings
+/svn/!svn/ver/4983/trunk/app/views/settings
 END
 _issues.rhtml
 K 25
@@ -37,7 +37,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/3198/trunk/app/views/settings/_display.rhtml
+/svn/!svn/ver/4811/trunk/app/views/settings/_display.rhtml
 END
 edit.rhtml
 K 25
@@ -49,7 +49,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 63
-/svn/!svn/ver/4470/trunk/app/views/settings/_repositories.rhtml
+/svn/!svn/ver/4983/trunk/app/views/settings/_repositories.rhtml
 END
 _notifications.rhtml
 K 25
--- a/app/views/settings/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/settings
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-16T15:36:42.998302Z
-4730
-jplang
+2011-03-01T10:27:51.597350Z
+4983
+tmaruyama
 
 
 
@@ -202,11 +202,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-af00d651b626c36ca365bd748f55ec40
-2009-12-19T20:07:09.039389Z
-3198
-jplang
+2011-03-03T11:40:18.000000Z
+55169c45bb26caf3ff0c92c5b07d7bbe
+2011-02-12T08:16:37.660908Z
+4811
+jbbarth
 has-props
 
 
@@ -228,7 +228,7 @@
 
 
 
-1041
+1061
 
 edit.rhtml
 file
@@ -270,11 +270,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-da15c28695cd56ff6539df1d45159797
-2010-12-05T11:45:09.061840Z
-4470
-jplang
+2011-03-03T11:40:18.000000Z
+7bc500aa382125fa379e7539d4566431
+2011-03-01T10:27:51.597350Z
+4983
+tmaruyama
 has-props
 
 
@@ -296,7 +296,7 @@
 
 
 
-2303
+2231
 
 _notifications.rhtml
 file
--- a/app/views/settings/.svn/text-base/_display.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/.svn/text-base/_display.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -15,7 +15,7 @@
 
 <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>
 
 <%= submit_tag l(:button_save) %>
--- a/app/views/settings/.svn/text-base/_repositories.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/.svn/text-base/_repositories.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -18,8 +18,6 @@
 <p><%= setting_text_field :repositories_encodings, :size => 60 %><br />
 <em><%= l(:text_comma_separated) %></em></p>
 
-<p><%= setting_select :commit_logs_encoding, Setting::ENCODINGS %></p>
-
 <p><%= setting_text_field :repository_log_display_limit, :size => 6 %></p>
 </div>
 
--- a/app/views/settings/_display.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/_display.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -15,7 +15,7 @@
 
 <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>
 
 <%= submit_tag l(:button_save) %>
--- a/app/views/settings/_repositories.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/settings/_repositories.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -18,8 +18,6 @@
 <p><%= setting_text_field :repositories_encodings, :size => 60 %><br />
 <em><%= l(:text_comma_separated) %></em></p>
 
-<p><%= setting_select :commit_logs_encoding, Setting::ENCODINGS %></p>
-
 <p><%= setting_text_field :repository_log_display_limit, :size => 6 %></p>
 </div>
 
--- a/app/views/time_entry_reports/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/time_entry_reports/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/time_entry_reports
 http://redmine.rubyforge.org/svn
 
--- a/app/views/timelog/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/timelog/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/timelog
 http://redmine.rubyforge.org/svn
 
--- a/app/views/trackers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/trackers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/trackers
 http://redmine.rubyforge.org/svn
 
--- a/app/views/users/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/users/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 40
-/svn/!svn/ver/4729/trunk/app/views/users
+/svn/!svn/ver/4900/trunk/app/views/users
 END
 _general.rhtml
 K 25
@@ -55,7 +55,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 62
-/svn/!svn/ver/4223/trunk/app/views/users/_preferences.html.erb
+/svn/!svn/ver/4900/trunk/app/views/users/_preferences.html.erb
 END
 edit.rhtml
 K 25
--- a/app/views/users/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/users/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/users
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-16T15:23:11.666065Z
-4729
+2011-02-21T09:53:29.844413Z
+4900
 jplang
 
 
@@ -304,11 +304,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-ebc1d625f2d6809ea491e7303f758e7a
-2010-09-28T22:13:06.534232Z
-4223
-edavis10
+2011-03-03T11:40:18.000000Z
+819ceb2599cdb65121387da777ec7454
+2011-02-21T09:53:29.844413Z
+4900
+jplang
 
 
 
@@ -330,7 +330,7 @@
 
 
 
-441
+502
 
 edit.rhtml
 file
--- a/app/views/users/.svn/text-base/_preferences.html.erb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/users/.svn/text-base/_preferences.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -2,5 +2,6 @@
 <p><%= pref_fields.check_box :hide_mail %></p>
 <p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
 <p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
+<p><%= pref_fields.check_box :warn_on_leaving_unsaved %></p>
 <% end %>
 
--- a/app/views/users/_preferences.html.erb	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/users/_preferences.html.erb	Thu Mar 03 11:42:28 2011 +0000
@@ -2,5 +2,6 @@
 <p><%= pref_fields.check_box :hide_mail %></p>
 <p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
 <p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
+<p><%= pref_fields.check_box :warn_on_leaving_unsaved %></p>
 <% end %>
 
--- a/app/views/versions/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/versions/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/versions
 http://redmine.rubyforge.org/svn
 
--- a/app/views/watchers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/watchers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/watchers
 http://redmine.rubyforge.org/svn
 
--- a/app/views/welcome/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/welcome/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/welcome
 http://redmine.rubyforge.org/svn
 
--- a/app/views/wiki/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/wiki/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 39
-/svn/!svn/ver/4740/trunk/app/views/wiki
+/svn/!svn/ver/4953/trunk/app/views/wiki
 END
 export_multiple.rhtml
 K 25
@@ -55,7 +55,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 50
-/svn/!svn/ver/4551/trunk/app/views/wiki/diff.rhtml
+/svn/!svn/ver/4953/trunk/app/views/wiki/diff.rhtml
 END
 _content.rhtml
 K 25
--- a/app/views/wiki/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/wiki/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/wiki
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-22T13:21:24.424880Z
-4740
+2011-02-27T12:50:47.369941Z
+4953
 jplang
 
 
@@ -304,10 +304,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-da40592a7819a8786e7e436b2ecff8b1
-2010-12-20T22:33:44.015948Z
-4551
+2011-03-03T11:40:18.000000Z
+954230b09809d40bbd6f6514fb1fcc59
+2011-02-27T12:50:47.369941Z
+4953
 jplang
 has-props
 
@@ -330,7 +330,7 @@
 
 
 
-879
+931
 
 _content.rhtml
 file
--- a/app/views/wiki/.svn/text-base/diff.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/wiki/.svn/text-base/diff.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -12,6 +12,6 @@
 <em>(<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)</em>
 </p>
 
-<hr />
-
-<%= html_diff(@diff) %>
+<div class="text-diff">
+<%= simple_format_without_paragraph @diff.to_html %>
+</div>
--- a/app/views/wiki/diff.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/wiki/diff.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -12,6 +12,6 @@
 <em>(<%= @diff.content_to.author ? @diff.content_to.author.name : "anonyme" %>, <%= format_time(@diff.content_to.updated_on) %>)</em>
 </p>
 
-<hr />
-
-<%= html_diff(@diff) %>
+<div class="text-diff">
+<%= simple_format_without_paragraph @diff.to_html %>
+</div>
--- a/app/views/wikis/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/wikis/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/wikis
 http://redmine.rubyforge.org/svn
 
--- a/app/views/workflows/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4428/trunk/app/views/workflows
+/svn/!svn/ver/4895/trunk/app/views/workflows
 END
 copy.rhtml
 K 25
@@ -19,11 +19,17 @@
 K 25
 svn:wc:ra_dav:version-url
 V 55
-/svn/!svn/ver/3694/trunk/app/views/workflows/edit.rhtml
+/svn/!svn/ver/4895/trunk/app/views/workflows/edit.rhtml
 END
 index.rhtml
 K 25
 svn:wc:ra_dav:version-url
 V 56
-/svn/!svn/ver/4428/trunk/app/views/workflows/index.rhtml
+/svn/!svn/ver/4890/trunk/app/views/workflows/index.rhtml
 END
+_form.html.erb
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/!svn/ver/4895/trunk/app/views/workflows/_form.html.erb
+END
--- a/app/views/workflows/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/app/views/workflows
 http://redmine.rubyforge.org/svn
 
 
 
-2010-11-27T09:54:16.602477Z
-4428
+2011-02-20T15:38:07.840581Z
+4895
 jplang
 
 
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-ee551cfe66cd8df0fbd5bc7bac081200
-2010-04-27T17:54:27.767853Z
-3694
+2011-03-03T11:40:18.000000Z
+f52bc187d855a23aea0bc36061a8d179
+2011-02-20T15:38:07.840581Z
+4895
 jplang
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-2474
+2211
 
 index.rhtml
 file
@@ -134,10 +134,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-40709e258d1a829cf73046d8e1b5d7f3
-2010-11-27T09:54:16.602477Z
-4428
+2011-03-03T11:40:18.000000Z
+0943677a780ac0d9c0ba1a7000148f13
+2011-02-20T13:13:10.623157Z
+4890
 jplang
 has-props
 
@@ -162,3 +162,37 @@
 
 851
 
+_form.html.erb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+a2442c53d709a008d9026746d5f3cfd3
+2011-02-20T15:38:07.840581Z
+4895
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1673
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/workflows/.svn/prop-base/_form.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/workflows/.svn/text-base/_form.html.erb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,40 @@
+<table class="list transitions-<%= name %>">
+<thead>
+	<tr>
+		<th align="left">
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input')",
+			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+      <%=l(:label_current_status)%>
+    </th>
+		<th align="center" colspan="<%= @statuses.length %>"><%=l(:label_new_statuses_allowed)%></th>
+	</tr>
+	<tr>
+		<td></td>
+		<% for new_status in @statuses %>
+		<td width="<%= 75 / @statuses.size %>%" align="center">
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.new-status-#{new_status.id}')",
+	                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+			<%=h new_status.name %>
+		</td>
+		<% end %>
+	</tr>
+</thead>
+<tbody>
+	<% for old_status in @statuses %>
+	<tr class="<%= cycle("odd", "even") %>">
+		<td>
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.old-status-#{old_status.id}')",
+			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+			
+			<%=h old_status.name %>
+		</td>
+		<% for new_status in @statuses -%>
+		<td align="center">
+			<%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id},
+						:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>			
+		</td>
+		<% end -%>
+	</tr>
+	<% end %>
+</tbody>
+</table>
\ No newline at end of file
--- a/app/views/workflows/.svn/text-base/edit.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/.svn/text-base/edit.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,54 +20,31 @@
 </p>
 <% end %>
 
-
 <% if @tracker && @role && @statuses.any? %>
-<% form_tag({}, :id => 'workflow_form' ) do %>
-<%= hidden_field_tag 'tracker_id', @tracker.id %>
-<%= hidden_field_tag 'role_id', @role.id %>
-<div class="autoscroll">
-<table class="list">
-<thead>
-	<tr>
-		<th align="left"><%=l(:label_current_status)%></th>
-		<th align="center" colspan="<%= @statuses.length %>"><%=l(:label_new_statuses_allowed)%></th>
-	</tr>
-	<tr>
-		<td></td>
-		<% for new_status in @statuses %>
-		<td width="<%= 75 / @statuses.size %>%" align="center">
-			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.new-status-#{new_status.id}')",
-	                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
-			<%= new_status.name %>
-		</td>
-		<% end %>
-	</tr>
-</thead>
-<tbody>
-	<% for old_status in @statuses %>
-	<tr class="<%= cycle("odd", "even") %>">
-		<td>
-			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.old-status-#{old_status.id}')",
-			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
-			
-			<%= old_status.name %>
-		</td>
-		<% new_status_ids_allowed = old_status.find_new_statuses_allowed_to([@role], @tracker).collect(&:id) -%>
-		<% for new_status in @statuses -%>
-		<td align="center">
-			<%= check_box_tag "issue_status[#{ old_status.id }][]", new_status.id, new_status_ids_allowed.include?(new_status.id),
-						:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>			
-		</td>
-		<% end -%>
-	</tr>
-	<% end %>
-</tbody>
-</table>
-</div>
-<p><%= check_all_links 'workflow_form' %></p>
-
-<%= submit_tag l(:button_save) %>
-<% end %>
+  <% form_tag({}, :id => 'workflow_form' ) do %>
+    <%= hidden_field_tag 'tracker_id', @tracker.id %>
+    <%= hidden_field_tag 'role_id', @role.id %>
+    <div class="autoscroll">
+      <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %>
+      
+      <fieldset class="collapsible" style="padding: 0; margin-top: 0.5em;">
+        <legend onclick="toggleFieldset(this);">Autorisations supplémentaires lorsque l'utilisateur a créé la demande</legend>
+        <div id="author_workflows" style="margin: 0.5em 0 0.5em 0;">
+          <%= render :partial => 'form', :locals => {:name => 'author', :workflows => @workflows['author']} %>
+        </div>
+      </fieldset>
+      <%= javascript_tag "hideFieldset($('author_workflows'))" unless @workflows['author'].present? %>
+      
+      <fieldset class="collapsible" style="padding: 0;">
+        <legend onclick="toggleFieldset(this);">Autorisations supplémentaires lorsque la demande est assignée à l'utilisateur</legend>
+        <div id="assignee_workflows" style="margin: 0.5em 0 0.5em 0;">
+      <%= render :partial => 'form', :locals => {:name => 'assignee', :workflows => @workflows['assignee']} %>
+        </div>
+      </fieldset>
+      <%= javascript_tag "hideFieldset($('assignee_workflows'))" unless @workflows['assignee'].present? %>
+    </div>
+    <%= submit_tag l(:button_save) %>
+  <% end %>
 <% end %>
 
 <% html_title(l(:label_workflow)) -%>
--- a/app/views/workflows/.svn/text-base/index.rhtml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/.svn/text-base/index.rhtml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -24,7 +24,7 @@
   <td><%= h tracker %></td>
   <% roles.each do |role, count| -%>
     <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>
   <% end -%>
 </tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/views/workflows/_form.html.erb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,40 @@
+<table class="list transitions-<%= name %>">
+<thead>
+	<tr>
+		<th align="left">
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input')",
+			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+      <%=l(:label_current_status)%>
+    </th>
+		<th align="center" colspan="<%= @statuses.length %>"><%=l(:label_new_statuses_allowed)%></th>
+	</tr>
+	<tr>
+		<td></td>
+		<% for new_status in @statuses %>
+		<td width="<%= 75 / @statuses.size %>%" align="center">
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.new-status-#{new_status.id}')",
+	                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+			<%=h new_status.name %>
+		</td>
+		<% end %>
+	</tr>
+</thead>
+<tbody>
+	<% for old_status in @statuses %>
+	<tr class="<%= cycle("odd", "even") %>">
+		<td>
+			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('table.transitions-#{name} input.old-status-#{old_status.id}')",
+			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
+			
+			<%=h old_status.name %>
+		</td>
+		<% for new_status in @statuses -%>
+		<td align="center">
+			<%= check_box_tag "issue_status[#{ old_status.id }][#{new_status.id}][]", name, workflows.detect {|w| w.old_status_id == old_status.id && w.new_status_id == new_status.id},
+						:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>			
+		</td>
+		<% end -%>
+	</tr>
+	<% end %>
+</tbody>
+</table>
\ No newline at end of file
--- a/app/views/workflows/edit.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/edit.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -20,54 +20,31 @@
 </p>
 <% end %>
 
-
 <% if @tracker && @role && @statuses.any? %>
-<% form_tag({}, :id => 'workflow_form' ) do %>
-<%= hidden_field_tag 'tracker_id', @tracker.id %>
-<%= hidden_field_tag 'role_id', @role.id %>
-<div class="autoscroll">
-<table class="list">
-<thead>
-	<tr>
-		<th align="left"><%=l(:label_current_status)%></th>
-		<th align="center" colspan="<%= @statuses.length %>"><%=l(:label_new_statuses_allowed)%></th>
-	</tr>
-	<tr>
-		<td></td>
-		<% for new_status in @statuses %>
-		<td width="<%= 75 / @statuses.size %>%" align="center">
-			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.new-status-#{new_status.id}')",
-	                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
-			<%= new_status.name %>
-		</td>
-		<% end %>
-	</tr>
-</thead>
-<tbody>
-	<% for old_status in @statuses %>
-	<tr class="<%= cycle("odd", "even") %>">
-		<td>
-			<%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.old-status-#{old_status.id}')",
-			                                              			:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %>
-			
-			<%= old_status.name %>
-		</td>
-		<% new_status_ids_allowed = old_status.find_new_statuses_allowed_to([@role], @tracker).collect(&:id) -%>
-		<% for new_status in @statuses -%>
-		<td align="center">
-			<%= check_box_tag "issue_status[#{ old_status.id }][]", new_status.id, new_status_ids_allowed.include?(new_status.id),
-						:class => "old-status-#{old_status.id} new-status-#{new_status.id}" %>			
-		</td>
-		<% end -%>
-	</tr>
-	<% end %>
-</tbody>
-</table>
-</div>
-<p><%= check_all_links 'workflow_form' %></p>
-
-<%= submit_tag l(:button_save) %>
-<% end %>
+  <% form_tag({}, :id => 'workflow_form' ) do %>
+    <%= hidden_field_tag 'tracker_id', @tracker.id %>
+    <%= hidden_field_tag 'role_id', @role.id %>
+    <div class="autoscroll">
+      <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %>
+      
+      <fieldset class="collapsible" style="padding: 0; margin-top: 0.5em;">
+        <legend onclick="toggleFieldset(this);">Autorisations supplémentaires lorsque l'utilisateur a créé la demande</legend>
+        <div id="author_workflows" style="margin: 0.5em 0 0.5em 0;">
+          <%= render :partial => 'form', :locals => {:name => 'author', :workflows => @workflows['author']} %>
+        </div>
+      </fieldset>
+      <%= javascript_tag "hideFieldset($('author_workflows'))" unless @workflows['author'].present? %>
+      
+      <fieldset class="collapsible" style="padding: 0;">
+        <legend onclick="toggleFieldset(this);">Autorisations supplémentaires lorsque la demande est assignée à l'utilisateur</legend>
+        <div id="assignee_workflows" style="margin: 0.5em 0 0.5em 0;">
+      <%= render :partial => 'form', :locals => {:name => 'assignee', :workflows => @workflows['assignee']} %>
+        </div>
+      </fieldset>
+      <%= javascript_tag "hideFieldset($('assignee_workflows'))" unless @workflows['assignee'].present? %>
+    </div>
+    <%= submit_tag l(:button_save) %>
+  <% end %>
 <% end %>
 
 <% html_title(l(:label_workflow)) -%>
--- a/app/views/workflows/index.rhtml	Thu Mar 03 11:40:10 2011 +0000
+++ b/app/views/workflows/index.rhtml	Thu Mar 03 11:42:28 2011 +0000
@@ -24,7 +24,7 @@
   <td><%= h tracker %></td>
   <% roles.each do |role, count| -%>
     <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>
   <% end -%>
 </tr>
--- a/config/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 31
-/svn/!svn/ver/4799/trunk/config
+/svn/!svn/ver/4955/trunk/config
 END
 settings.yml
 K 25
@@ -13,7 +13,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 57
-/svn/!svn/ver/4798/trunk/config/configuration.yml.example
+/svn/!svn/ver/4950/trunk/config/configuration.yml.example
 END
 routes.rb
 K 25
@@ -31,7 +31,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/environment.rb
+/svn/!svn/ver/4904/trunk/config/environment.rb
 END
 additional_environment.rb.example
 K 25
--- a/config/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/config
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-06T00:31:15.026336Z
-4799
-jbbarth
+2011-02-27T13:43:18.863191Z
+4955
+jplang
 has-props
 
 
@@ -66,11 +66,11 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-ead0ed1efd92e31194815e50d312920e
-2011-02-05T00:57:41.645336Z
-4798
-tmaruyama
+2011-03-03T11:40:18.000000Z
+69243d1b5b9b111da631c7034d51ba71
+2011-02-26T13:09:25.657748Z
+4950
+jplang
 has-props
 
 
@@ -92,7 +92,7 @@
 
 
 
-4015
+4886
 
 locales
 dir
@@ -174,10 +174,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-a18bfc7d8a10fdf178623f6f6663c538
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+cc9c7d7f9a4bd800d2c4a8737147e4c3
+2011-02-21T11:02:18.659691Z
+4904
 jplang
 has-props
 
@@ -200,7 +200,7 @@
 
 
 
-2548
+2553
 
 environments
 dir
--- a/config/.svn/text-base/configuration.yml.example.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/.svn/text-base/configuration.yml.example.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -110,12 +110,33 @@
   # Configuration of SCM executable command.
   # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe)
   # On Windows, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work.
-  scm_subversion_command: svn                                       # (default: svn)
-  scm_mercurial_command:  "\"C:\Program Files\TortoiseHg\hg.exe\""  # (default: hg)
-  scm_git_command:        /usr/local/bin/git                        # (default: git)
-  scm_cvs_command:        cvs                                       # (default: cvs)
-  scm_bazaar_command:     bzr.exe                                   # (default: bzr)
-  scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
+  # Examples:
+  # scm_subversion_command: svn                                       # (default: svn)
+  # scm_mercurial_command:  C:\Program Files\TortoiseHg\hg.exe        # (default: hg)
+  # scm_git_command:        /usr/local/bin/git                        # (default: git)
+  # scm_cvs_command:        cvs                                       # (default: cvs)
+  # scm_bazaar_command:     bzr.exe                                   # (default: bzr)
+  # scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
+  scm_subversion_command:
+  scm_mercurial_command:
+  scm_git_command:
+  scm_cvs_command:
+  scm_bazaar_command:
+  scm_darcs_command:
+  
+  # Key used to encrypt sensitive data in the database (SCM and LDAP passwords).
+  # If you don't want to enable data encryption, just leave it blank.
+  # WARNING: losing/changing this key will make encrypted data unreadable.
+  #
+  # If you want to encrypt existing passwords in your database:
+  # * set the cipher key here in your configuration file
+  # * encrypt data using 'rake db:encrypt RAILS_ENV=production'
+  #
+  # If you have encrypted data and want to change this key, you have to:
+  # * decrypt data using 'rake db:decrypt RAILS_ENV=production' first
+  # * change the cipher key here in your configuration file
+  # * encrypt data using 'rake db:encrypt RAILS_ENV=production'
+  database_cipher_key: 
   
 # specific configuration options for production environment
 # that overrides the default ones
--- a/config/.svn/text-base/environment.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/.svn/text-base/environment.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -5,7 +5,7 @@
 # ENV['RAILS_ENV'] ||= 'production'
 
 # Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
+RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION
 
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
@@ -24,7 +24,7 @@
   # config.frameworks -= [ :action_web_service, :action_mailer ]
 
   # Add additional load paths for sweepers
-  config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
+  config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers )
 
   # Force all environments to use the same logger level 
   # (by default production uses :info, the others :debug)
--- a/config/configuration.yml.example	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/configuration.yml.example	Thu Mar 03 11:42:28 2011 +0000
@@ -110,12 +110,33 @@
   # Configuration of SCM executable command.
   # Absolute path (e.g. /usr/local/bin/hg) or command name (e.g. hg.exe, bzr.exe)
   # On Windows, *.cmd, *.bat (e.g. hg.cmd, bzr.bat) does not work.
-  scm_subversion_command: svn                                       # (default: svn)
-  scm_mercurial_command:  "\"C:\Program Files\TortoiseHg\hg.exe\""  # (default: hg)
-  scm_git_command:        /usr/local/bin/git                        # (default: git)
-  scm_cvs_command:        cvs                                       # (default: cvs)
-  scm_bazaar_command:     bzr.exe                                   # (default: bzr)
-  scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
+  # Examples:
+  # scm_subversion_command: svn                                       # (default: svn)
+  # scm_mercurial_command:  C:\Program Files\TortoiseHg\hg.exe        # (default: hg)
+  # scm_git_command:        /usr/local/bin/git                        # (default: git)
+  # scm_cvs_command:        cvs                                       # (default: cvs)
+  # scm_bazaar_command:     bzr.exe                                   # (default: bzr)
+  # scm_darcs_command:      darcs-1.0.9-i386-linux                    # (default: darcs)
+  scm_subversion_command:
+  scm_mercurial_command:
+  scm_git_command:
+  scm_cvs_command:
+  scm_bazaar_command:
+  scm_darcs_command:
+  
+  # Key used to encrypt sensitive data in the database (SCM and LDAP passwords).
+  # If you don't want to enable data encryption, just leave it blank.
+  # WARNING: losing/changing this key will make encrypted data unreadable.
+  #
+  # If you want to encrypt existing passwords in your database:
+  # * set the cipher key here in your configuration file
+  # * encrypt data using 'rake db:encrypt RAILS_ENV=production'
+  #
+  # If you have encrypted data and want to change this key, you have to:
+  # * decrypt data using 'rake db:decrypt RAILS_ENV=production' first
+  # * change the cipher key here in your configuration file
+  # * encrypt data using 'rake db:encrypt RAILS_ENV=production'
+  database_cipher_key: 
   
 # specific configuration options for production environment
 # that overrides the default ones
--- a/config/environment.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/environment.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -5,7 +5,7 @@
 # ENV['RAILS_ENV'] ||= 'production'
 
 # Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
+RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION
 
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
@@ -24,7 +24,7 @@
   # config.frameworks -= [ :action_web_service, :action_mailer ]
 
   # Add additional load paths for sweepers
-  config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
+  config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers )
 
   # Force all environments to use the same logger level 
   # (by default production uses :info, the others :debug)
--- a/config/environments/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/environments/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/config/environments
 http://redmine.rubyforge.org/svn
 
--- a/config/initializers/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/initializers/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4752/trunk/config/initializers
+/svn/!svn/ver/4904/trunk/config/initializers
 END
 inflections.rb
 K 25
@@ -19,7 +19,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/4516/trunk/config/initializers/10-patches.rb
+/svn/!svn/ver/4904/trunk/config/initializers/10-patches.rb
 END
 backtrace_silencers.rb
 K 25
--- a/config/initializers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/initializers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/config/initializers
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-23T10:22:00.456857Z
-4752
+2011-02-21T11:02:18.659691Z
+4904
 jplang
 has-props
 
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-e83154f604f9f3b0307e1b435f9cc95c
-2010-12-17T08:34:29.830642Z
-4516
+2011-03-03T11:40:18.000000Z
+17f5c9eadec957cb8fb2b6d1f07b61ae
+2011-02-21T11:02:18.659691Z
+4904
 jplang
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-3149
+2907
 
 backtrace_silencers.rb
 file
--- a/config/initializers/.svn/text-base/10-patches.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/initializers/.svn/text-base/10-patches.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -79,16 +79,12 @@
 
 ActionMailer::Base.send :include, AsynchronousMailer
 
-# TODO: Hack to support i18n 4.x on Rails 2.3.5.  Remove post 2.3.6.
-# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
-module I18n
-  module Backend
-    module Base
-      def warn_syntax_deprecation!(*args)
-        return if @skip_syntax_deprecation
-        warn "The {{key}} interpolation syntax in I18n messages is deprecated and will be removed in Redmine 1.2. Please use %{key} instead, see http://www.redmine.org/issues/7013 for more information."
-        @skip_syntax_deprecation = true
-      end
+# TMail::Unquoter.convert_to_with_fallback_on_iso_8859_1 introduced in TMail 1.2.7
+# triggers a test failure in test_add_issue_with_japanese_keywords(MailHandlerTest)
+module TMail
+  class Unquoter
+    class << self
+      alias_method :convert_to, :convert_to_without_fallback_on_iso_8859_1
     end
   end
 end
--- a/config/initializers/10-patches.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/initializers/10-patches.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -79,16 +79,12 @@
 
 ActionMailer::Base.send :include, AsynchronousMailer
 
-# TODO: Hack to support i18n 4.x on Rails 2.3.5.  Remove post 2.3.6.
-# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
-module I18n
-  module Backend
-    module Base
-      def warn_syntax_deprecation!(*args)
-        return if @skip_syntax_deprecation
-        warn "The {{key}} interpolation syntax in I18n messages is deprecated and will be removed in Redmine 1.2. Please use %{key} instead, see http://www.redmine.org/issues/7013 for more information."
-        @skip_syntax_deprecation = true
-      end
+# TMail::Unquoter.convert_to_with_fallback_on_iso_8859_1 introduced in TMail 1.2.7
+# triggers a test failure in test_add_issue_with_japanese_keywords(MailHandlerTest)
+module TMail
+  class Unquoter
+    class << self
+      alias_method :convert_to, :convert_to_without_fallback_on_iso_8859_1
     end
   end
 end
--- a/config/locales/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,263 +1,269 @@
 K 25
 svn:wc:ra_dav:version-url
 V 39
-/svn/!svn/ver/4799/trunk/config/locales
+/svn/!svn/ver/4955/trunk/config/locales
 END
 lt.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/lt.yml
+/svn/!svn/ver/4955/trunk/config/locales/lt.yml
 END
 sr-YU.yml
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4752/trunk/config/locales/sr-YU.yml
+/svn/!svn/ver/4955/trunk/config/locales/sr-YU.yml
 END
 ro.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/ro.yml
+/svn/!svn/ver/4955/trunk/config/locales/ro.yml
 END
 lv.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/lv.yml
+/svn/!svn/ver/4955/trunk/config/locales/lv.yml
 END
 zh.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/zh.yml
+/svn/!svn/ver/4955/trunk/config/locales/zh.yml
 END
 pt.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/pt.yml
+/svn/!svn/ver/4955/trunk/config/locales/pt.yml
 END
 ca.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/ca.yml
+/svn/!svn/ver/4955/trunk/config/locales/ca.yml
 END
 pt-BR.yml
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4752/trunk/config/locales/pt-BR.yml
+/svn/!svn/ver/4955/trunk/config/locales/pt-BR.yml
 END
 tr.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/tr.yml
+/svn/!svn/ver/4955/trunk/config/locales/tr.yml
 END
 ru.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/ru.yml
+/svn/!svn/ver/4955/trunk/config/locales/ru.yml
 END
 en-GB.yml
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4752/trunk/config/locales/en-GB.yml
+/svn/!svn/ver/4955/trunk/config/locales/en-GB.yml
 END
 id.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/id.yml
+/svn/!svn/ver/4955/trunk/config/locales/id.yml
 END
 el.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/el.yml
+/svn/!svn/ver/4955/trunk/config/locales/el.yml
 END
 en.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/en.yml
+/svn/!svn/ver/4954/trunk/config/locales/en.yml
 END
 gl.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/gl.yml
+/svn/!svn/ver/4955/trunk/config/locales/gl.yml
 END
 cs.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4777/trunk/config/locales/cs.yml
+/svn/!svn/ver/4955/trunk/config/locales/cs.yml
+END
+mk.yml
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4955/trunk/config/locales/mk.yml
 END
 es.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/es.yml
+/svn/!svn/ver/4955/trunk/config/locales/es.yml
 END
-mk.yml
+ko.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/mk.yml
+/svn/!svn/ver/4955/trunk/config/locales/ko.yml
+END
+eu.yml
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4955/trunk/config/locales/eu.yml
 END
 zh-TW.yml
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4752/trunk/config/locales/zh-TW.yml
-END
-eu.yml
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/4752/trunk/config/locales/eu.yml
-END
-ko.yml
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/4752/trunk/config/locales/ko.yml
+/svn/!svn/ver/4955/trunk/config/locales/zh-TW.yml
 END
 mn.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/mn.yml
+/svn/!svn/ver/4955/trunk/config/locales/mn.yml
 END
 it.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/it.yml
+/svn/!svn/ver/4955/trunk/config/locales/it.yml
 END
 sk.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/sk.yml
+/svn/!svn/ver/4955/trunk/config/locales/sk.yml
 END
 sl.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/sl.yml
+/svn/!svn/ver/4955/trunk/config/locales/sl.yml
 END
 uk.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/uk.yml
+/svn/!svn/ver/4955/trunk/config/locales/uk.yml
+END
+da.yml
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4955/trunk/config/locales/da.yml
 END
 sr.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/sr.yml
+/svn/!svn/ver/4955/trunk/config/locales/sr.yml
 END
-da.yml
+fa.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/da.yml
+/svn/!svn/ver/4955/trunk/config/locales/fa.yml
+END
+sv.yml
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4955/trunk/config/locales/sv.yml
+END
+bg.yml
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/!svn/ver/4955/trunk/config/locales/bg.yml
 END
 de.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/de.yml
-END
-bg.yml
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/4777/trunk/config/locales/bg.yml
-END
-sv.yml
-K 25
-svn:wc:ra_dav:version-url
-V 46
-/svn/!svn/ver/4777/trunk/config/locales/sv.yml
+/svn/!svn/ver/4955/trunk/config/locales/de.yml
 END
 ja.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/ja.yml
+/svn/!svn/ver/4955/trunk/config/locales/ja.yml
 END
 he.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/he.yml
+/svn/!svn/ver/4955/trunk/config/locales/he.yml
 END
 fi.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/fi.yml
+/svn/!svn/ver/4955/trunk/config/locales/fi.yml
 END
 bs.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/bs.yml
+/svn/!svn/ver/4955/trunk/config/locales/bs.yml
 END
 fr.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4799/trunk/config/locales/fr.yml
+/svn/!svn/ver/4954/trunk/config/locales/fr.yml
 END
 nl.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/nl.yml
+/svn/!svn/ver/4955/trunk/config/locales/nl.yml
 END
 hr.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/hr.yml
+/svn/!svn/ver/4955/trunk/config/locales/hr.yml
 END
 pl.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/pl.yml
+/svn/!svn/ver/4955/trunk/config/locales/pl.yml
 END
 th.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/th.yml
+/svn/!svn/ver/4955/trunk/config/locales/th.yml
 END
 no.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/no.yml
+/svn/!svn/ver/4955/trunk/config/locales/no.yml
 END
 hu.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/hu.yml
+/svn/!svn/ver/4955/trunk/config/locales/hu.yml
 END
 vi.yml
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4752/trunk/config/locales/vi.yml
+/svn/!svn/ver/4955/trunk/config/locales/vi.yml
 END
--- a/config/locales/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/config/locales
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-06T00:31:15.026336Z
-4799
-jbbarth
+2011-02-27T13:43:18.863191Z
+4955
+jplang
 
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-1e812b47384d7d6aa8750e651a89e331
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+3542e97eeeee34df7a3d6d64a4ce0407
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -58,7 +58,7 @@
 
 
 
-43746
+44029
 
 sr-YU.yml
 file
@@ -66,10 +66,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-db716c4c1e941ae3c3bc180ae85e916a
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+b05d928becf91c52a78271c93715bb1b
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 
 
@@ -92,7 +92,7 @@
 
 
 
-42012
+42299
 
 ro.yml
 file
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-df4dee9e336fec2bce64b46a93ef8a7a
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+dd9fb4aae0fa69165e4f4e1100c3fa26
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-40134
+40417
 
 lv.yml
 file
@@ -134,10 +134,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-09cfeb6fef2159b9fbf3bd4524edccd9
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+12f9b4e9c849923a86334f56fbb65f1a
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 
 
@@ -160,7 +160,7 @@
 
 
 
-42018
+42305
 
 zh.yml
 file
@@ -168,10 +168,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-35aefadc95299e046c84e7926f2f1723
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+dde46f425abed5caa3d8d3afe9049fb7
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -194,7 +194,7 @@
 
 
 
-38020
+38303
 
 pt.yml
 file
@@ -202,10 +202,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-de7cca7c956cb960bccd7ee0bd7e642c
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+017dbb90319bfa26bab5a45296b337b3
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -228,7 +228,7 @@
 
 
 
-41494
+41777
 
 ca.yml
 file
@@ -236,10 +236,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-f941e4e9bed4572927ca14fc9b5db1d4
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+55d3137cb8850d53bce7337a8a0cf720
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -262,7 +262,7 @@
 
 
 
-41943
+42226
 
 pt-BR.yml
 file
@@ -270,10 +270,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-7b6ebad52c9d0618e170f88c4eca6fe9
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+0714d61f3439e9e8058f26487eae91b2
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -296,7 +296,7 @@
 
 
 
-41378
+41661
 
 tr.yml
 file
@@ -304,10 +304,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-062568e14381f3e5c1ff9c46734d1063
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+5bc442cb54c4373e1aeea7dd56e30bd0
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -330,7 +330,7 @@
 
 
 
-40012
+40295
 
 ru.yml
 file
@@ -338,10 +338,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-82062fb3f39efa9416604ee0086d6d2b
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+6a3741281160ebb7f27f6d2bb03499c8
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -364,7 +364,7 @@
 
 
 
-61841
+62124
 
 en-GB.yml
 file
@@ -372,10 +372,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-21131080b52818c183c04114fbdd21c0
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+831604fd1ce5d6f72e64688ce6f62581
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 
 
@@ -398,7 +398,7 @@
 
 
 
-39398
+39685
 
 id.yml
 file
@@ -406,10 +406,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-5aafb5ad42703467a8bf10a77cf3958a
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+eb45d7f2bc3d3e7fd8ab01db1a3041a4
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -432,7 +432,7 @@
 
 
 
-39754
+40037
 
 el.yml
 file
@@ -440,10 +440,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-2ba957266ab2a72f1e4bdc00fb0ee9ce
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+98b4f21cce1a0242221eecb23f5fc727
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -466,7 +466,7 @@
 
 
 
-54862
+55145
 
 en.yml
 file
@@ -474,10 +474,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-50978718f7db9428b3b910da54af546a
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+4265d626f893cc08f2142d0a254e2ac7
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -500,7 +500,7 @@
 
 
 
-38500
+38787
 
 gl.yml
 file
@@ -508,10 +508,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-8fac2d7a543f4e07eb26e778a392ab83
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+03aa773b8d01d5bc421b8896fc9c861b
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -534,7 +534,7 @@
 
 
 
-40612
+40895
 
 cs.yml
 file
@@ -542,10 +542,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-a15ce6ead8e1c43eb12d222e7e849d5d
-2011-01-30T06:37:01.341578Z
-4777
+2011-03-03T11:40:18.000000Z
+85ac61a4067ad6dda83d43acbf874cf6
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -568,7 +568,41 @@
 
 
 
-41339
+41752
+
+mk.yml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+626a66d6d98190418f4a4fd43077734f
+2011-02-27T13:43:18.863191Z
+4955
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+49418
 
 es.yml
 file
@@ -576,10 +610,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-470913ee31919fc90e22b02279afd420
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+6ef7d2fb0af3cce0f6afbdea3ff9ab17
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -602,41 +636,75 @@
 
 
 
-43387
+43670
 
-mk.yml
+ko.yml
 file
 
 
 
 
-2011-03-03T11:05:22.000000Z
-337151da51a475b6b324ea679c3a6c99
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+1ff250f0b17ecb9465add49dfcf9bb91
+2011-02-27T13:43:18.863191Z
+4955
 jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-49131
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+44501
+
+eu.yml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+b3ba93d14600b4b992e65fbd243759ae
+2011-02-27T13:43:18.863191Z
+4955
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+42568
 
 zh-TW.yml
 file
@@ -644,10 +712,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-368fbd4de15eedcb2cf543e167873bbd
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+f4c6a612b84e5087ed4d023414dab628
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -670,75 +738,7 @@
 
 
 
-42325
-
-eu.yml
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-32206bce9083c739e3f31d8ebb56281c
-2011-01-23T10:22:00.456857Z
-4752
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-42081
-
-ko.yml
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-95bb162d82a614c7841b2ea67e611e2b
-2011-01-23T10:22:00.456857Z
-4752
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-44218
+42608
 
 mn.yml
 file
@@ -746,10 +746,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-417e9edec50ef31110f08242550b56a6
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+b9e2987cb3cbaab826c7388d09b74f75
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 
 
@@ -772,7 +772,7 @@
 
 
 
-53795
+54082
 
 it.yml
 file
@@ -780,10 +780,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-fe7dc689acbe010599427d2d39ac2b44
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+f80f107e4d9318b8a8cea65b2e13d579
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -806,7 +806,7 @@
 
 
 
-41153
+41436
 
 sk.yml
 file
@@ -814,10 +814,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-c25656ed7510655eac11f735078dbbaa
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+e7901c1e26424f863f96dd86164419c2
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -840,7 +840,7 @@
 
 
 
-41404
+41687
 
 sl.yml
 file
@@ -848,10 +848,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-f9e69eb1031ca6a4030cd909ced54a64
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+808c04baadb112b6be492be9dc78ef89
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -874,7 +874,7 @@
 
 
 
-39580
+39863
 
 uk.yml
 file
@@ -882,10 +882,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-b5de0b39a465690bc9610247e0d9e0eb
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+430d26c543f2d9d31ffe77c9ef3eb4f8
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -908,7 +908,41 @@
 
 
 
-47158
+47441
+
+da.yml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+a7ae693463d0d34fb5fd212ccbda0aff
+2011-02-27T13:43:18.863191Z
+4955
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+39983
 
 sr.yml
 file
@@ -916,10 +950,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-d8e8a44113f74ae664adee4f222daf97
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+adf2619297b8e142957c327c6a76c786
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -942,18 +976,18 @@
 
 
 
-54272
+54555
 
-da.yml
+fa.yml
 file
 
 
 
 
-2011-03-03T11:05:22.000000Z
-43a7a9f5e9140fad4fb52765b0fdba1f
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+6f585dcad4e6b03d987ea0f5e7d7e91f
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -976,7 +1010,75 @@
 
 
 
-39700
+51085
+
+bg.yml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+e0df426fe104bb05be553a362f46610b
+2011-02-27T13:43:18.863191Z
+4955
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+54718
+
+de.yml
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+80e835963312388a9077a8f27452d429
+2011-02-27T13:43:18.863191Z
+4955
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+42574
 
 sv.yml
 file
@@ -984,10 +1086,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-699123d62eee4445faa28aa6d78b2335
-2011-01-30T06:37:01.341578Z
-4777
+2011-03-03T11:40:18.000000Z
+59f72f202281205f1ed729183db2a402
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1010,75 +1112,7 @@
 
 
 
-41897
-
-de.yml
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-b2d420fff7d056c16f09ef0a9779a6c7
-2011-01-23T10:22:00.456857Z
-4752
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-42291
-
-bg.yml
-file
-
-
-
-
-2011-03-03T11:05:22.000000Z
-e298699123f5bd3e5135a566c73503d6
-2011-01-30T06:37:01.341578Z
-4777
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-54276
+42180
 
 ja.yml
 file
@@ -1086,10 +1120,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-6b961e32a177d8d7ac8c2f7c88200470
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+03fac78c16fdf9c77069f24fec7b2796
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1112,7 +1146,7 @@
 
 
 
-45908
+46191
 
 he.yml
 file
@@ -1120,10 +1154,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-192584af3333c7080179fe5c20e434fc
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+03045c9539de31b255a14c9207fb8eaa
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1146,7 +1180,7 @@
 
 
 
-45150
+45433
 
 fi.yml
 file
@@ -1154,10 +1188,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-b445a97eaeefead5aa6370c4a1190a4f
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+18dd7ae78913bad4b75e0d5f16068290
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1180,7 +1214,7 @@
 
 
 
-40658
+40941
 
 bs.yml
 file
@@ -1188,10 +1222,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-010af5a5a5c3eb88d99ae0cea9938404
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+0fdc9e453941e547e3b40fee917fcf02
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1214,7 +1248,7 @@
 
 
 
-40595
+40878
 
 fr.yml
 file
@@ -1222,11 +1256,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-c501db7eeece8640d653e51824f5c7bc
-2011-02-06T00:31:15.026336Z
-4799
-jbbarth
+2011-03-03T11:40:18.000000Z
+95995431647aa0e13c850df4250a57d0
+2011-02-27T13:34:41.060565Z
+4954
+jplang
 has-props
 
 
@@ -1248,7 +1282,7 @@
 
 
 
-42750
+43081
 
 nl.yml
 file
@@ -1256,10 +1290,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-9a2c26c869400cc6efb11d75b2d06913
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+06358d3f035a3fcc20cde865e7295023
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1282,7 +1316,7 @@
 
 
 
-40150
+40433
 
 hr.yml
 file
@@ -1290,10 +1324,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-3599330a601c9bf8a264581c2dff951a
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+3fbb52f4fa0ba97dfd179ad0c8e020c3
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1316,7 +1350,7 @@
 
 
 
-40258
+40541
 
 pl.yml
 file
@@ -1324,10 +1358,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-aca80972219f7cccba37d3f54e1997fe
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+afca79760eefe54e70833751f3d9b0bb
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1350,7 +1384,7 @@
 
 
 
-42553
+42836
 
 th.yml
 file
@@ -1358,10 +1392,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-fe82ec83beaf4cc55f24063138e7c041
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+e9737687144c1c4fd63eacb68f2682f1
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1384,7 +1418,7 @@
 
 
 
-53018
+53301
 
 no.yml
 file
@@ -1392,10 +1426,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-be6384b9cabf8a8b0c510c0f5961a1dd
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+8fff009aa1fe3602b8b4dff6210f8497
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1418,7 +1452,7 @@
 
 
 
-38461
+38744
 
 hu.yml
 file
@@ -1426,10 +1460,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-c3c9231930da2b53136ec5ffe77e2cfe
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+5c2041121ebd0cd3bcf252d54e21786b
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1452,7 +1486,7 @@
 
 
 
-42985
+43268
 
 vi.yml
 file
@@ -1460,10 +1494,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-874e401921a349fe9688ab028461e0b2
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+37a28f575513649d20833ce31e5fce23
+2011-02-27T13:43:18.863191Z
+4955
 jplang
 has-props
 
@@ -1486,5 +1520,5 @@
 
 
 
-43553
+43836
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/locales/.svn/prop-base/fa.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- a/config/locales/.svn/text-base/bg.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/bg.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -303,6 +303,7 @@
   field_assigned_to_role: Assignee's role
   field_text: Текстово поле
   field_visible: Видим
+  field_warn_on_leaving_unsaved: Предупреди ме, когато напускам страница с незаписано съдържание
   
   setting_app_title: Заглавие
   setting_app_subtitle: Описание
@@ -594,6 +595,7 @@
   label_query: Потребителска справка
   label_query_plural: Потребителски справки
   label_query_new: Нова заявка
+  label_my_queries: Моите заявки
   label_filter_add: Добави филтър
   label_filter_plural: Филтри
   label_equals: е
@@ -908,6 +910,7 @@
   text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?"
   text_zoom_in: Увеличаване
   text_zoom_out: Намаляване
+  text_warn_on_leaving_unsaved: Страницата съдържа незаписано съдържание, което може да бъде загубено, ако я напуснете.
 
   default_role_manager: Мениджър
   default_role_developer: Разработчик
@@ -936,3 +939,4 @@
   enumeration_activities: Дейности (time tracking)
   enumeration_system_activity: Системна активност
 
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/bs.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/bs.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -950,3 +950,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/ca.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/ca.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -939,3 +939,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/cs.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/cs.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,4 +1,9 @@
+# Update to 1.1 by Michal Gebauer <mishak@mishak.net>
+# Updated by Josef Liška <jl@chl.cz>
+# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
+# Based on original CZ translation by Jan Kadleček
 cs:
+  # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
   direction: ltr
   date:
     formats:
@@ -26,7 +31,7 @@
       long: "%B %d, %Y %H:%M"
     am: "dop."
     pm: "odp."
-    
+      
   datetime:
     distance_in_words:
       half_a_minute: "půl minuty"
@@ -65,24 +70,26 @@
         other: "téměř %{count} roky"
 
   number:
+    # Výchozí formát pro čísla
     format:
-      separator: "."
+      separator: "." 
       delimiter: ""
       precision: 3
-    human: 
-      format: 
+    human:
+      format:
+        delimiter: ""
         precision: 1
-        delimiter: ""
-      storage_units: 
+      storage_units:
         format: "%n %u"
-        units: 
-          kb: KB
-          tb: TB
-          gb: GB
-          byte: 
-            one: Byte
-            other: Bytes
-          mb: MB
+        units:
+          byte:
+            one: "Bajt"
+            other: "Bajtů"
+          kb: "kB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
+
         
 # Used in array.to_sentence.
   support:
@@ -94,8 +101,8 @@
     errors:
       template:
         header:
-          one:    "1 error prohibited this %{model} from being saved"
-          other:  "%{count} errors prohibited this %{model} from being saved"
+          one:    "1 chyba zabránila uložení %{model}"
+          other:  "%{count} chyb zabránilo uložení %{model}"
       messages:
         inclusion: "není zahrnuto v seznamu"
         exclusion: "je rezervováno"
@@ -122,10 +129,6 @@
         circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
         cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
 
-  # Updated by Josef Liška <jl@chl.cz>
-  # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
-  # Based on original CZ translation by Jan Kadleček
-  
   actionview_instancetag_blank_option: Prosím vyberte
   
   general_text_No: 'Ne'
@@ -154,20 +157,40 @@
   notice_successful_connection: Úspěšné připojení.
   notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
   notice_locking_conflict: Údaje byly změněny jiným uživatelem.
-  notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři.
   notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
+  notice_not_authorized_archived_project: Projekt ke kterému se snažíte přistupovat byl archivován.
   notice_email_sent: "Na adresu %{value} byl odeslán email"
   notice_email_error: "Při odesílání emailu nastala chyba (%{value})"
   notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
+  notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
   notice_failed_to_save_issues: "Chyba při uložení %{count} úkolu(ů) z %{total} vybraných: %{ids}."
+  notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}."
   notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
   notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
   notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
+  notice_unable_delete_version: Nemohu odstanit verzi
+  notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
+  notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
+  notice_gantt_chart_truncated: Graf byl oříznut, počet položek přesáhl limit pro zobrazení (%{max})
   
   error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: %{value}"
   error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři."
   error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: %{value}"
+  error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
   error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
+  error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
+  error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
+  error_can_not_delete_custom_field: Nelze smazat volitelné pole
+  error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
+  error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
+  error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
+  error_can_not_archive_project: Tento projekt nemůže být archivován
+  error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
+  error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
+  error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
+  error_unable_delete_issue_status: Nelze smazat stavy úkolů
+  error_unable_to_connect: Nelze se připojit (%{value})
+  warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit."
   
   mail_subject_lost_password: "Vaše heslo (%{value})"
   mail_body_lost_password: 'Pro změnu vašeho hesla klikněte na následující odkaz:'
@@ -177,6 +200,12 @@
   mail_body_account_information: Informace o vašem účtu
   mail_subject_account_activation_request: "Aktivace %{value} účtu"
   mail_body_account_activation_request: "Byl zaregistrován nový uživatel %{value}. Aktivace jeho účtu závisí na vašem potvrzení."
+  mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})"
+  mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několik dní (%{days}):"
+  mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána"
+  mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}."
+  mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována"
+  mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}."
   
   gui_validation_error: 1 chyba
   gui_validation_error_plural: "%{count} chyb(y)"
@@ -216,6 +245,7 @@
   field_priority: Priorita
   field_fixed_version: Cílová verze
   field_user: Uživatel
+  field_principal: Hlavní
   field_role: Role
   field_homepage: Domovská stránka
   field_is_public: Veřejný
@@ -260,10 +290,23 @@
   field_redirect_existing_links: Přesměrovat stvávající odkazy
   field_estimated_hours: Odhadovaná doba
   field_column_names: Sloupce
+  field_time_entries: Zaznamenaný čas
   field_time_zone: Časové pásmo
   field_searchable: Umožnit vyhledávání
   field_default_value: Výchozí hodnota
   field_comments_sorting: Zobrazit komentáře
+  field_parent_title: Rodičovská stránka
+  field_editable: Editovatelný
+  field_watcher: Sleduje
+  field_identity_url: OpenID URL
+  field_content: Obsah
+  field_group_by: Seskupovat výsledky podle
+  field_sharing: Sdílení
+  field_parent_issue: Rodičovský úkol
+  field_member_of_group: Skupina přiřaditele
+  field_assigned_to_role: Role přiřaditele
+  field_text: Textové pole
+  field_visible: Viditelný
   
   setting_app_title: Název aplikace
   setting_app_subtitle: Podtitulek aplikace
@@ -275,6 +318,7 @@
   setting_issues_export_limit: Limit pro export úkolů
   setting_mail_from: Odesílat emaily z adresy
   setting_bcc_recipients: Příjemci skryté kopie (bcc)
+  setting_plain_text_mail: pouze prostý text (ne HTML)
   setting_host_name: Jméno serveru
   setting_text_formatting: Formátování textu
   setting_wiki_compression: Komprese historie Wiki
@@ -290,12 +334,94 @@
   setting_cross_project_issue_relations: Povolit vazby úkolů napříč projekty
   setting_issue_list_default_columns: Výchozí sloupce zobrazené v seznamu úkolů
   setting_repositories_encodings: Kódování 
+  setting_commit_logs_encoding: Kódování zpráv při commitu
+  setting_emails_header: Hlavička emailů
   setting_emails_footer: Patička emailů
   setting_protocol: Protokol
   setting_per_page_options: Povolené počty řádků na stránce
   setting_user_format: Formát zobrazení uživatele
   setting_activity_days_default: Dny zobrazené v činnosti projektu
   setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu
+  setting_enabled_scm: Povolené SCM
+  setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
+  setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily
+  setting_mail_handler_api_key: API klíč
+  setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů
+  setting_gravatar_enabled: Použít uživatelské ikony Gravatar
+  setting_gravatar_default: Výchozí Gravatar
+  setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
+  setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce
+  setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru
+  setting_openid: Umožnit přihlašování a registrace s OpenID
+  setting_password_min_length: Minimální délka hesla
+  setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
+  setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
+  setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
+  setting_issue_done_ratio_issue_field: Použít pole úkolu
+  setting_issue_done_ratio_issue_status: Použít stav úkolu
+  setting_start_of_week: Začínat kalendáře
+  setting_rest_api_enabled: Zapnout službu REST
+  setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
+  setting_default_notification_option: Výchozí nastavení oznámení
+  setting_commit_logtime_enabled: Povolit zapisování času
+  setting_commit_logtime_activity_id: Aktivita pro zapsaný čas
+  setting_gantt_items_limit: Maximální počet položek zobrazený na ganttově grafu
+  
+  permission_add_project: Vytvořit projekt
+  permission_add_subprojects: Vytvořit podprojekty
+  permission_edit_project: Úprava projektů
+  permission_select_project_modules: Výběr modulů projektu
+  permission_manage_members: Spravování členství
+  permission_manage_project_activities: Spravovat aktivity projektu
+  permission_manage_versions: Spravování verzí
+  permission_manage_categories: Spravování kategorií úkolů
+  permission_view_issues: Zobrazit úkoly
+  permission_add_issues: Přidávání úkolů
+  permission_edit_issues: Upravování úkolů
+  permission_manage_issue_relations: Spravování vztahů mezi úkoly
+  permission_add_issue_notes: Přidávání poznámek
+  permission_edit_issue_notes: Upravování poznámek
+  permission_edit_own_issue_notes: Upravování vlastních poznámek
+  permission_move_issues: Přesouvání úkolů
+  permission_delete_issues: Mazání úkolů
+  permission_manage_public_queries: Správa veřejných dotazů
+  permission_save_queries: Ukládání dotazů
+  permission_view_gantt: Zobrazené Ganttova diagramu
+  permission_view_calendar: Prohlížení kalendáře
+  permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
+  permission_add_issue_watchers: Přidání sledujících uživatelů
+  permission_delete_issue_watchers: Smazat přihlížející
+  permission_log_time: Zaznamenávání stráveného času
+  permission_view_time_entries: Zobrazení stráveného času
+  permission_edit_time_entries: Upravování záznamů o stráveném času
+  permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase
+  permission_manage_news: Spravování novinek
+  permission_comment_news: Komentování novinek
+  permission_manage_documents: Správa dokumentů
+  permission_view_documents: Prohlížení dokumentů
+  permission_manage_files: Spravování souborů
+  permission_view_files: Prohlížení souborů
+  permission_manage_wiki: Spravování Wiki
+  permission_rename_wiki_pages: Přejmenovávání Wiki stránek
+  permission_delete_wiki_pages: Mazání stránek na Wiki
+  permission_view_wiki_pages: Prohlížení Wiki
+  permission_view_wiki_edits: Prohlížení historie Wiki
+  permission_edit_wiki_pages: Upravování stránek Wiki
+  permission_delete_wiki_pages_attachments: Mazání příloh
+  permission_protect_wiki_pages: Zabezpečení Wiki stránek
+  permission_manage_repository: Spravování repozitáře
+  permission_browse_repository: Procházení repozitáře
+  permission_view_changesets: Zobrazování sady změn
+  permission_commit_access: Commit přístup
+  permission_manage_boards: Správa diskusních fór
+  permission_view_messages: Prohlížení zpráv
+  permission_add_messages: Posílání zpráv
+  permission_edit_messages: Upravování zpráv
+  permission_edit_own_messages: Upravit vlastní zprávy
+  permission_delete_messages: Mazání zpráv
+  permission_delete_own_messages: Smazat vlastní zprávy
+  permission_export_wiki_pages: Exportovat Wiki stránky
+  permission_manage_subtasks: Spravovat podúkoly
   
   project_module_issue_tracking: Sledování úkolů
   project_module_time_tracking: Sledování času
@@ -305,10 +431,13 @@
   project_module_wiki: Wiki
   project_module_repository: Repozitář
   project_module_boards: Diskuse
+  project_module_calendar: Kalendář
+  project_module_gantt: Gantt
   
   label_user: Uživatel
   label_user_plural: Uživatelé
   label_user_new: Nový uživatel
+  label_user_anonymous: Anonymní
   label_project: Projekt
   label_project_new: Nový projekt
   label_project_plural: Projekty
@@ -355,11 +484,13 @@
   label_information_plural: Informace
   label_please_login: Prosím přihlašte se
   label_register: Registrovat
+  label_login_with_open_id_option: nebo se přihlašte s OpenID
   label_password_lost: Zapomenuté heslo
   label_home: Úvodní
   label_my_page: Moje stránka
   label_my_account: Můj účet
   label_my_projects: Moje projekty
+  label_my_page_block: Bloky na mé stránce
   label_administration: Administrace
   label_login: Přihlášení
   label_logout: Odhlášení
@@ -370,6 +501,7 @@
   label_registered_on: Registrován
   label_activity: Aktivita
   label_overall_activity: Celková aktivita
+  label_user_activity: "Aktivita uživatele: %{value}"
   label_new: Nový
   label_logged_as: Přihlášen jako
   label_environment: Prostředí
@@ -378,6 +510,8 @@
   label_auth_source_new: Nový mód autentifikace
   label_auth_source_plural: Módy autentifikace
   label_subproject_plural: Podprojekty
+  label_subproject_new: Nový podprojekt
+  label_and_its_subprojects: "%{value} a jeho  podprojekty"
   label_min_max_length: Min - Max délka
   label_list: Seznam
   label_date: Datum
@@ -411,6 +545,7 @@
   label_version: Verze
   label_version_new: Nová verze
   label_version_plural: Verze
+  label_close_versions: Zavřít dokončené verze
   label_confirmation: Potvrzení
   label_export_to: 'Také k dispozici:'
   label_read: Načítá se...
@@ -469,6 +604,8 @@
   label_not_equals: není
   label_in_less_than: je měší než
   label_in_more_than: je větší než
+  label_greater_or_equal: '>='
+  label_less_or_equal: '<='
   label_in: v
   label_today: dnes
   label_all_time: vše
@@ -491,15 +628,21 @@
   label_browse: Procházet
   label_modification: "%{count} změna"
   label_modification_plural: "%{count} změn"
+  label_branch: Větev
+  label_tag: Tag
   label_revision: Revize
   label_revision_plural: Revizí
+  label_revision_id: "Revize %{value}"
   label_associated_revisions: Související verze
   label_added: přidáno
   label_modified: změněno
+  label_copied: zkopírováno
+  label_renamed: přejmenováno
   label_deleted: odstraněno
   label_latest_revision: Poslední revize
   label_latest_revision_plural: Poslední revize
   label_view_revisions: Zobrazit revize
+  label_view_all_revisions: Zobrazit všechny revize
   label_max_size: Maximální velikost
   label_sort_highest: Přesunout na začátek
   label_sort_higher: Přesunout nahoru
@@ -525,6 +668,7 @@
   label_changes_details: Detail všech změn
   label_issue_tracking: Sledování úkolů
   label_spent_time: Strávený čas
+  label_overall_spent_time: Celkem strávený čas
   label_f_hour: "%{value} hodina"
   label_f_hour_plural: "%{value} hodin"
   label_time_tracking: Sledování času
@@ -545,7 +689,8 @@
   label_relation_new: Nová souvislost
   label_relation_delete: Odstranit souvislost
   label_relates_to: související s
-  label_duplicates: duplicity
+  label_duplicates: duplikuje
+  label_duplicated_by: zduplikován
   label_blocks: blokuje
   label_blocked_by: zablokován
   label_precedes: předchází
@@ -561,6 +706,8 @@
   label_board: Fórum
   label_board_new: Nové fórum
   label_board_plural: Fóra
+  label_board_locked: Uzamčeno
+  label_board_sticky: Nálepka
   label_topic_plural: Témata
   label_message_plural: Zprávy
   label_message_last: Poslední zpráva
@@ -576,9 +723,12 @@
   label_language_based: Podle výchozího jazyku
   label_sort_by: "Seřadit podle %{value}"
   label_send_test_email: Poslat testovací email
+  label_feeds_access_key: Přístupový klíč pro RSS
+  label_missing_feeds_access_key: Postrádá přístupový klíč pro RSS
   label_feeds_access_key_created_on: "Přístupový klíč pro RSS byl vytvořen před %{value}"
   label_module_plural: Moduly
   label_added_time_by: "Přidáno uživatelem %{author} před %{age}"
+  label_updated_time_by: "Aktualizováno uživatelem %{author} před %{age}"
   label_updated_time: "Aktualizováno před %{value}"
   label_jump_to_a_project: Vyberte projekt...
   label_file_plural: Soubory
@@ -591,6 +741,10 @@
   label_search_titles_only: Vyhledávat pouze v názvech
   label_user_mail_option_all: "Pro všechny události všech mých projektů"
   label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
+  label_user_mail_option_none: "Žádné události"
+  label_user_mail_option_only_my_events: "Jen pro věci co sleduji nebo jsem v nich zapojen"
+  label_user_mail_option_only_assigned: "Jen pro všeci kterým sem přiřazen"
+  label_user_mail_option_only_owner: "Jen pro věci které vlastním"
   label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách"
   label_registration_activation_by_email: aktivace účtu emailem
   label_registration_manual_activation: manuální aktivace účtu
@@ -609,6 +763,40 @@
   label_preferences: Nastavení
   label_chronological_order: V chronologickém pořadí
   label_reverse_chronological_order: V obrácaném chronologickém pořadí
+  label_planning: Plánování
+  label_incoming_emails: Příchozí e-maily
+  label_generate_key: Generovat klíč
+  label_issue_watchers: Sledování
+  label_example: Příklad
+  label_display: Zobrazit
+  label_sort: Řazení
+  label_ascending: Vzestupně
+  label_descending: Sestupně
+  label_date_from_to: Od %{start} do %{end}
+  label_wiki_content_added: Wiki stránka přidána
+  label_wiki_content_updated: Wiki stránka aktualizována
+  label_group: Skupina
+  label_group_plural: Skupiny
+  label_group_new: Nová skupina
+  label_time_entry_plural: Strávený čas
+  label_version_sharing_none: Nesdíleno
+  label_version_sharing_descendants: S podprojekty
+  label_version_sharing_hierarchy: S hierarchií projektu
+  label_version_sharing_tree: Se stromem projektu
+  label_version_sharing_system: Se všemi projekty
+  label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
+  label_copy_source: Zdroj
+  label_copy_target: Cíl
+  label_copy_same_as_target: Stejný jako cíl
+  label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
+  label_api_access_key: API přístupový klíč
+  label_missing_api_access_key: Chybějící přístupový klíč API
+  label_api_access_key_created_on: API přístupový klíč vytvořen %{value} 
+  label_profile: Profil
+  label_subtask_plural: Podúkol
+  label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
+  label_principal_search: "Hledat uživatele nebo skupinu:"
+  label_user_search: "Hledat uživatele:"
   
   button_login: Přihlásit
   button_submit: Potvrdit
@@ -617,8 +805,10 @@
   button_uncheck_all: Odšrtnout vše
   button_delete: Odstranit
   button_create: Vytvořit
-  button_test: Test
+  button_create_and_continue: Vytvořit a pokračovat
+  button_test: Testovat
   button_edit: Upravit
+  button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}"
   button_add: Přidat
   button_change: Změnit
   button_apply: Použít
@@ -629,6 +819,7 @@
   button_list: Vypsat
   button_view: Zobrazit
   button_move: Přesunout
+  button_move_and_follow: Přesunout a následovat
   button_back: Zpět
   button_cancel: Storno
   button_activate: Aktivovat
@@ -640,24 +831,40 @@
   button_reply: Odpovědět
   button_archive: Archivovat
   button_unarchive: Odarchivovat
-  button_reset: Reset
+  button_reset: Resetovat
   button_rename: Přejmenovat
   button_change_password: Změnit heslo
   button_copy: Kopírovat
+  button_copy_and_follow: Kopírovat a následovat
   button_annotate: Komentovat
   button_update: Aktualizovat
   button_configure: Konfigurovat
+  button_quote: Citovat
+  button_duplicate: Duplikát
+  button_show: Zobrazit
   
   status_active: aktivní
   status_registered: registrovaný
   status_locked: uzamčený
   
+  version_status_open: otevřený
+  version_status_locked: uzamčený
+  version_status_closed: zavřený
+  
+  field_active: Aktivní
+  
   text_select_mail_notifications: Vyberte akci při které bude zasláno upozornění emailem.
   text_regexp_info: např. ^[A-Z0-9]+$
   text_min_max_length_info: 0 znamená bez limitu
   text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
+  text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány."
   text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
   text_are_you_sure: Jste si jisti?
+  text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
+  text_journal_changed: "%{label} změněn z %{old} na %{new}"
+  text_journal_set_to: "%{label} nastaven na %{value}"
+  text_journal_deleted: "%{label} smazán (%{old})"
+  text_journal_added: "%{label} %{value} přidán"
   text_tip_issue_begin_day: úkol začíná v tento den
   text_tip_issue_end_day: úkol končí v tento den
   text_tip_issue_begin_end_day: úkol začíná a končí v tento den
@@ -668,6 +875,7 @@
   text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce
   text_unallowed_characters: Nepovolené znaky
   text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
+  text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
   text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů
   text_issue_added: "Úkol %{id} byl vytvořen uživatelem %{author}."
   text_issue_updated: "Úkol %{id} byl aktualizován uživatelem %{author}."
@@ -679,15 +887,31 @@
   text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit"
   text_load_default_configuration: Nahrát výchozí konfiguraci
   text_status_changed_by_changeset: "Použito v changesetu %{value}."
+  text_time_logged_by_changeset: Aplikováno v changesetu %{value}.
   text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
   text_select_project_modules: 'Aktivní moduly v tomto projektu:'
   text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
   text_file_repository_writable: Povolen zápis do adresáře ukládání souborů
+  text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
   text_rmagick_available: RMagick k dispozici (volitelné)
   text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno %{hours} práce. Co chete udělat?"
   text_destroy_time_entries: Odstranit evidované hodiny.
   text_assign_time_entries_to_project: Přiřadit evidované hodiny projektu
   text_reassign_time_entries: 'Přeřadit evidované hodiny k tomuto úkolu:'
+  text_user_wrote: "%{value} napsal:"
+  text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě."
+  text_enumeration_category_reassign_to: 'Přeřadit je do této:'
+  text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/email.yml a restartujte aplikaci."
+  text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
+  text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
+  text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
+  text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat?
+  text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
+  text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
+  text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
+  text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?"
+  text_zoom_in: Přiblížit
+  text_zoom_out: Oddálit
   
   default_role_manager: Manažer
   default_role_developer: Vývojář
@@ -714,225 +938,9 @@
   enumeration_issue_priorities: Priority úkolů
   enumeration_doc_categories: Kategorie dokumentů
   enumeration_activities: Aktivity (sledování času)
-  error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
-  label_planning: Plánování
-  text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány."
-  label_and_its_subprojects: "%{value} a jeho  podprojekty"
-  mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několik dní (%{days}):"
-  mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})"
-  text_user_wrote: "%{value} napsal:"
-  label_duplicated_by: duplikováno od
-  setting_enabled_scm: Povolené SCM
-  text_enumeration_category_reassign_to: 'Přeřadit je do této:'
-  text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě."
-  label_incoming_emails: Příchozí e-maily
-  label_generate_key: Generovat klíč
-  setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily
-  setting_mail_handler_api_key: API klíč
-  text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/configuration.yml a restartujte aplikaci."
-  field_parent_title: Rodičovská stránka
-  label_issue_watchers: Sledování
-  setting_commit_logs_encoding: Kódování zpráv při commitu
-  button_quote: Citovat
-  setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů
-  notice_unable_delete_version: Nemohu odstanit verzi
-  label_renamed: přejmenováno
-  label_copied: zkopírováno
-  setting_plain_text_mail: pouze prostý text (ne HTML)
-  permission_view_files: Prohlížení souborů
-  permission_edit_issues: Upravování úkolů
-  permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase
-  permission_manage_public_queries: Správa veřejných dotazů
-  permission_add_issues: Přidávání úkolů
-  permission_log_time: Zaznamenávání stráveného času
-  permission_view_changesets: Zobrazování sady změn
-  permission_view_time_entries: Zobrazení stráveného času
-  permission_manage_versions: Spravování verzí
-  permission_manage_wiki: Spravování Wiki
-  permission_manage_categories: Spravování kategorií úkolů
-  permission_protect_wiki_pages: Zabezpečení Wiki stránek
-  permission_comment_news: Komentování novinek
-  permission_delete_messages: Mazání zpráv
-  permission_select_project_modules: Výběr modulů projektu
-  permission_manage_documents: Správa dokumentů
-  permission_edit_wiki_pages: Upravování stránek Wiki
-  permission_add_issue_watchers: Přidání sledujících uživatelů
-  permission_view_gantt: Zobrazené Ganttova diagramu
-  permission_move_issues: Přesouvání úkolů
-  permission_manage_issue_relations: Spravování vztahů mezi úkoly
-  permission_delete_wiki_pages: Mazání stránek na Wiki
-  permission_manage_boards: Správa diskusních fór
-  permission_delete_wiki_pages_attachments: Mazání příloh
-  permission_view_wiki_edits: Prohlížení historie Wiki
-  permission_add_messages: Posílání zpráv
-  permission_view_messages: Prohlížení zpráv
-  permission_manage_files: Spravování souborů
-  permission_edit_issue_notes: Upravování poznámek
-  permission_manage_news: Spravování novinek
-  permission_view_calendar: Prohlížení kalendáře
-  permission_manage_members: Spravování členství
-  permission_edit_messages: Upravování zpráv
-  permission_delete_issues: Mazání úkolů
-  permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
-  permission_manage_repository: Spravování repozitáře
-  permission_commit_access: Commit přístup
-  permission_browse_repository: Procházení repozitáře
-  permission_view_documents: Prohlížení dokumentů
-  permission_edit_project: Úprava projektů
-  permission_add_issue_notes: Přidávání poznámek
-  permission_save_queries: Ukládání dotazů
-  permission_view_wiki_pages: Prohlížení Wiki
-  permission_rename_wiki_pages: Přejmenovávání Wiki stránek
-  permission_edit_time_entries: Upravování záznamů o stráveném času
-  permission_edit_own_issue_notes: Upravování vlastních poznámek
-  setting_gravatar_enabled: Použít uživatelské ikony Gravatar
-  label_example: Příklad
-  text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
-  permission_edit_own_messages: Upravit vlastní zprávy
-  permission_delete_own_messages: Smazat vlastní zprávy
-  label_user_activity: "Aktivita uživatele: %{value}"
-  label_updated_time_by: "Akutualizováno: %{author} před: %{age}"
-  text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
-  setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
-  text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
-  warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit."
-  button_create_and_continue: Vytvořit a pokračovat
-  text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
-  label_display: Zobrazit
-  field_editable: Editovatelný
-  setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru
-  setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce
-  field_watcher: Sleduje
-  setting_openid: Umožnit přihlašování a registrace s OpenID
-  field_identity_url: OpenID URL
-  label_login_with_open_id_option: nebo se přihlašte s OpenID
-  field_content: Obsah
-  label_descending: Sestupně
-  label_sort: Řazení
-  label_ascending: Vzestupně
-  label_date_from_to: Od %{start} do %{end}
-  label_greater_or_equal: ">="
-  label_less_or_equal: <=
-  text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat?
-  text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
-  text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
-  text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
-  setting_password_min_length: Minimální délka hesla
-  field_group_by: Seskupovat výsledky podle
-  mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována"
-  label_wiki_content_added: Wiki stránka přidána
-  mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána"
-  mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}."
-  label_wiki_content_updated: Wiki stránka aktualizována
-  mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}."
-  permission_add_project: Vytvořit projekt
-  setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
-  label_view_all_revisions: Zobrazit všechny revize
-  label_tag: Tag
-  label_branch: Branch
-  error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
-  error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
-  text_journal_changed: "%{label} změněn z %{old} na %{new}"
-  text_journal_set_to: "%{label} nastaven na %{value}"
-  text_journal_deleted: "%{label} smazán (%{old})"
-  label_group_plural: Skupiny
-  label_group: Skupina
-  label_group_new: Nová skupina
-  label_time_entry_plural: Strávený čas
-  text_journal_added: "%{label} %{value} přidán"
-  field_active: Aktivní
   enumeration_system_activity: Systémová aktivita
-  permission_delete_issue_watchers: Smazat přihlížející
-  version_status_closed: zavřený
-  version_status_locked: uzamčený
-  version_status_open: otevřený
-  error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
-  label_user_anonymous: Anonymní
-  button_move_and_follow: Přesunout a následovat
-  setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
-  setting_gravatar_default: Výchozí Gravatar
-  field_sharing: Sdílení
-  label_version_sharing_hierarchy: S hierarchií projektu
-  label_version_sharing_system: Se všemi projekty
-  label_version_sharing_descendants: S podprojekty
-  label_version_sharing_tree: Se stromem projektu
-  label_version_sharing_none: Nesdíleno
-  error_can_not_archive_project: Tento projekt nemůže být archivován
-  button_duplicate: Duplikát
-  button_copy_and_follow: Kopírovat a následovat
-  label_copy_source: Zdroj
-  setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
-  setting_issue_done_ratio_issue_status: Použít stav úkolu
-  error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
-  error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
-  setting_issue_done_ratio_issue_field: Použít pole úkolu
-  label_copy_same_as_target: Stejný jako cíl
-  label_copy_target: Cíl
-  notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
-  error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
-  label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
-  setting_start_of_week: Začínat kalendáře
-  permission_view_issues: Zobrazit úkoly
-  label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
-  label_revision_id: Revize %{value}
-  label_api_access_key: API přístupový klíč
-  label_api_access_key_created_on: API přístupový klíč vytvořen %{value} 
-  label_feeds_access_key: RSS přístupový klíč
-  notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
-  setting_rest_api_enabled: Zapnout službu REST
-  label_missing_api_access_key: Chybějící přístupový klíč API
-  label_missing_feeds_access_key: Chybějící přístupový klíč RSS
-  button_show: Zobrazit
-  text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
-  setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
-  permission_add_subprojects: Vytvořit podprojekty
-  label_subproject_new: Nový podprojekt
-  text_own_membership_delete_confirmation: |-
-    Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.
-    Opravdu chcete pokračovat?
-  label_close_versions: Zavřít dokončené verze
-  label_board_sticky: Nálepka
-  label_board_locked: Uzamčeno
-  permission_export_wiki_pages: Exportovat Wiki stránky
-  setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
-  permission_manage_project_activities: Spravovat aktivity projektu
-  error_unable_delete_issue_status: Nelze smazat stavy úkolů
-  label_profile: Profil
-  permission_manage_subtasks: Spravovat podúkoly
-  field_parent_issue: Rodičovský úkol
-  label_subtask_plural: Podúkol
-  label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
-  error_can_not_delete_custom_field: Nelze smazat volitelné pole
-  error_unable_to_connect: Nelze se připojit (%{value})
-  error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
-  error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
-  field_principal: Hlavní
-  label_my_page_block: Bloky na mé stránce
-  notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}."
-  text_zoom_out: Oddálit
-  text_zoom_in: Přiblížit
-  notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
-  label_overall_spent_time: Celkově strávený čas
-  field_time_entries: Zaznamenaný čas
-  project_module_gantt: Gantt
-  project_module_calendar: Kalendář
-  button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}"
-  text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
-  field_text: Textové pole
-  label_user_mail_option_only_owner: Only for things I am the owner of
-  setting_default_notification_option: Default notification option
-  label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
-  label_user_mail_option_only_assigned: Only for things I am assigned to
-  label_user_mail_option_none: No events
-  field_member_of_group: Assignee's group
-  field_assigned_to_role: Assignee's role
-  notice_not_authorized_archived_project: The project you're trying to access has been archived.
-  label_principal_search: "Search for user or group:"
-  label_user_search: "Search for user:"
-  field_visible: Visible
-  setting_emails_header: Emails header
-  setting_commit_logtime_activity_id: Activity for logged time
-  text_time_logged_by_changeset: Applied in changeset %{value}.
-  setting_commit_logtime_enabled: Enable time logging
-  notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
-  setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/da.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/da.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -952,3 +952,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/de.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/de.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -953,3 +953,7 @@
   setting_commit_logtime_enabled: Aktiviere Zeitlogging
   notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max})
   setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden.
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/el.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/el.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/en-GB.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/en-GB.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -940,3 +940,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/en.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/en.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -303,6 +303,7 @@
   field_assigned_to_role: "Assignee's role"
   field_text: Text field
   field_visible: Visible
+  field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text"
   
   setting_app_title: Application title
   setting_app_subtitle: Application subtitle
@@ -594,6 +595,7 @@
   label_query: Custom query
   label_query_plural: Custom queries
   label_query_new: New query
+  label_my_queries: My custom queries
   label_filter_add: Add filter
   label_filter_plural: Filters
   label_equals: is
@@ -858,6 +860,7 @@
   text_are_you_sure: Are you sure ?
   text_are_you_sure_with_children: "Delete issue and all child issues?"
   text_journal_changed: "%{label} changed from %{old} to %{new}"
+  text_journal_changed_no_detail: "%{label} updated"
   text_journal_set_to: "%{label} set to %{value}"
   text_journal_deleted: "%{label} deleted (%{old})"
   text_journal_added: "%{label} %{value} added"
@@ -908,6 +911,7 @@
   text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
   text_zoom_in: Zoom in
   text_zoom_out: Zoom out
+  text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page."
   
   default_role_manager: Manager
   default_role_developer: Developer
--- a/config/locales/.svn/text-base/es.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/es.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -973,3 +973,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/eu.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/eu.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -99,8 +99,8 @@
     errors:
       template:
         header:
-          one:    "1 error prohibited this %{model} from being saved"
-          other:  "%{count} errors prohibited this %{model} from being saved"
+          one:    "Errore batek %{model} hau godetzea galarazi du."
+          other:  "%{count} errorek %{model} hau gordetzea galarazi dute."
       messages:
         inclusion: "ez dago zerrendan"
         exclusion: "erreserbatuta dago"
@@ -125,7 +125,7 @@
         greater_than_start_date: "hasiera data baino handiagoa izan behar du"
         not_same_project: "ez dago proiektu berdinean"
         circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke"
-        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: "Zeregin bat ezin da bere azpiataza batekin estekatu."
 
   actionview_instancetag_blank_option: Hautatu mesedez
   
@@ -277,7 +277,7 @@
   field_issue_to: Erlazionatutako zereginak
   field_delay: Atzerapena
   field_assignable: Arazoak rol honetara esleitu daitezke
-  field_redirect_existing_links: Existitzen diren estelak berbideratu
+  field_redirect_existing_links: Existitzen diren estekak berbideratu
   field_estimated_hours: Estimatutako denbora
   field_column_names: Zutabeak
   field_time_zone: Ordu zonaldea
@@ -318,7 +318,7 @@
   setting_cross_project_issue_relations: Zereginak proiektuen artean erlazionatzea baimendu
   setting_issue_list_default_columns: Zereginen zerrendan defektuz ikusten diren zutabeak
   setting_repositories_encodings: Biltegien kodeketak
-  setting_commit_logs_encoding: Commit-en mezuen kodetzea
+  setting_commit_logs_encoding: Commit-en egunkarien kodetzea
   setting_emails_footer: Eposten oina
   setting_protocol: Protokoloa
   setting_per_page_options: Orriko objektuen aukerak
@@ -363,7 +363,7 @@
   permission_delete_issues: Zereginak ezabatu
   permission_manage_public_queries: Galdera publikoak kudeatu
   permission_save_queries: Galderak gorde
-  permission_view_gantt: Gantt diagrama ikusi
+  permission_view_gantt: Gantt grafikoa ikusi
   permission_view_calendar: Egutegia ikusi
   permission_view_issue_watchers: Behatzaileen zerrenda ikusi
   permission_add_issue_watchers: Behatzaileak gehitu
@@ -441,7 +441,7 @@
   label_tracker: Aztarnaria
   label_tracker_plural: Aztarnariak
   label_tracker_new: Aztarnari berria
-  label_workflow: Workflow
+  label_workflow: Lan-fluxua
   label_issue_status: Zeregin egoera
   label_issue_status_plural: Zeregin egoerak
   label_issue_status_new: Egoera berria
@@ -506,7 +506,7 @@
   label_file_added: Fitxategia gehituta
   label_report: Berri ematea
   label_report_plural: Berri emateak
-  label_news: Beria
+  label_news: Berria
   label_news_new: Berria gehitu
   label_news_plural: Berriak
   label_news_latest: Azken berriak
@@ -553,7 +553,7 @@
   label_add_note: Oharra gehitu
   label_per_page: Orriko
   label_calendar: Egutegia
-  label_months_from: months from
+  label_months_from: hilabete noiztik
   label_gantt: Gantt
   label_internal: Barnekoa
   label_last_changes: "azken %{count} aldaketak"
@@ -784,7 +784,7 @@
   button_cancel: Ezeztatu
   button_activate: Gahitu
   button_sort: Ordenatu
-  button_log_time: Denbora apuntatu
+  button_log_time: Denbora erregistratu
   button_rollback: Itzuli bertsio honetara
   button_watch: Behatu
   button_unwatch: Behatzen utzi
@@ -824,9 +824,9 @@
   text_journal_set_to: "%{label}-k %{value} balioa hartu du"
   text_journal_deleted: "%{label} ezabatuta (%{old})"
   text_journal_added: "%{label} %{value} gehituta"
-  text_tip_issue_begin_day: gaur hasten diren atazak
-  text_tip_issue_end_day: gaur bukatzen diren atazak
-  text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren atazak
+  text_tip_issue_begin_day: gaur hasten diren zereginak
+  text_tip_issue_end_day: gaur bukatzen diren zereginak
+  text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren zereginak
   text_project_identifier_info: 'Letra xeheak (a-z), zenbakiak eta marrak erabil daitezke bakarrik.<br />Gorde eta gero identifikadorea ezin da aldatu.'
   text_caracters_maximum: "%{count} karaktere gehienez."
   text_caracters_minimum: "Gutxienez %{count} karaktereetako luzerakoa izan behar du."
@@ -895,7 +895,7 @@
   enumeration_doc_categories: Dokumentu kategoriak
   enumeration_activities: Jarduerak (denbora kontrola))
   enumeration_system_activity: Sistemako Jarduera
-  label_board_sticky: Itxaskorra
+  label_board_sticky: Itsaskorra
   label_board_locked: Blokeatuta
   permission_export_wiki_pages: Wiki orriak esportatu
   setting_cache_formatted_text: Formatudun testua katxeatu
@@ -903,40 +903,44 @@
   error_unable_delete_issue_status: Ezine da zereginaren egoera ezabatu
   label_profile: Profila
   permission_manage_subtasks: Azpiatazak kudeatu
-  field_parent_issue: Guraso ataza
+  field_parent_issue: Zeregin gurasoa
   label_subtask_plural: Azpiatazak
   label_project_copy_notifications: Proiektua kopiatzen den bitartean eposta jakinarazpenak bidali
-  error_can_not_delete_custom_field: Ezin da eremu pertsonallizatua ezabatu
+  error_can_not_delete_custom_field: Ezin da eremu pertsonalizatua ezabatu
   error_unable_to_connect: Ezin da konektatu (%{value})
   error_can_not_remove_role: Rol hau erabiltzen hari da eta ezin da ezabatu.
   error_can_not_delete_tracker: Aztarnari honek zereginak ditu eta ezin da ezabatu.
-  field_principal: Principal
-  label_my_page_block: My page block
-  notice_failed_to_save_members: "Failed to save member(s): %{errors}."
-  text_zoom_out: Zoom out
-  text_zoom_in: Zoom in
-  notice_unable_delete_time_entry: Unable to delete time log entry.
-  label_overall_spent_time: Overall spent time
-  field_time_entries: Log time
+  field_principal: Ekintzaile
+  label_my_page_block: "Nire orriko blokea"
+  notice_failed_to_save_members: "Kidea(k) gordetzean errorea: %{errors}."
+  text_zoom_out: Zooma txikiagotu
+  text_zoom_in: Zooma handiagotu
+  notice_unable_delete_time_entry: "Ezin da hautatutako denbora erregistroa ezabatu."
+  label_overall_spent_time: Igarotako denbora guztira
+  field_time_entries: "Denbora erregistratu"
   project_module_gantt: Gantt
-  project_module_calendar: Calendar
-  button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
-  text_are_you_sure_with_children: Delete issue and all child issues?
-  field_text: Text field
-  label_user_mail_option_only_owner: Only for things I am the owner of
-  setting_default_notification_option: Default notification option
-  label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
-  label_user_mail_option_only_assigned: Only for things I am assigned to
-  label_user_mail_option_none: No events
-  field_member_of_group: Assignee's group
-  field_assigned_to_role: Assignee's role
-  notice_not_authorized_archived_project: The project you're trying to access has been archived.
-  label_principal_search: "Search for user or group:"
-  label_user_search: "Search for user:"
-  field_visible: Visible
-  setting_emails_header: Emails header
-  setting_commit_logtime_activity_id: Activity for logged time
-  text_time_logged_by_changeset: Applied in changeset %{value}.
-  setting_commit_logtime_enabled: Enable time logging
-  notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
-  setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  project_module_calendar: Egutegia
+  button_edit_associated_wikipage: "Esleitutako wiki orria editatu: %{page_title}"
+  text_are_you_sure_with_children: "Zeregina eta azpi zeregin guztiak ezabatu?"
+  field_text: Testu eremua
+  label_user_mail_option_only_owner: "Jabea naizen gauzetarako barrarik"
+  setting_default_notification_option: "Lehenetsitako ohartarazpen aukera"
+  label_user_mail_option_only_my_events: "Behatzen ditudan edo partaide naizen gauzetarako bakarrik"
+  label_user_mail_option_only_assigned: "Niri esleitutako gauzentzat bakarrik"
+  label_user_mail_option_none: "Gertakaririk ez"
+  field_member_of_group: "Esleituta duenaren taldea"
+  field_assigned_to_role: "Esleituta duenaren rola"
+  notice_not_authorized_archived_project: "Atzitu nahi duzun proiektua artxibatua izan da."
+  label_principal_search: "Bilatu erabiltzaile edo taldea:"
+  label_user_search: "Erabiltzailea bilatu:"
+  field_visible: Ikusgai
+  setting_emails_header: "Eposten goiburua"
+  setting_commit_logtime_activity_id: "Erregistratutako denboraren jarduera"
+  text_time_logged_by_changeset: "%{value} aldaketan egindakoa."
+  setting_commit_logtime_enabled: "Erregistrutako denbora gaitu"
+  notice_gantt_chart_truncated: Grafikoa moztu da bistara daitekeen elementuen kopuru maximoa gainditu delako (%{max})
+  setting_gantt_items_limit: "Gantt grafikoan bistara daitekeen elementu kopuru maximoa"
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/locales/.svn/text-base/fa.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,945 @@
+fa:
+  # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
+  direction: rtl
+  date:
+    formats:
+      # Use the strftime parameters for formats.
+      # When no format has been given, it uses default.
+      # You can provide other formats here if you like!
+      default: "%Y/%m/%d"
+      short: "%b %d"
+      long: "%B %d, %Y"
+      
+    day_names: [یک‌شنبه, دوشنبه, سه‌شنبه, چهارشنبه, پنج‌شنبه, آدینه, شنبه]
+    abbr_day_names: [یک, دو, سه, چهار, پنج, آدینه, شنبه]
+      
+    # Don't forget the nil at the beginning; there's no such thing as a 0th month
+    month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر]
+    abbr_month_names: [~, ژان, فور, مار, آور, مه, ژوئن, ژوئیه, اوت, سپت, اکت, نوا, دسا]
+    # Used in date_select and datime_select.
+    order: [ :year, :month, :day ]
+
+  time:
+    formats:
+      default: "%Y/%m/%d %p %I:%M"
+      time: "%p %I:%M"
+      short: "%d %b %H:%M"
+      long: "%B %d, %Y %H:%M"
+    am: "ق.ظ"
+    pm: "ب.ظ"
+      
+  datetime:
+    distance_in_words:
+      half_a_minute: "نیم دقیقه"
+      less_than_x_seconds:
+        one:   "کمتر از 1 ثانیه"
+        other: "کمتر از %{count} ثانیه"
+      x_seconds:
+        one:   "1 ثانیه"
+        other: "%{count} ثانیه"
+      less_than_x_minutes:
+        one:   "کمتر از 1 دقیقه"
+        other: "کمتر از %{count} دقیقه"
+      x_minutes:
+        one:   "1 دقیقه"
+        other: "%{count} دقیقه"
+      about_x_hours:
+        one:   "نزدیک 1 ساعت"
+        other: "نزدیک %{count} ساعت"
+      x_days:
+        one:   "1 روز"
+        other: "%{count} روز"
+      about_x_months:
+        one:   "نزدیک 1 ماه"
+        other: "نزدیک %{count} ماه"
+      x_months:
+        one:   "1 ماه"
+        other: "%{count} ماه"
+      about_x_years:
+        one:   "نزدیک 1 سال"
+        other: "نزدیک %{count} سال"
+      over_x_years:
+        one:   "بیش از 1 سال"
+        other: "بیش از %{count} سال"
+      almost_x_years:
+        one:   "نزدیک 1 سال"
+        other: "نزدیک %{count} سال"
+
+  number:
+    # Default format for numbers
+    format:
+      separator: "٫" 
+      delimiter: ""
+      precision: 3
+    human:
+      format:
+        delimiter: ""
+        precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "بایت"
+            other: "بایت"
+          kb: "کیلوبایت"
+          mb: "مگابایت"
+          gb: "گیگابایت"
+          tb: "ترابایت"
+
+        
+# Used in array.to_sentence.
+  support:
+    array:
+      sentence_connector: "و"
+      skip_last_comma: false
+      
+  activerecord:
+    errors:
+      template:
+        header:
+          one:    "1 ایراد از ذخیره سازی این %{model} جلوگیری کرد"
+          other:  "%{count} ایراد از ذخیره سازی این %{model} جلوگیری کرد"
+      messages:
+        inclusion: "در فهرست نیامده است"
+        exclusion: "رزرو شده است"
+        invalid: "نادرست است"
+        confirmation: "با بررسی سازگاری ندارد"
+        accepted: "باید پذیرفته شود"
+        empty: "نمی‌تواند تهی باشد"
+        blank: "نمی‌تواند تهی باشد"
+        too_long: "خیلی بلند است (بیشترین اندازه %{count} نویسه است)"
+        too_short: "خیلی کوتاه است (کمترین اندازه %{count} نویسه است)"
+        wrong_length: "اندازه نادرست است (باید %{count} نویسه باشد)"
+        taken: "پیش از این گرفته شده است"
+        not_a_number: "شماره درستی نیست"
+        not_a_date: "تاریخ درستی نیست"
+        greater_than: "باید بزرگتر از %{count} باشد"
+        greater_than_or_equal_to: "باید بزرگتر از یا برابر با %{count} باشد"
+        equal_to: "باید برابر با %{count} باشد"
+        less_than: "باید کمتر از %{count} باشد"
+        less_than_or_equal_to: "باید کمتر از یا برابر با %{count} باشد"
+        odd: "باید فرد باشد"
+        even: "باید زوج باشد"
+        greater_than_start_date: "باید از تاریخ آغاز بزرگتر باشد"
+        not_same_project: "به همان پروژه وابسته نیست"
+        circular_dependency: "این وابستگی یک وابستگی دایره وار خواهد ساخت"
+        cant_link_an_issue_with_a_descendant: "یک پیامد نمی‌تواند به یکی از زیر کارهایش پیوند بخورد"
+
+  actionview_instancetag_blank_option: گزینش کنید
+  
+  general_text_No: 'خیر'
+  general_text_Yes: 'آری'
+  general_text_no: 'خیر'
+  general_text_yes: 'آری'
+  general_lang_name: 'Persian (پارسی)'
+  general_csv_separator: ','
+  general_csv_decimal_separator: '.'
+  general_csv_encoding: UTF-8
+  general_pdf_encoding: UTF-8
+  general_first_day_of_week: '6'
+  
+  notice_account_updated: حساب شما بروز شد.
+  notice_account_invalid_creditentials: نام کاربری یا گذرواژه نادرست است
+  notice_account_password_updated: گذرواژه بروز شد
+  notice_account_wrong_password: گذرواژه نادرست است
+  notice_account_register_done: حساب ساخته شد. برای فعال نمودن آن، روی پیوندی که به شما ایمیل شده کلیک کنید.
+  notice_account_unknown_email: کاربر شناخته نشد.
+  notice_can_t_change_password:  این حساب یک روش شناسایی بیرونی را به کار گرفته است. گذرواژه را نمی‌توان جایگزین کرد.
+  notice_account_lost_email_sent: یک ایمیل با راهنمایی درباره گزینش گذرواژه تازه برای شما فرستاده شد.
+  notice_account_activated: حساب شما فعال شده است. اکنون می‌توانید وارد شوید.
+  notice_successful_create: با موفقیت ساخته شد.
+  notice_successful_update: با موفقیت بروز شد.
+  notice_successful_delete: با موفقیت برداشته شد.
+  notice_successful_connection: با موفقیت متصل شد.
+  notice_file_not_found: برگه درخواستی شما در دسترس نیست یا پاک شده است.
+  notice_locking_conflict: داده‌ها را کاربر دیگری بروز کرده است.
+  notice_not_authorized: شما به این برگه دسترسی ندارید.
+  notice_not_authorized_archived_project: پروژه درخواستی شما بایگانی شده است.
+  notice_email_sent: "یک ایمیل به %{value} فرستاده شد."
+  notice_email_error: "یک ایراد در فرستادن ایمیل پیش آمد (%{value})."
+  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: زمان گزارش شده را نمی‌توان پاک کرد.
+  notice_issue_done_ratios_updated: اندازه انجام شده پیامد بروز شد.
+  notice_gantt_chart_truncated: "نمودار بریده شد چون از بیشترین شماری که می‌توان نشان داد بزگتر است (%{max})."
+  
+  error_can_t_load_default_data: "پیکربندی پیش‌گزیده نمی‌تواند بار شود: %{value}"
+  error_scm_not_found: "بخش یا نگارش در انباره پیدا نشد."
+  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: 'یک پیگرد یا نقش منبع را برگزینید.'
+  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_body_lost_password: 'برای جایگزینی گذرواژه خود، بر روی پیوند زیر کلیک کنید:'
+  mail_subject_register: "فعالسازی حساب %{value} شما"
+  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: "برگه ویکی «%{id}» افزوده شد"
+  mail_body_wiki_content_added: "برگه ویکی «%{id}» به دست %{author} افزوده شد."
+  mail_subject_wiki_content_updated: "برگه ویکی «%{id}» بروز شد"
+  mail_body_wiki_content_updated: "برگه ویکی «%{id}» به دست %{author} بروز شد."
+  
+  gui_validation_error: 1 ایراد
+  gui_validation_error_plural: "%{count} ایراد"
+  
+  field_name: نام
+  field_description: توضیح
+  field_summary: خلاصه
+  field_is_required: الزامی
+  field_firstname: نام کوچک
+  field_lastname: نام خانوادگی
+  field_mail: ایمیل
+  field_filename: پرونده
+  field_filesize: اندازه
+  field_downloads: دریافت‌ها
+  field_author: نویسنده
+  field_created_on: ساخته شده در
+  field_updated_on: بروز شده در
+  field_field_format: قالب
+  field_is_for_all: برای همه پروژه‌ها
+  field_possible_values: مقادیر ممکن
+  field_regexp: عبارت منظم
+  field_min_length: کمترین اندازه
+  field_max_length: بیشترین اندازه
+  field_value: مقدار
+  field_category: دسته
+  field_title: عنوان
+  field_project: پروژه
+  field_issue: پیامد
+  field_status: وضعیت
+  field_notes: یادداشت‌ها
+  field_is_closed: پیامد بسته شده
+  field_is_default: مقدار پیش‌گزیده
+  field_tracker: پیگرد
+  field_subject: موضوع
+  field_due_date: زمان سررسید
+  field_assigned_to: واگذار شده به
+  field_priority: برتری
+  field_fixed_version: نگارش هدف
+  field_user: کاربر
+  field_principal: دستور دهنده
+  field_role: نقش
+  field_homepage: برگه خانه
+  field_is_public: همگانی
+  field_parent: پروژه پدر
+  field_is_in_roadmap: این پیامدها در نقشه راه نشان داده شوند
+  field_login: ورود
+  field_mail_notification: آگاه سازی‌های ایمیلی
+  field_admin: سرپرست
+  field_last_login_on: آخرین ورود
+  field_language: زبان
+  field_effective_date: تاریخ
+  field_password: گذرواژه
+  field_new_password: گذرواژه تازه
+  field_password_confirmation: بررسی گذرواژه
+  field_version: نگارش
+  field_type: گونه
+  field_host: میزبان
+  field_port: درگاه
+  field_account: حساب
+  field_base_dn: DN پایه
+  field_attr_login: نشانه ورود
+  field_attr_firstname: نشانه نام کوچک
+  field_attr_lastname: نشانه نام خانوادگی
+  field_attr_mail: نشانه ایمیل
+  field_onthefly: ساخت کاربر بیدرنگ
+  field_start_date: تاریخ آغاز
+  field_done_ratio: ٪ انجام شده
+  field_auth_source: روش شناسایی
+  field_hide_mail: ایمیل من پنهان شود
+  field_comments: دیدگاه
+  field_url: نشانی
+  field_start_page: برگه آغاز
+  field_subproject: زیر پروژه
+  field_hours: ساعت‌
+  field_activity: فعالیت
+  field_spent_on: در تاریخ
+  field_identifier: شناسه
+  field_is_filter: پالایش پذیر
+  field_issue_to: پیامد وابسته
+  field_delay: دیرکرد
+  field_assignable: پیامدها می‌توانند به این نقش واگذار شوند
+  field_redirect_existing_links: پیوندهای پیشین  به پیوند تازه راهنمایی شوند
+  field_estimated_hours: زمان برآورد شده
+  field_column_names: ستون‌ها
+  field_time_entries: زمان نوشتن
+  field_time_zone: پهنه زمانی
+  field_searchable: جستجو پذیر
+  field_default_value: مقدار پیش‌گزیده
+  field_comments_sorting: نمایش دیدگاه‌ها
+  field_parent_title: برگه پدر
+  field_editable: ویرایش پذیر
+  field_watcher: دیده‌بان
+  field_identity_url: نشانی OpenID
+  field_content: محتوا
+  field_group_by: دسته بندی با
+  field_sharing: اشتراک گذاری
+  field_parent_issue: کار پدر
+  field_member_of_group: "دسته واگذار شونده"
+  field_assigned_to_role: "نقش واگذار شونده"
+  field_text: فیلد متنی
+  field_visible: آشکار
+  
+  setting_app_title: نام برنامه
+  setting_app_subtitle: زیرنام برنامه
+  setting_welcome_text: نوشتار خوش‌آمد گویی
+  setting_default_language: زبان پیش‌گزیده
+  setting_login_required: الزامی بودن ورود
+  setting_self_registration: خود نام نویسی
+  setting_attachment_max_size: بیشترین اندازه پیوست
+  setting_issues_export_limit: کرانه صدور پییامدها
+  setting_mail_from: نشانی فرستنده ایمیل
+  setting_bcc_recipients: گیرندگان ایمیل دیده نشوند (bcc)
+  setting_plain_text_mail: ایمیل نوشته ساده (بدون HTML)
+  setting_host_name: نام میزبان و نشانی
+  setting_text_formatting: قالب بندی نوشته
+  setting_wiki_compression: فشرده‌سازی پیشینه ویکی
+  setting_feeds_limit: کرانه محتوای خوراک
+  setting_default_projects_public: حالت پیش‌گزیده پروژه‌های تازه، همگانی است
+  setting_autofetch_changesets: دریافت خودکار تغییرات
+  setting_sys_api_enabled: فعال سازی وب سرویس برای سرپرستی انباره
+  setting_commit_ref_keywords: کلیدواژه‌های نشانه
+  setting_commit_fix_keywords: کلیدواژه‌های انجام
+  setting_autologin: ورود خودکار
+  setting_date_format: قالب تاریخ
+  setting_time_format: قالب زمان
+  setting_cross_project_issue_relations: توانایی وابستگی میان پروژه‌ای پیامدها
+  setting_issue_list_default_columns: ستون‌های پیش‌گزیده نمایش داده شده در فهرست پیامدها
+  setting_repositories_encodings: کدگذاری انباره‌ها
+  setting_commit_logs_encoding: کدگذاری پیام‌های انباره
+  setting_emails_header: سرنویس ایمیل‌ها
+  setting_emails_footer: پانویس ایمیل‌ها
+  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: "بریدن ایمیل‌ها پس از یکی از این ردیف‌ها"
+  setting_mail_handler_api_enabled: فعالسازی وب سرویس برای ایمیل‌های آمده
+  setting_mail_handler_api_key: کلید API
+  setting_sequential_project_identifiers: ساخت پشت سر هم شناسه پروژه
+  setting_gravatar_enabled: کاربرد Gravatar برای عکس کاربر
+  setting_gravatar_default: عکس Gravatar پیش‌گزیده
+  setting_diff_max_lines_displayed: بیشترین اندازه ردیف‌های تفاوت نشان داده شده
+  setting_file_max_size_displayed: بیشترین اندازه پرونده‌های نمایش داده شده درون خطی
+  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
+  setting_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: ذخیره سازی پرس‌وجوها
+  permission_view_gantt: دیدن نمودار گانت
+  permission_view_calendar: دیدن گاهشمار
+  permission_view_issue_watchers: دیدن فهرست دیده‌بان‌ها
+  permission_add_issue_watchers: افزودن دیده‌بان‌ها
+  permission_delete_issue_watchers: پاک کردن دیده‌بان‌ها
+  permission_log_time: نوشتن زمان گذاشته شده
+  permission_view_time_entries: دیدن زمان گذاشته شده
+  permission_edit_time_entries: ویرایش زمان گذاشته شده
+  permission_edit_own_time_entries: ویرایش زمان گذاشته شده خود
+  permission_manage_news: سرپرستی رویدادها
+  permission_comment_news: گذاشتن دیدگاه روی رویدادها
+  permission_manage_documents: سرپرستی نوشتارها
+  permission_view_documents: دیدن نوشتارها
+  permission_manage_files: سرپرستی پرونده‌ها
+  permission_view_files: دیدن پرونده‌ها
+  permission_manage_wiki: سرپرستی ویکی
+  permission_rename_wiki_pages: نامگذاری برگه ویکی
+  permission_delete_wiki_pages: پاک کردن برگه ویکی
+  permission_view_wiki_pages: دیدن ویکی
+  permission_view_wiki_edits: دیدن پیشینه ویکی
+  permission_edit_wiki_pages: ویرایش برگه‌های ویکی
+  permission_delete_wiki_pages_attachments: پاک کردن پیوست‌های برگه ویکی
+  permission_protect_wiki_pages: نگه‌داری برگه‌های ویکی
+  permission_manage_repository: سرپرستی انباره
+  permission_browse_repository: چریدن در انباره
+  permission_view_changesets: دیدن تغییرات
+  permission_commit_access: دسترسی تغییر انباره
+  permission_manage_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: صدور برگه‌های ویکی
+  permission_manage_subtasks: سرپرستی زیرکارها
+  
+  project_module_issue_tracking: پیگیری پیامدها
+  project_module_time_tracking: پیگیری زمان
+  project_module_news: رویدادها
+  project_module_documents: نوشتارها
+  project_module_files: پرونده‌ها
+  project_module_wiki: ویکی
+  project_module_repository: انباره
+  project_module_boards: انجمن‌ها
+  project_module_calendar: گاهشمار
+  project_module_gantt: گانت
+  
+  label_user: کاربر
+  label_user_plural: کاربر
+  label_user_new: کاربر تازه
+  label_user_anonymous: ناشناس
+  label_project: پروژه
+  label_project_new: پروژه تازه
+  label_project_plural: پروژه
+  label_x_projects:
+    zero:  بدون پروژه
+    one:   "1 پروژه"
+    other: "%{count} پروژه"
+  label_project_all: همه پروژه‌ها
+  label_project_latest: آخرین پروژه‌ها
+  label_issue: پیامد
+  label_issue_new: پیامد تازه
+  label_issue_plural: پیامد
+  label_issue_view_all: دیدن همه پیامدها
+  label_issues_by: "پیامدهای دست%{value}"
+  label_issue_added: پیامد افزوده شد
+  label_issue_updated: پیامد بروز شد
+  label_document: نوشتار
+  label_document_new: نوشتار تازه
+  label_document_plural: نوشتار
+  label_document_added: نوشتار افزوده شد
+  label_role: نقش
+  label_role_plural: نقش
+  label_role_new: نقش تازه
+  label_role_and_permissions: نقش‌ها و پروانه‌ها
+  label_member: عضو
+  label_member_new: عضو تازه
+  label_member_plural: عضو
+  label_tracker: پیگرد
+  label_tracker_plural: پیگرد
+  label_tracker_new: پیگرد تازه
+  label_workflow: گردش کار
+  label_issue_status: وضعیت پیامد
+  label_issue_status_plural: وضعیت پیامد
+  label_issue_status_new: وضعیت تازه
+  label_issue_category: دسته پیامد
+  label_issue_category_plural: دسته پیامد
+  label_issue_category_new: دسته تازه
+  label_custom_field: فیلد سفارشی
+  label_custom_field_plural: فیلد سفارشی
+  label_custom_field_new: فیلد سفارشی تازه
+  label_enumerations: برشمردنی‌ها
+  label_enumeration_new: مقدار تازه
+  label_information: داده
+  label_information_plural: داده
+  label_please_login: وارد شوید
+  label_register: نام نویسی کنید
+  label_login_with_open_id_option: یا با OpenID وارد شوید
+  label_password_lost: بازیافت گذرواژه
+  label_home: سرآغاز
+  label_my_page: برگه من
+  label_my_account: حساب من
+  label_my_projects: پروژه‌های من
+  label_my_page_block: بخش برگه من
+  label_administration: سرپرستی
+  label_login: ورود
+  label_logout: خروج
+  label_help: راهنما
+  label_reported_issues: پیامدهای گزارش شده
+  label_assigned_to_me_issues: پیامدهای واگذار شده به من
+  label_last_login: آخرین ورود
+  label_registered_on: نام نویسی شده در
+  label_activity: فعالیت
+  label_overall_activity: فعالیت روی هم رفته
+  label_user_activity: "فعالیت %{value}"
+  label_new: تازه
+  label_logged_as: "نام کاربری:"
+  label_environment: محیط
+  label_authentication: شناسایی
+  label_auth_source: روش شناسایی
+  label_auth_source_new: روش شناسایی تازه
+  label_auth_source_plural: روش شناسایی
+  label_subproject_plural: زیرپروژه
+  label_subproject_new: زیرپروژه تازه
+  label_and_its_subprojects: "%{value} و زیرپروژه‌هایش"
+  label_min_max_length: کمترین و بیشترین اندازه
+  label_list: فهرست
+  label_date: تاریخ
+  label_integer: شماره درست
+  label_float: شماره شناور
+  label_boolean: درست/نادرست
+  label_string: نوشته
+  label_text: نوشته بلند
+  label_attribute: نشانه
+  label_attribute_plural: نشانه
+  label_download: "%{count} بار دریافت شده"
+  label_download_plural: "%{count} بار دریافت شده"
+  label_no_data: هیچ داده‌ای برای نمایش نیست
+  label_change_status: جایگزینی وضعیت
+  label_history: پیشینه
+  label_attachment: پرونده
+  label_attachment_new: پرونده تازه
+  label_attachment_delete: پاک کردن پرونده
+  label_attachment_plural: پرونده
+  label_file_added: پرونده افزوده شد
+  label_report: گزارش
+  label_report_plural: گزارش
+  label_news: رویداد
+  label_news_new: افزودن رویداد
+  label_news_plural: رویداد
+  label_news_latest: آخرین رویدادها
+  label_news_view_all: دیدن همه رویدادها
+  label_news_added: رویداد افزوده شد
+  label_settings: پیکربندی
+  label_overview: دورنما
+  label_version: نگارش
+  label_version_new: نگارش تازه
+  label_version_plural: نگارش
+  label_close_versions: بستن نگارش‌های انجام شده
+  label_confirmation: بررسی
+  label_export_to: 'قالب‌های دیگر:'
+  label_read: خواندن...
+  label_public_projects: پروژه‌های همگانی
+  label_open_issues: باز
+  label_open_issues_plural: باز
+  label_closed_issues: بسته
+  label_closed_issues_plural: بسته
+  label_x_open_issues_abbr_on_total:
+    zero:  0 باز از %{total}
+    one:   1 باز از %{total}
+    other: "%{count} باز از %{total}"
+  label_x_open_issues_abbr:
+    zero:  0 باز
+    one:   1 باز
+    other: "%{count} باز"
+  label_x_closed_issues_abbr:
+    zero:  0 بسته
+    one:   1 بسته
+    other: "%{count} بسته"
+  label_total: جمله
+  label_permissions: پروانه‌ها
+  label_current_status: وضعیت کنونی
+  label_new_statuses_allowed: وضعیت‌های پذیرفتنی تازه
+  label_all: همه
+  label_none: هیچ
+  label_nobody: هیچکس
+  label_next: پسین
+  label_previous: پیشین
+  label_used_by: به کار رفته در
+  label_details: ریزه‌کاری
+  label_add_note: افزودن یادداشت
+  label_per_page: ردیف‌ها در هر برگه
+  label_calendar: گاهشمار
+  label_months_from: از ماه
+  label_gantt: گانت
+  label_internal: درونی
+  label_last_changes: "%{count} تغییر آخر"
+  label_change_view_all: دیدن همه تغییرات
+  label_personalize_page: سفارشی نمودن این برگه
+  label_comment: دیدگاه
+  label_comment_plural: دیدگاه
+  label_x_comments:
+    zero: بدون دیدگاه
+    one: 1 دیدگاه
+    other: "%{count} دیدگاه"
+  label_comment_add: افزودن دیدگاه
+  label_comment_added: دیدگاه افزوده شد
+  label_comment_delete: پاک کردن دیدگاه‌ها
+  label_query: پرس‌وجوی سفارشی
+  label_query_plural: پرس‌وجوی سفارشی
+  label_query_new: پرس‌وجوی تازه
+  label_filter_add: افزودن پالایه
+  label_filter_plural: پالایه
+  label_equals: برابر است با
+  label_not_equals: برابر نیست با
+  label_in_less_than: کمتر است از
+  label_in_more_than: بیشتر است از
+  label_greater_or_equal: بیشتر یا برابر است با
+  label_less_or_equal: کمتر یا برابر است با
+  label_in: در
+  label_today: امروز
+  label_all_time: همیشه
+  label_yesterday: دیروز
+  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_more_than_ago: بیشتر از چند روز پیشین
+  label_ago: روز پیشین
+  label_contains: دارد
+  label_not_contains: ندارد
+  label_day_plural: روز
+  label_repository: انباره
+  label_repository_plural: انباره
+  label_browse: چریدن
+  label_modification: "%{count} جایگذاری"
+  label_modification_plural: "%{count} جایگذاری"
+  label_branch: شاخه
+  label_tag: برچسب
+  label_revision: بازبینی
+  label_revision_plural: بازبینی
+  label_revision_id: "بازبینی %{value}"
+  label_associated_revisions: بازبینی‌های وابسته
+  label_added: افزوده شده
+  label_modified: پیراسته شده
+  label_copied: رونویسی شده
+  label_renamed: نامگذاری شده
+  label_deleted: پاکسازی شده
+  label_latest_revision: آخرین بازبینی
+  label_latest_revision_plural: آخرین بازبینی
+  label_view_revisions: دیدن بازبینی‌ها
+  label_view_all_revisions: دیدن همه بازبینی‌ها
+  label_max_size: بیشترین اندازه
+  label_sort_highest: بردن به آغاز
+  label_sort_higher: بردن به بالا
+  label_sort_lower: بردن به پایین
+  label_sort_lowest: بردن به پایان
+  label_roadmap: نقشه راه
+  label_roadmap_due_in: "سررسید در %{value}"
+  label_roadmap_overdue: "%{value} دیرکرد"
+  label_roadmap_no_issues: هیچ پیامدی برای این نگارش نیست
+  label_search: جستجو
+  label_result_plural: دست‌آورد
+  label_all_words: همه واژه‌ها
+  label_wiki: ویکی
+  label_wiki_edit: ویرایش ویکی
+  label_wiki_edit_plural: ویرایش ویکی
+  label_wiki_page: برگه ویکی
+  label_wiki_page_plural: برگه ویکی
+  label_index_by_title: شاخص بر اساس نام
+  label_index_by_date: شاخص بر اساس تاریخ
+  label_current_version: نگارش کنونی
+  label_preview: پیش‌نمایش
+  label_feed_plural: خوراک
+  label_changes_details: ریز همه جایگذاری‌ها
+  label_issue_tracking: پیگیری پیامد
+  label_spent_time: زمان گذاشته شده
+  label_overall_spent_time: زمان گذاشته شده روی هم
+  label_f_hour: "%{value} ساعت"
+  label_f_hour_plural: "%{value} ساعت"
+  label_time_tracking: پیگیری زمان
+  label_change_plural: جایگذاری
+  label_statistics: سرشماری
+  label_commits_per_month: تغییر در هر ماه
+  label_commits_per_author: تغییر هر نویسنده
+  label_view_diff: دیدن تفاوت‌ها
+  label_diff_inline: همراستا
+  label_diff_side_by_side: کنار به کنار
+  label_options: گزینه‌ها
+  label_copy_workflow_from: رونویسی گردش کار از روی
+  label_permissions_report: گزارش پروانه‌ها
+  label_watched_issues: پیامدهای دیده‌بانی شده
+  label_related_issues: پیامدهای وابسته
+  label_applied_status: وضعیت به کار رفته
+  label_loading: بار گذاری...
+  label_relation_new: وابستگی تازه
+  label_relation_delete: پاک کردن وابستگی
+  label_relates_to: وابسته به
+  label_duplicates: نگارش دیگری از
+  label_duplicated_by: نگارشی دیگر در
+  label_blocks: بازداشت‌ها
+  label_blocked_by: بازداشت به دست
+  label_precedes: جلوتر است از
+  label_follows: پستر است از
+  label_end_to_start: پایان به آغاز
+  label_end_to_end: پایان به پایان
+  label_start_to_start: آغاز به آغاز
+  label_start_to_end: آغاز به پایان
+  label_stay_logged_in: وارد شده بمانید
+  label_disabled: غیرفعال
+  label_show_completed_versions: نمایش نگارش‌های انجام شده
+  label_me: من
+  label_board: انجمن
+  label_board_new: انجمن تازه
+  label_board_plural: انجمن
+  label_board_locked: قفل شده
+  label_board_sticky: چسبناک
+  label_topic_plural: سرفصل
+  label_message_plural: پیام
+  label_message_last: آخرین پیام
+  label_message_new: پیام تازه
+  label_message_posted: پیام افزوده شد
+  label_reply_plural: پاسخ
+  label_send_information: فرستادن داده‌های حساب به کاربر
+  label_year: سال
+  label_month: ماه
+  label_week: هفته
+  label_date_from: از
+  label_date_to: تا
+  label_language_based: بر اساس زبان کاربر
+  label_sort_by: "جور کرد با %{value}"
+  label_send_test_email: فرستادن ایمیل آزمایشی
+  label_feeds_access_key: کلید دسترسی RSS
+  label_missing_feeds_access_key: کلید دسترسی RSS در دسترس نیست
+  label_feeds_access_key_created_on: "کلید دسترسی RSS %{value} پیش ساخته شده است"
+  label_module_plural: پیمانه
+  label_added_time_by: "افزوده شده به دست %{author} در %{age} پیش"
+  label_updated_time_by: "بروز شده به دست %{author} در %{age} پیش"
+  label_updated_time: "بروز شده در %{value} پیش"
+  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: فعالسازی حساب با ایمیل
+  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: دریافت
+  label_optional_description: توضیح اختیاری
+  label_add_another_file: افزودن پرونده دیگر
+  label_preferences: پسندها
+  label_chronological_order: به ترتیب تاریخ
+  label_reverse_chronological_order: برعکس ترتیب تاریخ
+  label_planning: برنامه ریزی
+  label_incoming_emails: ایمیل‌های آمده
+  label_generate_key: ساخت کلید
+  label_issue_watchers: دیده‌بان‌ها
+  label_example: نمونه
+  label_display: نمایش
+  label_sort: جور کرد
+  label_ascending: افزایشی
+  label_descending: کاهشی
+  label_date_from_to: از %{start} تا %{end}
+  label_wiki_content_added: برگه ویکی افزوده شد
+  label_wiki_content_updated: برگه ویکی بروز شد
+  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: در هنگام رونویسی پروژه ایمیل‌های آگاه‌سازی را بفرست
+  label_principal_search: "جستجو برای کاربر یا دسته:"
+  label_user_search: "جستجو برای کاربر:"
+  
+  button_login: ورود
+  button_submit: واگذاری
+  button_save: نگهداری
+  button_check_all: گزینش همه
+  button_uncheck_all: گزینش هیچ
+  button_delete: پاک
+  button_create: ساخت
+  button_create_and_continue: ساخت و ادامه
+  button_test: آزمایش
+  button_edit: ویرایش
+  button_edit_associated_wikipage: "ویرایش برگه ویکی وابسته: %{page_title}"
+  button_add: افزودن
+  button_change: ویرایش
+  button_apply: انجام
+  button_clear: پاک
+  button_lock: گذاشتن قفل
+  button_unlock: برداشتن قفل
+  button_download: دریافت
+  button_list: فهرست
+  button_view: دیدن
+  button_move: جابجایی
+  button_move_and_follow: جابجایی و ادامه
+  button_back: برگشت
+  button_cancel: بازگشت
+  button_activate: فعالسازی
+  button_sort: جور کرد
+  button_log_time: زمان‌نویسی
+  button_rollback: برگرد به این نگارش
+  button_watch: دیده‌بانی
+  button_unwatch: نا‌دیده‌بانی
+  button_reply: پاسخ
+  button_archive: بایگانی
+  button_unarchive: برگشت از بایگانی
+  button_reset: بازنشانی
+  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_registered: نام‌نویسی شده
+  status_locked: قفل
+  
+  version_status_open: باز
+  version_status_locked: قفل
+  version_status_closed: بسته
+
+  field_active: فعال
+  
+  text_select_mail_notifications: فرمان‌هایی که برای آن‌ها باید ایمیل فرستاده شود را برگزینید.
+  text_regexp_info: برای نمونه ^[A-Z0-9]+$
+  text_min_max_length_info: 0 یعنی بدون کران
+  text_project_destroy_confirmation: آیا براستی می‌خواهید این پروژه و همه داده‌های آن را پاک کنید؟
+  text_subprojects_destroy_warning: "زیرپروژه‌های آن: %{value} هم پاک خواهند شد."
+  text_workflow_edit: یک نقش و یک پیگرد را برای ویرایش گردش کار برگزینید
+  text_are_you_sure: آیا این کار انجام شود؟
+  text_are_you_sure_with_children: "آیا پیامد و همه زیرپیامدهای آن پاک شوند؟"
+  text_journal_changed: "«%{label}» از «%{old}» به «%{new}» جایگزین شد"
+  text_journal_set_to: "«%{label}» به «%{value}» نشانده شد"
+  text_journal_deleted: "«%{label}» پاک شد (%{old})"
+  text_journal_added: "«%{label}»، «%{value}» را افزود"
+  text_tip_task_begin_day: روز آغاز پیامد
+  text_tip_task_end_day: روز پایان پیامد
+  text_tip_task_begin_end_day: روز آغاز و پایان پیامد
+  text_project_identifier_info: 'تنها نویسه‌های کوچک (a-z)، شماره‌ها و خط تیره پذیرفتنی است.<br />پس از ذخیره سازی، شناسه نمی‌تواند جایگزین شود.'
+  text_caracters_maximum: "بیشترین اندازه %{count} است."
+  text_caracters_minimum: "کمترین اندازه %{count} است."
+  text_length_between: "باید میان %{min} و %{max} نویسه باشد."
+  text_tracker_no_workflow: هیچ گردش کاری برای این پیگرد مشخص نشده است
+  text_unallowed_characters: نویسه‌های ناپسند
+  text_comma_separated: چند مقدار پذیرفتنی است (با «,» از هم جدا شوند).
+  text_line_separated: چند مقدار پذیرفتنی است (هر مقدار در یک خط).
+  text_issues_ref_in_commit_messages: نشانه روی و بستن پیامدها در پیام‌های انباره
+  text_issue_added: "پیامد %{id} به دست %{author} گزارش شد."
+  text_issue_updated: "پیامد %{id} به دست %{author} بروز شد."
+  text_wiki_destroy_confirmation: آیا براستی می‌خواهید این ویکی و همه محتوای آن را پاک کنید؟
+  text_issue_category_destroy_question: "برخی پیامدها (%{count}) به این دسته واگذار شده‌اند. می‌خواهید چه کنید؟"
+  text_issue_category_destroy_assignments: پاک کردن واگذاری به دسته
+  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: "دریافت ایمیل پیکربندی نشده است و آگاه‌سازی‌ها غیر فعال هستند.\nکارگزار SMTP خود را در config/email.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند."
+  text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیام‌های انباره نگاشت می‌شود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت می‌شوند."
+  text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.'
+  text_custom_field_possible_values_info: 'یک خط برای هر مقدار'
+  text_wiki_page_destroy_question: "این برگه %{descendants} زیربرگه دارد.می‌خواهید چه کنید؟"
+  text_wiki_page_nullify_children: "زیربرگه‌ها برگه ریشه شوند"
+  text_wiki_page_destroy_children: "زیربرگه‌ها و زیربرگه‌های آن‌ها پاک شوند"
+  text_wiki_page_reassign_children: "زیربرگه‌ها به زیر این برگه پدر بروند"
+  text_own_membership_delete_confirmation: "شما دارید برخی یا همه پروانه‌های خود را برمی‌دارید و شاید پس از این دیگر نتوانید این پروژه را ویرایش کنید.\nآیا می‌خواهید این کار را بکنید؟"
+  text_zoom_in: درشتنمایی
+  text_zoom_out: ریزنمایی
+  
+  default_role_manager: سرپرست
+  default_role_developer: برنامه‌نویس
+  default_role_reporter: گزارش‌دهنده
+  default_tracker_bug: ایراد
+  default_tracker_feature: ویژگی
+  default_tracker_support: پشتیبانی
+  default_issue_status_new: تازه
+  default_issue_status_in_progress: در گردش
+  default_issue_status_resolved: درست شده
+  default_issue_status_feedback: بازخورد
+  default_issue_status_closed: بسته
+  default_issue_status_rejected: برگشت خورده
+  default_doc_category_user: نوشتار کاربر
+  default_doc_category_tech: نوشتار فنی
+  default_priority_low: پایین
+  default_priority_normal: میانه
+  default_priority_high: بالا
+  default_priority_urgent: زود
+  default_priority_immediate: بیدرنگ
+  default_activity_design: طراحی
+  default_activity_development: ساخت
+  
+  enumeration_issue_priorities: برتری‌های پیامد
+  enumeration_doc_categories: دسته‌های نوشتار
+  enumeration_activities: فعالیت‌ها (پیگیری زمان)
+  enumeration_system_activity: فعالیت سامانه
+
+  text_tip_issue_begin_day: issue beginning this day
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_tip_issue_begin_end_day: issue beginning and ending this day
+  text_tip_issue_end_day: issue ending this day
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/fi.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/fi.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -957,3 +957,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/fr.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/fr.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -307,6 +307,7 @@
   field_active: Actif
   field_parent_issue: Tâche parente
   field_visible: Visible
+  field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé"
   
   setting_app_title: Titre de l'application
   setting_app_subtitle: Sous-titre de l'application
@@ -596,6 +597,7 @@
   label_query: Rapport personnalisé
   label_query_plural: Rapports personnalisés
   label_query_new: Nouveau rapport
+  label_my_queries: Mes rapports personnalisés
   label_filter_add: "Ajouter le filtre "
   label_filter_plural: Filtres
   label_equals: égal
@@ -889,6 +891,7 @@
   text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
   text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page"
   text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?"
+  text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page."
   
   default_role_manager: "Manager "
   default_role_developer: "Développeur "
@@ -923,6 +926,7 @@
   error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
   error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
   text_journal_changed: "%{label} changé de %{old} à %{new}"
+  text_journal_changed_no_detail: "%{label} mis à jour"
   text_journal_set_to: "%{label} mis à %{value}"
   text_journal_deleted: "%{label} %{old} supprimé"
   text_journal_added: "%{label} %{value} ajouté"
--- a/config/locales/.svn/text-base/gl.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/gl.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -948,3 +948,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/he.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/he.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -941,3 +941,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/hr.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/hr.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -943,3 +943,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/hu.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/hu.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -955,3 +955,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/id.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/id.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -944,3 +944,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/it.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/it.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento
   notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare
   setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/ja.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/ja.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -957,3 +957,7 @@
   enumeration_doc_categories: 文書カテゴリ
   enumeration_activities: 作業分類 (時間トラッキング)
   enumeration_system_activity: システム作業分類
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/ko.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/ko.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -988,3 +988,7 @@
   setting_commit_logtime_enabled: 커밋 시점에 작업 시간 기록 활성화
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/lt.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/lt.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -996,3 +996,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/lv.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/lv.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -931,3 +931,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/mk.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/mk.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/mn.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/mn.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/nl.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/nl.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -918,3 +918,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/no.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/no.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -923,3 +923,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/pl.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/pl.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -953,3 +953,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/pt-BR.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/pt-BR.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -956,3 +956,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/pt.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/pt.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -940,3 +940,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/ro.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/ro.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -929,3 +929,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/ru.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/ru.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1049,3 +1049,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/sk.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/sk.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -931,3 +931,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/sl.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/sl.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -932,3 +932,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/sr-YU.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/sr-YU.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/sr.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/sr.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/sv.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/sv.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -977,3 +977,7 @@
   enumeration_doc_categories: Dokumentkategorier
   enumeration_activities: Aktiviteter (tidsuppföljning)
   enumeration_system_activity: Systemaktivitet
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/th.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/th.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -933,3 +933,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/tr.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/tr.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -955,3 +955,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/uk.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/uk.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -932,3 +932,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/vi.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/vi.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -987,3 +987,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/zh-TW.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/zh-TW.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1017,3 +1017,7 @@
   enumeration_doc_categories: 文件分類
   enumeration_activities: 活動 (時間追蹤)
   enumeration_system_activity: 系統活動
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/.svn/text-base/zh.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/.svn/text-base/zh.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -950,3 +950,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/bg.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/bg.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -303,6 +303,7 @@
   field_assigned_to_role: Assignee's role
   field_text: Текстово поле
   field_visible: Видим
+  field_warn_on_leaving_unsaved: Предупреди ме, когато напускам страница с незаписано съдържание
   
   setting_app_title: Заглавие
   setting_app_subtitle: Описание
@@ -594,6 +595,7 @@
   label_query: Потребителска справка
   label_query_plural: Потребителски справки
   label_query_new: Нова заявка
+  label_my_queries: Моите заявки
   label_filter_add: Добави филтър
   label_filter_plural: Филтри
   label_equals: е
@@ -908,6 +910,7 @@
   text_own_membership_delete_confirmation: "Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това да не можете да редактирате този проект.\nСигурен ли сте, че искате да продължите?"
   text_zoom_in: Увеличаване
   text_zoom_out: Намаляване
+  text_warn_on_leaving_unsaved: Страницата съдържа незаписано съдържание, което може да бъде загубено, ако я напуснете.
 
   default_role_manager: Мениджър
   default_role_developer: Разработчик
@@ -936,3 +939,4 @@
   enumeration_activities: Дейности (time tracking)
   enumeration_system_activity: Системна активност
 
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/bs.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/bs.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -950,3 +950,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/ca.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/ca.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -939,3 +939,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/cs.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/cs.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -1,4 +1,9 @@
+# Update to 1.1 by Michal Gebauer <mishak@mishak.net>
+# Updated by Josef Liška <jl@chl.cz>
+# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
+# Based on original CZ translation by Jan Kadleček
 cs:
+  # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
   direction: ltr
   date:
     formats:
@@ -26,7 +31,7 @@
       long: "%B %d, %Y %H:%M"
     am: "dop."
     pm: "odp."
-    
+      
   datetime:
     distance_in_words:
       half_a_minute: "půl minuty"
@@ -65,24 +70,26 @@
         other: "téměř %{count} roky"
 
   number:
+    # Výchozí formát pro čísla
     format:
-      separator: "."
+      separator: "." 
       delimiter: ""
       precision: 3
-    human: 
-      format: 
+    human:
+      format:
+        delimiter: ""
         precision: 1
-        delimiter: ""
-      storage_units: 
+      storage_units:
         format: "%n %u"
-        units: 
-          kb: KB
-          tb: TB
-          gb: GB
-          byte: 
-            one: Byte
-            other: Bytes
-          mb: MB
+        units:
+          byte:
+            one: "Bajt"
+            other: "Bajtů"
+          kb: "kB"
+          mb: "MB"
+          gb: "GB"
+          tb: "TB"
+
         
 # Used in array.to_sentence.
   support:
@@ -94,8 +101,8 @@
     errors:
       template:
         header:
-          one:    "1 error prohibited this %{model} from being saved"
-          other:  "%{count} errors prohibited this %{model} from being saved"
+          one:    "1 chyba zabránila uložení %{model}"
+          other:  "%{count} chyb zabránilo uložení %{model}"
       messages:
         inclusion: "není zahrnuto v seznamu"
         exclusion: "je rezervováno"
@@ -122,10 +129,6 @@
         circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
         cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
 
-  # Updated by Josef Liška <jl@chl.cz>
-  # CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
-  # Based on original CZ translation by Jan Kadleček
-  
   actionview_instancetag_blank_option: Prosím vyberte
   
   general_text_No: 'Ne'
@@ -154,20 +157,40 @@
   notice_successful_connection: Úspěšné připojení.
   notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
   notice_locking_conflict: Údaje byly změněny jiným uživatelem.
-  notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři.
   notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
+  notice_not_authorized_archived_project: Projekt ke kterému se snažíte přistupovat byl archivován.
   notice_email_sent: "Na adresu %{value} byl odeslán email"
   notice_email_error: "Při odesílání emailu nastala chyba (%{value})"
   notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
+  notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
   notice_failed_to_save_issues: "Chyba při uložení %{count} úkolu(ů) z %{total} vybraných: %{ids}."
+  notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}."
   notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
   notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
   notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
+  notice_unable_delete_version: Nemohu odstanit verzi
+  notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
+  notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
+  notice_gantt_chart_truncated: Graf byl oříznut, počet položek přesáhl limit pro zobrazení (%{max})
   
   error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: %{value}"
   error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři."
   error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: %{value}"
+  error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
   error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
+  error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
+  error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
+  error_can_not_delete_custom_field: Nelze smazat volitelné pole
+  error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
+  error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
+  error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
+  error_can_not_archive_project: Tento projekt nemůže být archivován
+  error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
+  error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
+  error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
+  error_unable_delete_issue_status: Nelze smazat stavy úkolů
+  error_unable_to_connect: Nelze se připojit (%{value})
+  warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit."
   
   mail_subject_lost_password: "Vaše heslo (%{value})"
   mail_body_lost_password: 'Pro změnu vašeho hesla klikněte na následující odkaz:'
@@ -177,6 +200,12 @@
   mail_body_account_information: Informace o vašem účtu
   mail_subject_account_activation_request: "Aktivace %{value} účtu"
   mail_body_account_activation_request: "Byl zaregistrován nový uživatel %{value}. Aktivace jeho účtu závisí na vašem potvrzení."
+  mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})"
+  mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několik dní (%{days}):"
+  mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána"
+  mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}."
+  mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována"
+  mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}."
   
   gui_validation_error: 1 chyba
   gui_validation_error_plural: "%{count} chyb(y)"
@@ -216,6 +245,7 @@
   field_priority: Priorita
   field_fixed_version: Cílová verze
   field_user: Uživatel
+  field_principal: Hlavní
   field_role: Role
   field_homepage: Domovská stránka
   field_is_public: Veřejný
@@ -260,10 +290,23 @@
   field_redirect_existing_links: Přesměrovat stvávající odkazy
   field_estimated_hours: Odhadovaná doba
   field_column_names: Sloupce
+  field_time_entries: Zaznamenaný čas
   field_time_zone: Časové pásmo
   field_searchable: Umožnit vyhledávání
   field_default_value: Výchozí hodnota
   field_comments_sorting: Zobrazit komentáře
+  field_parent_title: Rodičovská stránka
+  field_editable: Editovatelný
+  field_watcher: Sleduje
+  field_identity_url: OpenID URL
+  field_content: Obsah
+  field_group_by: Seskupovat výsledky podle
+  field_sharing: Sdílení
+  field_parent_issue: Rodičovský úkol
+  field_member_of_group: Skupina přiřaditele
+  field_assigned_to_role: Role přiřaditele
+  field_text: Textové pole
+  field_visible: Viditelný
   
   setting_app_title: Název aplikace
   setting_app_subtitle: Podtitulek aplikace
@@ -275,6 +318,7 @@
   setting_issues_export_limit: Limit pro export úkolů
   setting_mail_from: Odesílat emaily z adresy
   setting_bcc_recipients: Příjemci skryté kopie (bcc)
+  setting_plain_text_mail: pouze prostý text (ne HTML)
   setting_host_name: Jméno serveru
   setting_text_formatting: Formátování textu
   setting_wiki_compression: Komprese historie Wiki
@@ -290,12 +334,94 @@
   setting_cross_project_issue_relations: Povolit vazby úkolů napříč projekty
   setting_issue_list_default_columns: Výchozí sloupce zobrazené v seznamu úkolů
   setting_repositories_encodings: Kódování 
+  setting_commit_logs_encoding: Kódování zpráv při commitu
+  setting_emails_header: Hlavička emailů
   setting_emails_footer: Patička emailů
   setting_protocol: Protokol
   setting_per_page_options: Povolené počty řádků na stránce
   setting_user_format: Formát zobrazení uživatele
   setting_activity_days_default: Dny zobrazené v činnosti projektu
   setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu
+  setting_enabled_scm: Povolené SCM
+  setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
+  setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily
+  setting_mail_handler_api_key: API klíč
+  setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů
+  setting_gravatar_enabled: Použít uživatelské ikony Gravatar
+  setting_gravatar_default: Výchozí Gravatar
+  setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
+  setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce
+  setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru
+  setting_openid: Umožnit přihlašování a registrace s OpenID
+  setting_password_min_length: Minimální délka hesla
+  setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
+  setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
+  setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
+  setting_issue_done_ratio_issue_field: Použít pole úkolu
+  setting_issue_done_ratio_issue_status: Použít stav úkolu
+  setting_start_of_week: Začínat kalendáře
+  setting_rest_api_enabled: Zapnout službu REST
+  setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
+  setting_default_notification_option: Výchozí nastavení oznámení
+  setting_commit_logtime_enabled: Povolit zapisování času
+  setting_commit_logtime_activity_id: Aktivita pro zapsaný čas
+  setting_gantt_items_limit: Maximální počet položek zobrazený na ganttově grafu
+  
+  permission_add_project: Vytvořit projekt
+  permission_add_subprojects: Vytvořit podprojekty
+  permission_edit_project: Úprava projektů
+  permission_select_project_modules: Výběr modulů projektu
+  permission_manage_members: Spravování členství
+  permission_manage_project_activities: Spravovat aktivity projektu
+  permission_manage_versions: Spravování verzí
+  permission_manage_categories: Spravování kategorií úkolů
+  permission_view_issues: Zobrazit úkoly
+  permission_add_issues: Přidávání úkolů
+  permission_edit_issues: Upravování úkolů
+  permission_manage_issue_relations: Spravování vztahů mezi úkoly
+  permission_add_issue_notes: Přidávání poznámek
+  permission_edit_issue_notes: Upravování poznámek
+  permission_edit_own_issue_notes: Upravování vlastních poznámek
+  permission_move_issues: Přesouvání úkolů
+  permission_delete_issues: Mazání úkolů
+  permission_manage_public_queries: Správa veřejných dotazů
+  permission_save_queries: Ukládání dotazů
+  permission_view_gantt: Zobrazené Ganttova diagramu
+  permission_view_calendar: Prohlížení kalendáře
+  permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
+  permission_add_issue_watchers: Přidání sledujících uživatelů
+  permission_delete_issue_watchers: Smazat přihlížející
+  permission_log_time: Zaznamenávání stráveného času
+  permission_view_time_entries: Zobrazení stráveného času
+  permission_edit_time_entries: Upravování záznamů o stráveném času
+  permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase
+  permission_manage_news: Spravování novinek
+  permission_comment_news: Komentování novinek
+  permission_manage_documents: Správa dokumentů
+  permission_view_documents: Prohlížení dokumentů
+  permission_manage_files: Spravování souborů
+  permission_view_files: Prohlížení souborů
+  permission_manage_wiki: Spravování Wiki
+  permission_rename_wiki_pages: Přejmenovávání Wiki stránek
+  permission_delete_wiki_pages: Mazání stránek na Wiki
+  permission_view_wiki_pages: Prohlížení Wiki
+  permission_view_wiki_edits: Prohlížení historie Wiki
+  permission_edit_wiki_pages: Upravování stránek Wiki
+  permission_delete_wiki_pages_attachments: Mazání příloh
+  permission_protect_wiki_pages: Zabezpečení Wiki stránek
+  permission_manage_repository: Spravování repozitáře
+  permission_browse_repository: Procházení repozitáře
+  permission_view_changesets: Zobrazování sady změn
+  permission_commit_access: Commit přístup
+  permission_manage_boards: Správa diskusních fór
+  permission_view_messages: Prohlížení zpráv
+  permission_add_messages: Posílání zpráv
+  permission_edit_messages: Upravování zpráv
+  permission_edit_own_messages: Upravit vlastní zprávy
+  permission_delete_messages: Mazání zpráv
+  permission_delete_own_messages: Smazat vlastní zprávy
+  permission_export_wiki_pages: Exportovat Wiki stránky
+  permission_manage_subtasks: Spravovat podúkoly
   
   project_module_issue_tracking: Sledování úkolů
   project_module_time_tracking: Sledování času
@@ -305,10 +431,13 @@
   project_module_wiki: Wiki
   project_module_repository: Repozitář
   project_module_boards: Diskuse
+  project_module_calendar: Kalendář
+  project_module_gantt: Gantt
   
   label_user: Uživatel
   label_user_plural: Uživatelé
   label_user_new: Nový uživatel
+  label_user_anonymous: Anonymní
   label_project: Projekt
   label_project_new: Nový projekt
   label_project_plural: Projekty
@@ -355,11 +484,13 @@
   label_information_plural: Informace
   label_please_login: Prosím přihlašte se
   label_register: Registrovat
+  label_login_with_open_id_option: nebo se přihlašte s OpenID
   label_password_lost: Zapomenuté heslo
   label_home: Úvodní
   label_my_page: Moje stránka
   label_my_account: Můj účet
   label_my_projects: Moje projekty
+  label_my_page_block: Bloky na mé stránce
   label_administration: Administrace
   label_login: Přihlášení
   label_logout: Odhlášení
@@ -370,6 +501,7 @@
   label_registered_on: Registrován
   label_activity: Aktivita
   label_overall_activity: Celková aktivita
+  label_user_activity: "Aktivita uživatele: %{value}"
   label_new: Nový
   label_logged_as: Přihlášen jako
   label_environment: Prostředí
@@ -378,6 +510,8 @@
   label_auth_source_new: Nový mód autentifikace
   label_auth_source_plural: Módy autentifikace
   label_subproject_plural: Podprojekty
+  label_subproject_new: Nový podprojekt
+  label_and_its_subprojects: "%{value} a jeho  podprojekty"
   label_min_max_length: Min - Max délka
   label_list: Seznam
   label_date: Datum
@@ -411,6 +545,7 @@
   label_version: Verze
   label_version_new: Nová verze
   label_version_plural: Verze
+  label_close_versions: Zavřít dokončené verze
   label_confirmation: Potvrzení
   label_export_to: 'Také k dispozici:'
   label_read: Načítá se...
@@ -469,6 +604,8 @@
   label_not_equals: není
   label_in_less_than: je měší než
   label_in_more_than: je větší než
+  label_greater_or_equal: '>='
+  label_less_or_equal: '<='
   label_in: v
   label_today: dnes
   label_all_time: vše
@@ -491,15 +628,21 @@
   label_browse: Procházet
   label_modification: "%{count} změna"
   label_modification_plural: "%{count} změn"
+  label_branch: Větev
+  label_tag: Tag
   label_revision: Revize
   label_revision_plural: Revizí
+  label_revision_id: "Revize %{value}"
   label_associated_revisions: Související verze
   label_added: přidáno
   label_modified: změněno
+  label_copied: zkopírováno
+  label_renamed: přejmenováno
   label_deleted: odstraněno
   label_latest_revision: Poslední revize
   label_latest_revision_plural: Poslední revize
   label_view_revisions: Zobrazit revize
+  label_view_all_revisions: Zobrazit všechny revize
   label_max_size: Maximální velikost
   label_sort_highest: Přesunout na začátek
   label_sort_higher: Přesunout nahoru
@@ -525,6 +668,7 @@
   label_changes_details: Detail všech změn
   label_issue_tracking: Sledování úkolů
   label_spent_time: Strávený čas
+  label_overall_spent_time: Celkem strávený čas
   label_f_hour: "%{value} hodina"
   label_f_hour_plural: "%{value} hodin"
   label_time_tracking: Sledování času
@@ -545,7 +689,8 @@
   label_relation_new: Nová souvislost
   label_relation_delete: Odstranit souvislost
   label_relates_to: související s
-  label_duplicates: duplicity
+  label_duplicates: duplikuje
+  label_duplicated_by: zduplikován
   label_blocks: blokuje
   label_blocked_by: zablokován
   label_precedes: předchází
@@ -561,6 +706,8 @@
   label_board: Fórum
   label_board_new: Nové fórum
   label_board_plural: Fóra
+  label_board_locked: Uzamčeno
+  label_board_sticky: Nálepka
   label_topic_plural: Témata
   label_message_plural: Zprávy
   label_message_last: Poslední zpráva
@@ -576,9 +723,12 @@
   label_language_based: Podle výchozího jazyku
   label_sort_by: "Seřadit podle %{value}"
   label_send_test_email: Poslat testovací email
+  label_feeds_access_key: Přístupový klíč pro RSS
+  label_missing_feeds_access_key: Postrádá přístupový klíč pro RSS
   label_feeds_access_key_created_on: "Přístupový klíč pro RSS byl vytvořen před %{value}"
   label_module_plural: Moduly
   label_added_time_by: "Přidáno uživatelem %{author} před %{age}"
+  label_updated_time_by: "Aktualizováno uživatelem %{author} před %{age}"
   label_updated_time: "Aktualizováno před %{value}"
   label_jump_to_a_project: Vyberte projekt...
   label_file_plural: Soubory
@@ -591,6 +741,10 @@
   label_search_titles_only: Vyhledávat pouze v názvech
   label_user_mail_option_all: "Pro všechny události všech mých projektů"
   label_user_mail_option_selected: "Pro všechny události vybraných projektů..."
+  label_user_mail_option_none: "Žádné události"
+  label_user_mail_option_only_my_events: "Jen pro věci co sleduji nebo jsem v nich zapojen"
+  label_user_mail_option_only_assigned: "Jen pro všeci kterým sem přiřazen"
+  label_user_mail_option_only_owner: "Jen pro věci které vlastním"
   label_user_mail_no_self_notified: "Nezasílat informace o mnou vytvořených změnách"
   label_registration_activation_by_email: aktivace účtu emailem
   label_registration_manual_activation: manuální aktivace účtu
@@ -609,6 +763,40 @@
   label_preferences: Nastavení
   label_chronological_order: V chronologickém pořadí
   label_reverse_chronological_order: V obrácaném chronologickém pořadí
+  label_planning: Plánování
+  label_incoming_emails: Příchozí e-maily
+  label_generate_key: Generovat klíč
+  label_issue_watchers: Sledování
+  label_example: Příklad
+  label_display: Zobrazit
+  label_sort: Řazení
+  label_ascending: Vzestupně
+  label_descending: Sestupně
+  label_date_from_to: Od %{start} do %{end}
+  label_wiki_content_added: Wiki stránka přidána
+  label_wiki_content_updated: Wiki stránka aktualizována
+  label_group: Skupina
+  label_group_plural: Skupiny
+  label_group_new: Nová skupina
+  label_time_entry_plural: Strávený čas
+  label_version_sharing_none: Nesdíleno
+  label_version_sharing_descendants: S podprojekty
+  label_version_sharing_hierarchy: S hierarchií projektu
+  label_version_sharing_tree: Se stromem projektu
+  label_version_sharing_system: Se všemi projekty
+  label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
+  label_copy_source: Zdroj
+  label_copy_target: Cíl
+  label_copy_same_as_target: Stejný jako cíl
+  label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
+  label_api_access_key: API přístupový klíč
+  label_missing_api_access_key: Chybějící přístupový klíč API
+  label_api_access_key_created_on: API přístupový klíč vytvořen %{value} 
+  label_profile: Profil
+  label_subtask_plural: Podúkol
+  label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
+  label_principal_search: "Hledat uživatele nebo skupinu:"
+  label_user_search: "Hledat uživatele:"
   
   button_login: Přihlásit
   button_submit: Potvrdit
@@ -617,8 +805,10 @@
   button_uncheck_all: Odšrtnout vše
   button_delete: Odstranit
   button_create: Vytvořit
-  button_test: Test
+  button_create_and_continue: Vytvořit a pokračovat
+  button_test: Testovat
   button_edit: Upravit
+  button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}"
   button_add: Přidat
   button_change: Změnit
   button_apply: Použít
@@ -629,6 +819,7 @@
   button_list: Vypsat
   button_view: Zobrazit
   button_move: Přesunout
+  button_move_and_follow: Přesunout a následovat
   button_back: Zpět
   button_cancel: Storno
   button_activate: Aktivovat
@@ -640,24 +831,40 @@
   button_reply: Odpovědět
   button_archive: Archivovat
   button_unarchive: Odarchivovat
-  button_reset: Reset
+  button_reset: Resetovat
   button_rename: Přejmenovat
   button_change_password: Změnit heslo
   button_copy: Kopírovat
+  button_copy_and_follow: Kopírovat a následovat
   button_annotate: Komentovat
   button_update: Aktualizovat
   button_configure: Konfigurovat
+  button_quote: Citovat
+  button_duplicate: Duplikát
+  button_show: Zobrazit
   
   status_active: aktivní
   status_registered: registrovaný
   status_locked: uzamčený
   
+  version_status_open: otevřený
+  version_status_locked: uzamčený
+  version_status_closed: zavřený
+  
+  field_active: Aktivní
+  
   text_select_mail_notifications: Vyberte akci při které bude zasláno upozornění emailem.
   text_regexp_info: např. ^[A-Z0-9]+$
   text_min_max_length_info: 0 znamená bez limitu
   text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
+  text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány."
   text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
   text_are_you_sure: Jste si jisti?
+  text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
+  text_journal_changed: "%{label} změněn z %{old} na %{new}"
+  text_journal_set_to: "%{label} nastaven na %{value}"
+  text_journal_deleted: "%{label} smazán (%{old})"
+  text_journal_added: "%{label} %{value} přidán"
   text_tip_issue_begin_day: úkol začíná v tento den
   text_tip_issue_end_day: úkol končí v tento den
   text_tip_issue_begin_end_day: úkol začíná a končí v tento den
@@ -668,6 +875,7 @@
   text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce
   text_unallowed_characters: Nepovolené znaky
   text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
+  text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
   text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů
   text_issue_added: "Úkol %{id} byl vytvořen uživatelem %{author}."
   text_issue_updated: "Úkol %{id} byl aktualizován uživatelem %{author}."
@@ -679,15 +887,31 @@
   text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit"
   text_load_default_configuration: Nahrát výchozí konfiguraci
   text_status_changed_by_changeset: "Použito v changesetu %{value}."
+  text_time_logged_by_changeset: Aplikováno v changesetu %{value}.
   text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
   text_select_project_modules: 'Aktivní moduly v tomto projektu:'
   text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
   text_file_repository_writable: Povolen zápis do adresáře ukládání souborů
+  text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
   text_rmagick_available: RMagick k dispozici (volitelné)
   text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno %{hours} práce. Co chete udělat?"
   text_destroy_time_entries: Odstranit evidované hodiny.
   text_assign_time_entries_to_project: Přiřadit evidované hodiny projektu
   text_reassign_time_entries: 'Přeřadit evidované hodiny k tomuto úkolu:'
+  text_user_wrote: "%{value} napsal:"
+  text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě."
+  text_enumeration_category_reassign_to: 'Přeřadit je do této:'
+  text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/email.yml a restartujte aplikaci."
+  text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
+  text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
+  text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
+  text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat?
+  text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
+  text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
+  text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
+  text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?"
+  text_zoom_in: Přiblížit
+  text_zoom_out: Oddálit
   
   default_role_manager: Manažer
   default_role_developer: Vývojář
@@ -714,225 +938,9 @@
   enumeration_issue_priorities: Priority úkolů
   enumeration_doc_categories: Kategorie dokumentů
   enumeration_activities: Aktivity (sledování času)
-  error_scm_annotate: "Položka neexistuje nebo nemůže být komentována."
-  label_planning: Plánování
-  text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány."
-  label_and_its_subprojects: "%{value} a jeho  podprojekty"
-  mail_body_reminder: "%{count} úkol(ů), které máte přiřazeny má termín během několik dní (%{days}):"
-  mail_subject_reminder: "%{count} úkol(ů) má termín během několik dní (%{days})"
-  text_user_wrote: "%{value} napsal:"
-  label_duplicated_by: duplikováno od
-  setting_enabled_scm: Povolené SCM
-  text_enumeration_category_reassign_to: 'Přeřadit je do této:'
-  text_enumeration_destroy_question: "Několik (%{count}) objektů je přiřazeno k této hodnotě."
-  label_incoming_emails: Příchozí e-maily
-  label_generate_key: Generovat klíč
-  setting_mail_handler_api_enabled: Povolit WS pro příchozí e-maily
-  setting_mail_handler_api_key: API klíč
-  text_email_delivery_not_configured: "Doručování e-mailů není nastaveno a odesílání notifikací je zakázáno.\nNastavte Váš SMTP server v souboru config/configuration.yml a restartujte aplikaci."
-  field_parent_title: Rodičovská stránka
-  label_issue_watchers: Sledování
-  setting_commit_logs_encoding: Kódování zpráv při commitu
-  button_quote: Citovat
-  setting_sequential_project_identifiers: Generovat sekvenční identifikátory projektů
-  notice_unable_delete_version: Nemohu odstanit verzi
-  label_renamed: přejmenováno
-  label_copied: zkopírováno
-  setting_plain_text_mail: pouze prostý text (ne HTML)
-  permission_view_files: Prohlížení souborů
-  permission_edit_issues: Upravování úkolů
-  permission_edit_own_time_entries: Upravování vlastních zázamů o stráveném čase
-  permission_manage_public_queries: Správa veřejných dotazů
-  permission_add_issues: Přidávání úkolů
-  permission_log_time: Zaznamenávání stráveného času
-  permission_view_changesets: Zobrazování sady změn
-  permission_view_time_entries: Zobrazení stráveného času
-  permission_manage_versions: Spravování verzí
-  permission_manage_wiki: Spravování Wiki
-  permission_manage_categories: Spravování kategorií úkolů
-  permission_protect_wiki_pages: Zabezpečení Wiki stránek
-  permission_comment_news: Komentování novinek
-  permission_delete_messages: Mazání zpráv
-  permission_select_project_modules: Výběr modulů projektu
-  permission_manage_documents: Správa dokumentů
-  permission_edit_wiki_pages: Upravování stránek Wiki
-  permission_add_issue_watchers: Přidání sledujících uživatelů
-  permission_view_gantt: Zobrazené Ganttova diagramu
-  permission_move_issues: Přesouvání úkolů
-  permission_manage_issue_relations: Spravování vztahů mezi úkoly
-  permission_delete_wiki_pages: Mazání stránek na Wiki
-  permission_manage_boards: Správa diskusních fór
-  permission_delete_wiki_pages_attachments: Mazání příloh
-  permission_view_wiki_edits: Prohlížení historie Wiki
-  permission_add_messages: Posílání zpráv
-  permission_view_messages: Prohlížení zpráv
-  permission_manage_files: Spravování souborů
-  permission_edit_issue_notes: Upravování poznámek
-  permission_manage_news: Spravování novinek
-  permission_view_calendar: Prohlížení kalendáře
-  permission_manage_members: Spravování členství
-  permission_edit_messages: Upravování zpráv
-  permission_delete_issues: Mazání úkolů
-  permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
-  permission_manage_repository: Spravování repozitáře
-  permission_commit_access: Commit přístup
-  permission_browse_repository: Procházení repozitáře
-  permission_view_documents: Prohlížení dokumentů
-  permission_edit_project: Úprava projektů
-  permission_add_issue_notes: Přidávání poznámek
-  permission_save_queries: Ukládání dotazů
-  permission_view_wiki_pages: Prohlížení Wiki
-  permission_rename_wiki_pages: Přejmenovávání Wiki stránek
-  permission_edit_time_entries: Upravování záznamů o stráveném času
-  permission_edit_own_issue_notes: Upravování vlastních poznámek
-  setting_gravatar_enabled: Použít uživatelské ikony Gravatar
-  label_example: Příklad
-  text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
-  permission_edit_own_messages: Upravit vlastní zprávy
-  permission_delete_own_messages: Smazat vlastní zprávy
-  label_user_activity: "Aktivita uživatele: %{value}"
-  label_updated_time_by: "Akutualizováno: %{author} před: %{age}"
-  text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
-  setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
-  text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
-  warning_attachments_not_saved: "%{count} soubor(ů) nebylo možné uložit."
-  button_create_and_continue: Vytvořit a pokračovat
-  text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
-  label_display: Zobrazit
-  field_editable: Editovatelný
-  setting_repository_log_display_limit: Maximální počet revizí zobrazených v logu souboru
-  setting_file_max_size_displayed: Maximální velikost textových souborů zobrazených přímo na stránce
-  field_watcher: Sleduje
-  setting_openid: Umožnit přihlašování a registrace s OpenID
-  field_identity_url: OpenID URL
-  label_login_with_open_id_option: nebo se přihlašte s OpenID
-  field_content: Obsah
-  label_descending: Sestupně
-  label_sort: Řazení
-  label_ascending: Vzestupně
-  label_date_from_to: Od %{start} do %{end}
-  label_greater_or_equal: ">="
-  label_less_or_equal: <=
-  text_wiki_page_destroy_question: Tato stránka má %{descendants} podstránek a potomků. Co chcete udělat?
-  text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
-  text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
-  text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
-  setting_password_min_length: Minimální délka hesla
-  field_group_by: Seskupovat výsledky podle
-  mail_subject_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována"
-  label_wiki_content_added: Wiki stránka přidána
-  mail_subject_wiki_content_added: "'%{id}' Wiki stránka byla přidána"
-  mail_body_wiki_content_added: "'%{id}' Wiki stránka byla přidána od %{author}."
-  label_wiki_content_updated: Wiki stránka aktualizována
-  mail_body_wiki_content_updated: "'%{id}' Wiki stránka byla aktualizována od %{author}."
-  permission_add_project: Vytvořit projekt
-  setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
-  label_view_all_revisions: Zobrazit všechny revize
-  label_tag: Tag
-  label_branch: Branch
-  error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
-  error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
-  text_journal_changed: "%{label} změněn z %{old} na %{new}"
-  text_journal_set_to: "%{label} nastaven na %{value}"
-  text_journal_deleted: "%{label} smazán (%{old})"
-  label_group_plural: Skupiny
-  label_group: Skupina
-  label_group_new: Nová skupina
-  label_time_entry_plural: Strávený čas
-  text_journal_added: "%{label} %{value} přidán"
-  field_active: Aktivní
   enumeration_system_activity: Systémová aktivita
-  permission_delete_issue_watchers: Smazat přihlížející
-  version_status_closed: zavřený
-  version_status_locked: uzamčený
-  version_status_open: otevřený
-  error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
-  label_user_anonymous: Anonymní
-  button_move_and_follow: Přesunout a následovat
-  setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
-  setting_gravatar_default: Výchozí Gravatar
-  field_sharing: Sdílení
-  label_version_sharing_hierarchy: S hierarchií projektu
-  label_version_sharing_system: Se všemi projekty
-  label_version_sharing_descendants: S podprojekty
-  label_version_sharing_tree: Se stromem projektu
-  label_version_sharing_none: Nesdíleno
-  error_can_not_archive_project: Tento projekt nemůže být archivován
-  button_duplicate: Duplikát
-  button_copy_and_follow: Kopírovat a následovat
-  label_copy_source: Zdroj
-  setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
-  setting_issue_done_ratio_issue_status: Použít stav úkolu
-  error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
-  error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
-  setting_issue_done_ratio_issue_field: Použít pole úkolu
-  label_copy_same_as_target: Stejný jako cíl
-  label_copy_target: Cíl
-  notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
-  error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
-  label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
-  setting_start_of_week: Začínat kalendáře
-  permission_view_issues: Zobrazit úkoly
-  label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
-  label_revision_id: Revize %{value}
-  label_api_access_key: API přístupový klíč
-  label_api_access_key_created_on: API přístupový klíč vytvořen %{value} 
-  label_feeds_access_key: RSS přístupový klíč
-  notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
-  setting_rest_api_enabled: Zapnout službu REST
-  label_missing_api_access_key: Chybějící přístupový klíč API
-  label_missing_feeds_access_key: Chybějící přístupový klíč RSS
-  button_show: Zobrazit
-  text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
-  setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
-  permission_add_subprojects: Vytvořit podprojekty
-  label_subproject_new: Nový podprojekt
-  text_own_membership_delete_confirmation: |-
-    Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.
-    Opravdu chcete pokračovat?
-  label_close_versions: Zavřít dokončené verze
-  label_board_sticky: Nálepka
-  label_board_locked: Uzamčeno
-  permission_export_wiki_pages: Exportovat Wiki stránky
-  setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
-  permission_manage_project_activities: Spravovat aktivity projektu
-  error_unable_delete_issue_status: Nelze smazat stavy úkolů
-  label_profile: Profil
-  permission_manage_subtasks: Spravovat podúkoly
-  field_parent_issue: Rodičovský úkol
-  label_subtask_plural: Podúkol
-  label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
-  error_can_not_delete_custom_field: Nelze smazat volitelné pole
-  error_unable_to_connect: Nelze se připojit (%{value})
-  error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
-  error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
-  field_principal: Hlavní
-  label_my_page_block: Bloky na mé stránce
-  notice_failed_to_save_members: "Nepodařilo se uložit člena(y): %{errors}."
-  text_zoom_out: Oddálit
-  text_zoom_in: Přiblížit
-  notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
-  label_overall_spent_time: Celkově strávený čas
-  field_time_entries: Zaznamenaný čas
-  project_module_gantt: Gantt
-  project_module_calendar: Kalendář
-  button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: %{page_title}"
-  text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
-  field_text: Textové pole
-  label_user_mail_option_only_owner: Only for things I am the owner of
-  setting_default_notification_option: Default notification option
-  label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
-  label_user_mail_option_only_assigned: Only for things I am assigned to
-  label_user_mail_option_none: No events
-  field_member_of_group: Assignee's group
-  field_assigned_to_role: Assignee's role
-  notice_not_authorized_archived_project: The project you're trying to access has been archived.
-  label_principal_search: "Search for user or group:"
-  label_user_search: "Search for user:"
-  field_visible: Visible
-  setting_emails_header: Emails header
-  setting_commit_logtime_activity_id: Activity for logged time
-  text_time_logged_by_changeset: Applied in changeset %{value}.
-  setting_commit_logtime_enabled: Enable time logging
-  notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
-  setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/da.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/da.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -952,3 +952,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/de.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/de.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -953,3 +953,7 @@
   setting_commit_logtime_enabled: Aktiviere Zeitlogging
   notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max})
   setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden.
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/el.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/el.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/en-GB.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/en-GB.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -940,3 +940,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/en.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/en.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -303,6 +303,7 @@
   field_assigned_to_role: "Assignee's role"
   field_text: Text field
   field_visible: Visible
+  field_warn_on_leaving_unsaved: "Warn me when leaving a page with unsaved text"
   
   setting_app_title: Application title
   setting_app_subtitle: Application subtitle
@@ -594,6 +595,7 @@
   label_query: Custom query
   label_query_plural: Custom queries
   label_query_new: New query
+  label_my_queries: My custom queries
   label_filter_add: Add filter
   label_filter_plural: Filters
   label_equals: is
@@ -858,6 +860,7 @@
   text_are_you_sure: Are you sure ?
   text_are_you_sure_with_children: "Delete issue and all child issues?"
   text_journal_changed: "%{label} changed from %{old} to %{new}"
+  text_journal_changed_no_detail: "%{label} updated"
   text_journal_set_to: "%{label} set to %{value}"
   text_journal_deleted: "%{label} deleted (%{old})"
   text_journal_added: "%{label} %{value} added"
@@ -908,6 +911,7 @@
   text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
   text_zoom_in: Zoom in
   text_zoom_out: Zoom out
+  text_warn_on_leaving_unsaved: "The current page contains unsaved text that will be lost if you leave this page."
   
   default_role_manager: Manager
   default_role_developer: Developer
--- a/config/locales/es.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/es.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -973,3 +973,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/eu.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/eu.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -99,8 +99,8 @@
     errors:
       template:
         header:
-          one:    "1 error prohibited this %{model} from being saved"
-          other:  "%{count} errors prohibited this %{model} from being saved"
+          one:    "Errore batek %{model} hau godetzea galarazi du."
+          other:  "%{count} errorek %{model} hau gordetzea galarazi dute."
       messages:
         inclusion: "ez dago zerrendan"
         exclusion: "erreserbatuta dago"
@@ -125,7 +125,7 @@
         greater_than_start_date: "hasiera data baino handiagoa izan behar du"
         not_same_project: "ez dago proiektu berdinean"
         circular_dependency: "Erlazio honek mendekotasun zirkular bat sortuko luke"
-        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: "Zeregin bat ezin da bere azpiataza batekin estekatu."
 
   actionview_instancetag_blank_option: Hautatu mesedez
   
@@ -277,7 +277,7 @@
   field_issue_to: Erlazionatutako zereginak
   field_delay: Atzerapena
   field_assignable: Arazoak rol honetara esleitu daitezke
-  field_redirect_existing_links: Existitzen diren estelak berbideratu
+  field_redirect_existing_links: Existitzen diren estekak berbideratu
   field_estimated_hours: Estimatutako denbora
   field_column_names: Zutabeak
   field_time_zone: Ordu zonaldea
@@ -318,7 +318,7 @@
   setting_cross_project_issue_relations: Zereginak proiektuen artean erlazionatzea baimendu
   setting_issue_list_default_columns: Zereginen zerrendan defektuz ikusten diren zutabeak
   setting_repositories_encodings: Biltegien kodeketak
-  setting_commit_logs_encoding: Commit-en mezuen kodetzea
+  setting_commit_logs_encoding: Commit-en egunkarien kodetzea
   setting_emails_footer: Eposten oina
   setting_protocol: Protokoloa
   setting_per_page_options: Orriko objektuen aukerak
@@ -363,7 +363,7 @@
   permission_delete_issues: Zereginak ezabatu
   permission_manage_public_queries: Galdera publikoak kudeatu
   permission_save_queries: Galderak gorde
-  permission_view_gantt: Gantt diagrama ikusi
+  permission_view_gantt: Gantt grafikoa ikusi
   permission_view_calendar: Egutegia ikusi
   permission_view_issue_watchers: Behatzaileen zerrenda ikusi
   permission_add_issue_watchers: Behatzaileak gehitu
@@ -441,7 +441,7 @@
   label_tracker: Aztarnaria
   label_tracker_plural: Aztarnariak
   label_tracker_new: Aztarnari berria
-  label_workflow: Workflow
+  label_workflow: Lan-fluxua
   label_issue_status: Zeregin egoera
   label_issue_status_plural: Zeregin egoerak
   label_issue_status_new: Egoera berria
@@ -506,7 +506,7 @@
   label_file_added: Fitxategia gehituta
   label_report: Berri ematea
   label_report_plural: Berri emateak
-  label_news: Beria
+  label_news: Berria
   label_news_new: Berria gehitu
   label_news_plural: Berriak
   label_news_latest: Azken berriak
@@ -553,7 +553,7 @@
   label_add_note: Oharra gehitu
   label_per_page: Orriko
   label_calendar: Egutegia
-  label_months_from: months from
+  label_months_from: hilabete noiztik
   label_gantt: Gantt
   label_internal: Barnekoa
   label_last_changes: "azken %{count} aldaketak"
@@ -784,7 +784,7 @@
   button_cancel: Ezeztatu
   button_activate: Gahitu
   button_sort: Ordenatu
-  button_log_time: Denbora apuntatu
+  button_log_time: Denbora erregistratu
   button_rollback: Itzuli bertsio honetara
   button_watch: Behatu
   button_unwatch: Behatzen utzi
@@ -824,9 +824,9 @@
   text_journal_set_to: "%{label}-k %{value} balioa hartu du"
   text_journal_deleted: "%{label} ezabatuta (%{old})"
   text_journal_added: "%{label} %{value} gehituta"
-  text_tip_issue_begin_day: gaur hasten diren atazak
-  text_tip_issue_end_day: gaur bukatzen diren atazak
-  text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren atazak
+  text_tip_issue_begin_day: gaur hasten diren zereginak
+  text_tip_issue_end_day: gaur bukatzen diren zereginak
+  text_tip_issue_begin_end_day: gaur hasi eta bukatzen diren zereginak
   text_project_identifier_info: 'Letra xeheak (a-z), zenbakiak eta marrak erabil daitezke bakarrik.<br />Gorde eta gero identifikadorea ezin da aldatu.'
   text_caracters_maximum: "%{count} karaktere gehienez."
   text_caracters_minimum: "Gutxienez %{count} karaktereetako luzerakoa izan behar du."
@@ -895,7 +895,7 @@
   enumeration_doc_categories: Dokumentu kategoriak
   enumeration_activities: Jarduerak (denbora kontrola))
   enumeration_system_activity: Sistemako Jarduera
-  label_board_sticky: Itxaskorra
+  label_board_sticky: Itsaskorra
   label_board_locked: Blokeatuta
   permission_export_wiki_pages: Wiki orriak esportatu
   setting_cache_formatted_text: Formatudun testua katxeatu
@@ -903,40 +903,44 @@
   error_unable_delete_issue_status: Ezine da zereginaren egoera ezabatu
   label_profile: Profila
   permission_manage_subtasks: Azpiatazak kudeatu
-  field_parent_issue: Guraso ataza
+  field_parent_issue: Zeregin gurasoa
   label_subtask_plural: Azpiatazak
   label_project_copy_notifications: Proiektua kopiatzen den bitartean eposta jakinarazpenak bidali
-  error_can_not_delete_custom_field: Ezin da eremu pertsonallizatua ezabatu
+  error_can_not_delete_custom_field: Ezin da eremu pertsonalizatua ezabatu
   error_unable_to_connect: Ezin da konektatu (%{value})
   error_can_not_remove_role: Rol hau erabiltzen hari da eta ezin da ezabatu.
   error_can_not_delete_tracker: Aztarnari honek zereginak ditu eta ezin da ezabatu.
-  field_principal: Principal
-  label_my_page_block: My page block
-  notice_failed_to_save_members: "Failed to save member(s): %{errors}."
-  text_zoom_out: Zoom out
-  text_zoom_in: Zoom in
-  notice_unable_delete_time_entry: Unable to delete time log entry.
-  label_overall_spent_time: Overall spent time
-  field_time_entries: Log time
+  field_principal: Ekintzaile
+  label_my_page_block: "Nire orriko blokea"
+  notice_failed_to_save_members: "Kidea(k) gordetzean errorea: %{errors}."
+  text_zoom_out: Zooma txikiagotu
+  text_zoom_in: Zooma handiagotu
+  notice_unable_delete_time_entry: "Ezin da hautatutako denbora erregistroa ezabatu."
+  label_overall_spent_time: Igarotako denbora guztira
+  field_time_entries: "Denbora erregistratu"
   project_module_gantt: Gantt
-  project_module_calendar: Calendar
-  button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
-  text_are_you_sure_with_children: Delete issue and all child issues?
-  field_text: Text field
-  label_user_mail_option_only_owner: Only for things I am the owner of
-  setting_default_notification_option: Default notification option
-  label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
-  label_user_mail_option_only_assigned: Only for things I am assigned to
-  label_user_mail_option_none: No events
-  field_member_of_group: Assignee's group
-  field_assigned_to_role: Assignee's role
-  notice_not_authorized_archived_project: The project you're trying to access has been archived.
-  label_principal_search: "Search for user or group:"
-  label_user_search: "Search for user:"
-  field_visible: Visible
-  setting_emails_header: Emails header
-  setting_commit_logtime_activity_id: Activity for logged time
-  text_time_logged_by_changeset: Applied in changeset %{value}.
-  setting_commit_logtime_enabled: Enable time logging
-  notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
-  setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  project_module_calendar: Egutegia
+  button_edit_associated_wikipage: "Esleitutako wiki orria editatu: %{page_title}"
+  text_are_you_sure_with_children: "Zeregina eta azpi zeregin guztiak ezabatu?"
+  field_text: Testu eremua
+  label_user_mail_option_only_owner: "Jabea naizen gauzetarako barrarik"
+  setting_default_notification_option: "Lehenetsitako ohartarazpen aukera"
+  label_user_mail_option_only_my_events: "Behatzen ditudan edo partaide naizen gauzetarako bakarrik"
+  label_user_mail_option_only_assigned: "Niri esleitutako gauzentzat bakarrik"
+  label_user_mail_option_none: "Gertakaririk ez"
+  field_member_of_group: "Esleituta duenaren taldea"
+  field_assigned_to_role: "Esleituta duenaren rola"
+  notice_not_authorized_archived_project: "Atzitu nahi duzun proiektua artxibatua izan da."
+  label_principal_search: "Bilatu erabiltzaile edo taldea:"
+  label_user_search: "Erabiltzailea bilatu:"
+  field_visible: Ikusgai
+  setting_emails_header: "Eposten goiburua"
+  setting_commit_logtime_activity_id: "Erregistratutako denboraren jarduera"
+  text_time_logged_by_changeset: "%{value} aldaketan egindakoa."
+  setting_commit_logtime_enabled: "Erregistrutako denbora gaitu"
+  notice_gantt_chart_truncated: Grafikoa moztu da bistara daitekeen elementuen kopuru maximoa gainditu delako (%{max})
+  setting_gantt_items_limit: "Gantt grafikoan bistara daitekeen elementu kopuru maximoa"
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/config/locales/fa.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,945 @@
+fa:
+  # Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
+  direction: rtl
+  date:
+    formats:
+      # Use the strftime parameters for formats.
+      # When no format has been given, it uses default.
+      # You can provide other formats here if you like!
+      default: "%Y/%m/%d"
+      short: "%b %d"
+      long: "%B %d, %Y"
+      
+    day_names: [یک‌شنبه, دوشنبه, سه‌شنبه, چهارشنبه, پنج‌شنبه, آدینه, شنبه]
+    abbr_day_names: [یک, دو, سه, چهار, پنج, آدینه, شنبه]
+      
+    # Don't forget the nil at the beginning; there's no such thing as a 0th month
+    month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر]
+    abbr_month_names: [~, ژان, فور, مار, آور, مه, ژوئن, ژوئیه, اوت, سپت, اکت, نوا, دسا]
+    # Used in date_select and datime_select.
+    order: [ :year, :month, :day ]
+
+  time:
+    formats:
+      default: "%Y/%m/%d %p %I:%M"
+      time: "%p %I:%M"
+      short: "%d %b %H:%M"
+      long: "%B %d, %Y %H:%M"
+    am: "ق.ظ"
+    pm: "ب.ظ"
+      
+  datetime:
+    distance_in_words:
+      half_a_minute: "نیم دقیقه"
+      less_than_x_seconds:
+        one:   "کمتر از 1 ثانیه"
+        other: "کمتر از %{count} ثانیه"
+      x_seconds:
+        one:   "1 ثانیه"
+        other: "%{count} ثانیه"
+      less_than_x_minutes:
+        one:   "کمتر از 1 دقیقه"
+        other: "کمتر از %{count} دقیقه"
+      x_minutes:
+        one:   "1 دقیقه"
+        other: "%{count} دقیقه"
+      about_x_hours:
+        one:   "نزدیک 1 ساعت"
+        other: "نزدیک %{count} ساعت"
+      x_days:
+        one:   "1 روز"
+        other: "%{count} روز"
+      about_x_months:
+        one:   "نزدیک 1 ماه"
+        other: "نزدیک %{count} ماه"
+      x_months:
+        one:   "1 ماه"
+        other: "%{count} ماه"
+      about_x_years:
+        one:   "نزدیک 1 سال"
+        other: "نزدیک %{count} سال"
+      over_x_years:
+        one:   "بیش از 1 سال"
+        other: "بیش از %{count} سال"
+      almost_x_years:
+        one:   "نزدیک 1 سال"
+        other: "نزدیک %{count} سال"
+
+  number:
+    # Default format for numbers
+    format:
+      separator: "٫" 
+      delimiter: ""
+      precision: 3
+    human:
+      format:
+        delimiter: ""
+        precision: 1
+      storage_units:
+        format: "%n %u"
+        units:
+          byte:
+            one: "بایت"
+            other: "بایت"
+          kb: "کیلوبایت"
+          mb: "مگابایت"
+          gb: "گیگابایت"
+          tb: "ترابایت"
+
+        
+# Used in array.to_sentence.
+  support:
+    array:
+      sentence_connector: "و"
+      skip_last_comma: false
+      
+  activerecord:
+    errors:
+      template:
+        header:
+          one:    "1 ایراد از ذخیره سازی این %{model} جلوگیری کرد"
+          other:  "%{count} ایراد از ذخیره سازی این %{model} جلوگیری کرد"
+      messages:
+        inclusion: "در فهرست نیامده است"
+        exclusion: "رزرو شده است"
+        invalid: "نادرست است"
+        confirmation: "با بررسی سازگاری ندارد"
+        accepted: "باید پذیرفته شود"
+        empty: "نمی‌تواند تهی باشد"
+        blank: "نمی‌تواند تهی باشد"
+        too_long: "خیلی بلند است (بیشترین اندازه %{count} نویسه است)"
+        too_short: "خیلی کوتاه است (کمترین اندازه %{count} نویسه است)"
+        wrong_length: "اندازه نادرست است (باید %{count} نویسه باشد)"
+        taken: "پیش از این گرفته شده است"
+        not_a_number: "شماره درستی نیست"
+        not_a_date: "تاریخ درستی نیست"
+        greater_than: "باید بزرگتر از %{count} باشد"
+        greater_than_or_equal_to: "باید بزرگتر از یا برابر با %{count} باشد"
+        equal_to: "باید برابر با %{count} باشد"
+        less_than: "باید کمتر از %{count} باشد"
+        less_than_or_equal_to: "باید کمتر از یا برابر با %{count} باشد"
+        odd: "باید فرد باشد"
+        even: "باید زوج باشد"
+        greater_than_start_date: "باید از تاریخ آغاز بزرگتر باشد"
+        not_same_project: "به همان پروژه وابسته نیست"
+        circular_dependency: "این وابستگی یک وابستگی دایره وار خواهد ساخت"
+        cant_link_an_issue_with_a_descendant: "یک پیامد نمی‌تواند به یکی از زیر کارهایش پیوند بخورد"
+
+  actionview_instancetag_blank_option: گزینش کنید
+  
+  general_text_No: 'خیر'
+  general_text_Yes: 'آری'
+  general_text_no: 'خیر'
+  general_text_yes: 'آری'
+  general_lang_name: 'Persian (پارسی)'
+  general_csv_separator: ','
+  general_csv_decimal_separator: '.'
+  general_csv_encoding: UTF-8
+  general_pdf_encoding: UTF-8
+  general_first_day_of_week: '6'
+  
+  notice_account_updated: حساب شما بروز شد.
+  notice_account_invalid_creditentials: نام کاربری یا گذرواژه نادرست است
+  notice_account_password_updated: گذرواژه بروز شد
+  notice_account_wrong_password: گذرواژه نادرست است
+  notice_account_register_done: حساب ساخته شد. برای فعال نمودن آن، روی پیوندی که به شما ایمیل شده کلیک کنید.
+  notice_account_unknown_email: کاربر شناخته نشد.
+  notice_can_t_change_password:  این حساب یک روش شناسایی بیرونی را به کار گرفته است. گذرواژه را نمی‌توان جایگزین کرد.
+  notice_account_lost_email_sent: یک ایمیل با راهنمایی درباره گزینش گذرواژه تازه برای شما فرستاده شد.
+  notice_account_activated: حساب شما فعال شده است. اکنون می‌توانید وارد شوید.
+  notice_successful_create: با موفقیت ساخته شد.
+  notice_successful_update: با موفقیت بروز شد.
+  notice_successful_delete: با موفقیت برداشته شد.
+  notice_successful_connection: با موفقیت متصل شد.
+  notice_file_not_found: برگه درخواستی شما در دسترس نیست یا پاک شده است.
+  notice_locking_conflict: داده‌ها را کاربر دیگری بروز کرده است.
+  notice_not_authorized: شما به این برگه دسترسی ندارید.
+  notice_not_authorized_archived_project: پروژه درخواستی شما بایگانی شده است.
+  notice_email_sent: "یک ایمیل به %{value} فرستاده شد."
+  notice_email_error: "یک ایراد در فرستادن ایمیل پیش آمد (%{value})."
+  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: زمان گزارش شده را نمی‌توان پاک کرد.
+  notice_issue_done_ratios_updated: اندازه انجام شده پیامد بروز شد.
+  notice_gantt_chart_truncated: "نمودار بریده شد چون از بیشترین شماری که می‌توان نشان داد بزگتر است (%{max})."
+  
+  error_can_t_load_default_data: "پیکربندی پیش‌گزیده نمی‌تواند بار شود: %{value}"
+  error_scm_not_found: "بخش یا نگارش در انباره پیدا نشد."
+  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: 'یک پیگرد یا نقش منبع را برگزینید.'
+  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_body_lost_password: 'برای جایگزینی گذرواژه خود، بر روی پیوند زیر کلیک کنید:'
+  mail_subject_register: "فعالسازی حساب %{value} شما"
+  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: "برگه ویکی «%{id}» افزوده شد"
+  mail_body_wiki_content_added: "برگه ویکی «%{id}» به دست %{author} افزوده شد."
+  mail_subject_wiki_content_updated: "برگه ویکی «%{id}» بروز شد"
+  mail_body_wiki_content_updated: "برگه ویکی «%{id}» به دست %{author} بروز شد."
+  
+  gui_validation_error: 1 ایراد
+  gui_validation_error_plural: "%{count} ایراد"
+  
+  field_name: نام
+  field_description: توضیح
+  field_summary: خلاصه
+  field_is_required: الزامی
+  field_firstname: نام کوچک
+  field_lastname: نام خانوادگی
+  field_mail: ایمیل
+  field_filename: پرونده
+  field_filesize: اندازه
+  field_downloads: دریافت‌ها
+  field_author: نویسنده
+  field_created_on: ساخته شده در
+  field_updated_on: بروز شده در
+  field_field_format: قالب
+  field_is_for_all: برای همه پروژه‌ها
+  field_possible_values: مقادیر ممکن
+  field_regexp: عبارت منظم
+  field_min_length: کمترین اندازه
+  field_max_length: بیشترین اندازه
+  field_value: مقدار
+  field_category: دسته
+  field_title: عنوان
+  field_project: پروژه
+  field_issue: پیامد
+  field_status: وضعیت
+  field_notes: یادداشت‌ها
+  field_is_closed: پیامد بسته شده
+  field_is_default: مقدار پیش‌گزیده
+  field_tracker: پیگرد
+  field_subject: موضوع
+  field_due_date: زمان سررسید
+  field_assigned_to: واگذار شده به
+  field_priority: برتری
+  field_fixed_version: نگارش هدف
+  field_user: کاربر
+  field_principal: دستور دهنده
+  field_role: نقش
+  field_homepage: برگه خانه
+  field_is_public: همگانی
+  field_parent: پروژه پدر
+  field_is_in_roadmap: این پیامدها در نقشه راه نشان داده شوند
+  field_login: ورود
+  field_mail_notification: آگاه سازی‌های ایمیلی
+  field_admin: سرپرست
+  field_last_login_on: آخرین ورود
+  field_language: زبان
+  field_effective_date: تاریخ
+  field_password: گذرواژه
+  field_new_password: گذرواژه تازه
+  field_password_confirmation: بررسی گذرواژه
+  field_version: نگارش
+  field_type: گونه
+  field_host: میزبان
+  field_port: درگاه
+  field_account: حساب
+  field_base_dn: DN پایه
+  field_attr_login: نشانه ورود
+  field_attr_firstname: نشانه نام کوچک
+  field_attr_lastname: نشانه نام خانوادگی
+  field_attr_mail: نشانه ایمیل
+  field_onthefly: ساخت کاربر بیدرنگ
+  field_start_date: تاریخ آغاز
+  field_done_ratio: ٪ انجام شده
+  field_auth_source: روش شناسایی
+  field_hide_mail: ایمیل من پنهان شود
+  field_comments: دیدگاه
+  field_url: نشانی
+  field_start_page: برگه آغاز
+  field_subproject: زیر پروژه
+  field_hours: ساعت‌
+  field_activity: فعالیت
+  field_spent_on: در تاریخ
+  field_identifier: شناسه
+  field_is_filter: پالایش پذیر
+  field_issue_to: پیامد وابسته
+  field_delay: دیرکرد
+  field_assignable: پیامدها می‌توانند به این نقش واگذار شوند
+  field_redirect_existing_links: پیوندهای پیشین  به پیوند تازه راهنمایی شوند
+  field_estimated_hours: زمان برآورد شده
+  field_column_names: ستون‌ها
+  field_time_entries: زمان نوشتن
+  field_time_zone: پهنه زمانی
+  field_searchable: جستجو پذیر
+  field_default_value: مقدار پیش‌گزیده
+  field_comments_sorting: نمایش دیدگاه‌ها
+  field_parent_title: برگه پدر
+  field_editable: ویرایش پذیر
+  field_watcher: دیده‌بان
+  field_identity_url: نشانی OpenID
+  field_content: محتوا
+  field_group_by: دسته بندی با
+  field_sharing: اشتراک گذاری
+  field_parent_issue: کار پدر
+  field_member_of_group: "دسته واگذار شونده"
+  field_assigned_to_role: "نقش واگذار شونده"
+  field_text: فیلد متنی
+  field_visible: آشکار
+  
+  setting_app_title: نام برنامه
+  setting_app_subtitle: زیرنام برنامه
+  setting_welcome_text: نوشتار خوش‌آمد گویی
+  setting_default_language: زبان پیش‌گزیده
+  setting_login_required: الزامی بودن ورود
+  setting_self_registration: خود نام نویسی
+  setting_attachment_max_size: بیشترین اندازه پیوست
+  setting_issues_export_limit: کرانه صدور پییامدها
+  setting_mail_from: نشانی فرستنده ایمیل
+  setting_bcc_recipients: گیرندگان ایمیل دیده نشوند (bcc)
+  setting_plain_text_mail: ایمیل نوشته ساده (بدون HTML)
+  setting_host_name: نام میزبان و نشانی
+  setting_text_formatting: قالب بندی نوشته
+  setting_wiki_compression: فشرده‌سازی پیشینه ویکی
+  setting_feeds_limit: کرانه محتوای خوراک
+  setting_default_projects_public: حالت پیش‌گزیده پروژه‌های تازه، همگانی است
+  setting_autofetch_changesets: دریافت خودکار تغییرات
+  setting_sys_api_enabled: فعال سازی وب سرویس برای سرپرستی انباره
+  setting_commit_ref_keywords: کلیدواژه‌های نشانه
+  setting_commit_fix_keywords: کلیدواژه‌های انجام
+  setting_autologin: ورود خودکار
+  setting_date_format: قالب تاریخ
+  setting_time_format: قالب زمان
+  setting_cross_project_issue_relations: توانایی وابستگی میان پروژه‌ای پیامدها
+  setting_issue_list_default_columns: ستون‌های پیش‌گزیده نمایش داده شده در فهرست پیامدها
+  setting_repositories_encodings: کدگذاری انباره‌ها
+  setting_commit_logs_encoding: کدگذاری پیام‌های انباره
+  setting_emails_header: سرنویس ایمیل‌ها
+  setting_emails_footer: پانویس ایمیل‌ها
+  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: "بریدن ایمیل‌ها پس از یکی از این ردیف‌ها"
+  setting_mail_handler_api_enabled: فعالسازی وب سرویس برای ایمیل‌های آمده
+  setting_mail_handler_api_key: کلید API
+  setting_sequential_project_identifiers: ساخت پشت سر هم شناسه پروژه
+  setting_gravatar_enabled: کاربرد Gravatar برای عکس کاربر
+  setting_gravatar_default: عکس Gravatar پیش‌گزیده
+  setting_diff_max_lines_displayed: بیشترین اندازه ردیف‌های تفاوت نشان داده شده
+  setting_file_max_size_displayed: بیشترین اندازه پرونده‌های نمایش داده شده درون خطی
+  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
+  setting_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: ذخیره سازی پرس‌وجوها
+  permission_view_gantt: دیدن نمودار گانت
+  permission_view_calendar: دیدن گاهشمار
+  permission_view_issue_watchers: دیدن فهرست دیده‌بان‌ها
+  permission_add_issue_watchers: افزودن دیده‌بان‌ها
+  permission_delete_issue_watchers: پاک کردن دیده‌بان‌ها
+  permission_log_time: نوشتن زمان گذاشته شده
+  permission_view_time_entries: دیدن زمان گذاشته شده
+  permission_edit_time_entries: ویرایش زمان گذاشته شده
+  permission_edit_own_time_entries: ویرایش زمان گذاشته شده خود
+  permission_manage_news: سرپرستی رویدادها
+  permission_comment_news: گذاشتن دیدگاه روی رویدادها
+  permission_manage_documents: سرپرستی نوشتارها
+  permission_view_documents: دیدن نوشتارها
+  permission_manage_files: سرپرستی پرونده‌ها
+  permission_view_files: دیدن پرونده‌ها
+  permission_manage_wiki: سرپرستی ویکی
+  permission_rename_wiki_pages: نامگذاری برگه ویکی
+  permission_delete_wiki_pages: پاک کردن برگه ویکی
+  permission_view_wiki_pages: دیدن ویکی
+  permission_view_wiki_edits: دیدن پیشینه ویکی
+  permission_edit_wiki_pages: ویرایش برگه‌های ویکی
+  permission_delete_wiki_pages_attachments: پاک کردن پیوست‌های برگه ویکی
+  permission_protect_wiki_pages: نگه‌داری برگه‌های ویکی
+  permission_manage_repository: سرپرستی انباره
+  permission_browse_repository: چریدن در انباره
+  permission_view_changesets: دیدن تغییرات
+  permission_commit_access: دسترسی تغییر انباره
+  permission_manage_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: صدور برگه‌های ویکی
+  permission_manage_subtasks: سرپرستی زیرکارها
+  
+  project_module_issue_tracking: پیگیری پیامدها
+  project_module_time_tracking: پیگیری زمان
+  project_module_news: رویدادها
+  project_module_documents: نوشتارها
+  project_module_files: پرونده‌ها
+  project_module_wiki: ویکی
+  project_module_repository: انباره
+  project_module_boards: انجمن‌ها
+  project_module_calendar: گاهشمار
+  project_module_gantt: گانت
+  
+  label_user: کاربر
+  label_user_plural: کاربر
+  label_user_new: کاربر تازه
+  label_user_anonymous: ناشناس
+  label_project: پروژه
+  label_project_new: پروژه تازه
+  label_project_plural: پروژه
+  label_x_projects:
+    zero:  بدون پروژه
+    one:   "1 پروژه"
+    other: "%{count} پروژه"
+  label_project_all: همه پروژه‌ها
+  label_project_latest: آخرین پروژه‌ها
+  label_issue: پیامد
+  label_issue_new: پیامد تازه
+  label_issue_plural: پیامد
+  label_issue_view_all: دیدن همه پیامدها
+  label_issues_by: "پیامدهای دست%{value}"
+  label_issue_added: پیامد افزوده شد
+  label_issue_updated: پیامد بروز شد
+  label_document: نوشتار
+  label_document_new: نوشتار تازه
+  label_document_plural: نوشتار
+  label_document_added: نوشتار افزوده شد
+  label_role: نقش
+  label_role_plural: نقش
+  label_role_new: نقش تازه
+  label_role_and_permissions: نقش‌ها و پروانه‌ها
+  label_member: عضو
+  label_member_new: عضو تازه
+  label_member_plural: عضو
+  label_tracker: پیگرد
+  label_tracker_plural: پیگرد
+  label_tracker_new: پیگرد تازه
+  label_workflow: گردش کار
+  label_issue_status: وضعیت پیامد
+  label_issue_status_plural: وضعیت پیامد
+  label_issue_status_new: وضعیت تازه
+  label_issue_category: دسته پیامد
+  label_issue_category_plural: دسته پیامد
+  label_issue_category_new: دسته تازه
+  label_custom_field: فیلد سفارشی
+  label_custom_field_plural: فیلد سفارشی
+  label_custom_field_new: فیلد سفارشی تازه
+  label_enumerations: برشمردنی‌ها
+  label_enumeration_new: مقدار تازه
+  label_information: داده
+  label_information_plural: داده
+  label_please_login: وارد شوید
+  label_register: نام نویسی کنید
+  label_login_with_open_id_option: یا با OpenID وارد شوید
+  label_password_lost: بازیافت گذرواژه
+  label_home: سرآغاز
+  label_my_page: برگه من
+  label_my_account: حساب من
+  label_my_projects: پروژه‌های من
+  label_my_page_block: بخش برگه من
+  label_administration: سرپرستی
+  label_login: ورود
+  label_logout: خروج
+  label_help: راهنما
+  label_reported_issues: پیامدهای گزارش شده
+  label_assigned_to_me_issues: پیامدهای واگذار شده به من
+  label_last_login: آخرین ورود
+  label_registered_on: نام نویسی شده در
+  label_activity: فعالیت
+  label_overall_activity: فعالیت روی هم رفته
+  label_user_activity: "فعالیت %{value}"
+  label_new: تازه
+  label_logged_as: "نام کاربری:"
+  label_environment: محیط
+  label_authentication: شناسایی
+  label_auth_source: روش شناسایی
+  label_auth_source_new: روش شناسایی تازه
+  label_auth_source_plural: روش شناسایی
+  label_subproject_plural: زیرپروژه
+  label_subproject_new: زیرپروژه تازه
+  label_and_its_subprojects: "%{value} و زیرپروژه‌هایش"
+  label_min_max_length: کمترین و بیشترین اندازه
+  label_list: فهرست
+  label_date: تاریخ
+  label_integer: شماره درست
+  label_float: شماره شناور
+  label_boolean: درست/نادرست
+  label_string: نوشته
+  label_text: نوشته بلند
+  label_attribute: نشانه
+  label_attribute_plural: نشانه
+  label_download: "%{count} بار دریافت شده"
+  label_download_plural: "%{count} بار دریافت شده"
+  label_no_data: هیچ داده‌ای برای نمایش نیست
+  label_change_status: جایگزینی وضعیت
+  label_history: پیشینه
+  label_attachment: پرونده
+  label_attachment_new: پرونده تازه
+  label_attachment_delete: پاک کردن پرونده
+  label_attachment_plural: پرونده
+  label_file_added: پرونده افزوده شد
+  label_report: گزارش
+  label_report_plural: گزارش
+  label_news: رویداد
+  label_news_new: افزودن رویداد
+  label_news_plural: رویداد
+  label_news_latest: آخرین رویدادها
+  label_news_view_all: دیدن همه رویدادها
+  label_news_added: رویداد افزوده شد
+  label_settings: پیکربندی
+  label_overview: دورنما
+  label_version: نگارش
+  label_version_new: نگارش تازه
+  label_version_plural: نگارش
+  label_close_versions: بستن نگارش‌های انجام شده
+  label_confirmation: بررسی
+  label_export_to: 'قالب‌های دیگر:'
+  label_read: خواندن...
+  label_public_projects: پروژه‌های همگانی
+  label_open_issues: باز
+  label_open_issues_plural: باز
+  label_closed_issues: بسته
+  label_closed_issues_plural: بسته
+  label_x_open_issues_abbr_on_total:
+    zero:  0 باز از %{total}
+    one:   1 باز از %{total}
+    other: "%{count} باز از %{total}"
+  label_x_open_issues_abbr:
+    zero:  0 باز
+    one:   1 باز
+    other: "%{count} باز"
+  label_x_closed_issues_abbr:
+    zero:  0 بسته
+    one:   1 بسته
+    other: "%{count} بسته"
+  label_total: جمله
+  label_permissions: پروانه‌ها
+  label_current_status: وضعیت کنونی
+  label_new_statuses_allowed: وضعیت‌های پذیرفتنی تازه
+  label_all: همه
+  label_none: هیچ
+  label_nobody: هیچکس
+  label_next: پسین
+  label_previous: پیشین
+  label_used_by: به کار رفته در
+  label_details: ریزه‌کاری
+  label_add_note: افزودن یادداشت
+  label_per_page: ردیف‌ها در هر برگه
+  label_calendar: گاهشمار
+  label_months_from: از ماه
+  label_gantt: گانت
+  label_internal: درونی
+  label_last_changes: "%{count} تغییر آخر"
+  label_change_view_all: دیدن همه تغییرات
+  label_personalize_page: سفارشی نمودن این برگه
+  label_comment: دیدگاه
+  label_comment_plural: دیدگاه
+  label_x_comments:
+    zero: بدون دیدگاه
+    one: 1 دیدگاه
+    other: "%{count} دیدگاه"
+  label_comment_add: افزودن دیدگاه
+  label_comment_added: دیدگاه افزوده شد
+  label_comment_delete: پاک کردن دیدگاه‌ها
+  label_query: پرس‌وجوی سفارشی
+  label_query_plural: پرس‌وجوی سفارشی
+  label_query_new: پرس‌وجوی تازه
+  label_filter_add: افزودن پالایه
+  label_filter_plural: پالایه
+  label_equals: برابر است با
+  label_not_equals: برابر نیست با
+  label_in_less_than: کمتر است از
+  label_in_more_than: بیشتر است از
+  label_greater_or_equal: بیشتر یا برابر است با
+  label_less_or_equal: کمتر یا برابر است با
+  label_in: در
+  label_today: امروز
+  label_all_time: همیشه
+  label_yesterday: دیروز
+  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_more_than_ago: بیشتر از چند روز پیشین
+  label_ago: روز پیشین
+  label_contains: دارد
+  label_not_contains: ندارد
+  label_day_plural: روز
+  label_repository: انباره
+  label_repository_plural: انباره
+  label_browse: چریدن
+  label_modification: "%{count} جایگذاری"
+  label_modification_plural: "%{count} جایگذاری"
+  label_branch: شاخه
+  label_tag: برچسب
+  label_revision: بازبینی
+  label_revision_plural: بازبینی
+  label_revision_id: "بازبینی %{value}"
+  label_associated_revisions: بازبینی‌های وابسته
+  label_added: افزوده شده
+  label_modified: پیراسته شده
+  label_copied: رونویسی شده
+  label_renamed: نامگذاری شده
+  label_deleted: پاکسازی شده
+  label_latest_revision: آخرین بازبینی
+  label_latest_revision_plural: آخرین بازبینی
+  label_view_revisions: دیدن بازبینی‌ها
+  label_view_all_revisions: دیدن همه بازبینی‌ها
+  label_max_size: بیشترین اندازه
+  label_sort_highest: بردن به آغاز
+  label_sort_higher: بردن به بالا
+  label_sort_lower: بردن به پایین
+  label_sort_lowest: بردن به پایان
+  label_roadmap: نقشه راه
+  label_roadmap_due_in: "سررسید در %{value}"
+  label_roadmap_overdue: "%{value} دیرکرد"
+  label_roadmap_no_issues: هیچ پیامدی برای این نگارش نیست
+  label_search: جستجو
+  label_result_plural: دست‌آورد
+  label_all_words: همه واژه‌ها
+  label_wiki: ویکی
+  label_wiki_edit: ویرایش ویکی
+  label_wiki_edit_plural: ویرایش ویکی
+  label_wiki_page: برگه ویکی
+  label_wiki_page_plural: برگه ویکی
+  label_index_by_title: شاخص بر اساس نام
+  label_index_by_date: شاخص بر اساس تاریخ
+  label_current_version: نگارش کنونی
+  label_preview: پیش‌نمایش
+  label_feed_plural: خوراک
+  label_changes_details: ریز همه جایگذاری‌ها
+  label_issue_tracking: پیگیری پیامد
+  label_spent_time: زمان گذاشته شده
+  label_overall_spent_time: زمان گذاشته شده روی هم
+  label_f_hour: "%{value} ساعت"
+  label_f_hour_plural: "%{value} ساعت"
+  label_time_tracking: پیگیری زمان
+  label_change_plural: جایگذاری
+  label_statistics: سرشماری
+  label_commits_per_month: تغییر در هر ماه
+  label_commits_per_author: تغییر هر نویسنده
+  label_view_diff: دیدن تفاوت‌ها
+  label_diff_inline: همراستا
+  label_diff_side_by_side: کنار به کنار
+  label_options: گزینه‌ها
+  label_copy_workflow_from: رونویسی گردش کار از روی
+  label_permissions_report: گزارش پروانه‌ها
+  label_watched_issues: پیامدهای دیده‌بانی شده
+  label_related_issues: پیامدهای وابسته
+  label_applied_status: وضعیت به کار رفته
+  label_loading: بار گذاری...
+  label_relation_new: وابستگی تازه
+  label_relation_delete: پاک کردن وابستگی
+  label_relates_to: وابسته به
+  label_duplicates: نگارش دیگری از
+  label_duplicated_by: نگارشی دیگر در
+  label_blocks: بازداشت‌ها
+  label_blocked_by: بازداشت به دست
+  label_precedes: جلوتر است از
+  label_follows: پستر است از
+  label_end_to_start: پایان به آغاز
+  label_end_to_end: پایان به پایان
+  label_start_to_start: آغاز به آغاز
+  label_start_to_end: آغاز به پایان
+  label_stay_logged_in: وارد شده بمانید
+  label_disabled: غیرفعال
+  label_show_completed_versions: نمایش نگارش‌های انجام شده
+  label_me: من
+  label_board: انجمن
+  label_board_new: انجمن تازه
+  label_board_plural: انجمن
+  label_board_locked: قفل شده
+  label_board_sticky: چسبناک
+  label_topic_plural: سرفصل
+  label_message_plural: پیام
+  label_message_last: آخرین پیام
+  label_message_new: پیام تازه
+  label_message_posted: پیام افزوده شد
+  label_reply_plural: پاسخ
+  label_send_information: فرستادن داده‌های حساب به کاربر
+  label_year: سال
+  label_month: ماه
+  label_week: هفته
+  label_date_from: از
+  label_date_to: تا
+  label_language_based: بر اساس زبان کاربر
+  label_sort_by: "جور کرد با %{value}"
+  label_send_test_email: فرستادن ایمیل آزمایشی
+  label_feeds_access_key: کلید دسترسی RSS
+  label_missing_feeds_access_key: کلید دسترسی RSS در دسترس نیست
+  label_feeds_access_key_created_on: "کلید دسترسی RSS %{value} پیش ساخته شده است"
+  label_module_plural: پیمانه
+  label_added_time_by: "افزوده شده به دست %{author} در %{age} پیش"
+  label_updated_time_by: "بروز شده به دست %{author} در %{age} پیش"
+  label_updated_time: "بروز شده در %{value} پیش"
+  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: فعالسازی حساب با ایمیل
+  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: دریافت
+  label_optional_description: توضیح اختیاری
+  label_add_another_file: افزودن پرونده دیگر
+  label_preferences: پسندها
+  label_chronological_order: به ترتیب تاریخ
+  label_reverse_chronological_order: برعکس ترتیب تاریخ
+  label_planning: برنامه ریزی
+  label_incoming_emails: ایمیل‌های آمده
+  label_generate_key: ساخت کلید
+  label_issue_watchers: دیده‌بان‌ها
+  label_example: نمونه
+  label_display: نمایش
+  label_sort: جور کرد
+  label_ascending: افزایشی
+  label_descending: کاهشی
+  label_date_from_to: از %{start} تا %{end}
+  label_wiki_content_added: برگه ویکی افزوده شد
+  label_wiki_content_updated: برگه ویکی بروز شد
+  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: در هنگام رونویسی پروژه ایمیل‌های آگاه‌سازی را بفرست
+  label_principal_search: "جستجو برای کاربر یا دسته:"
+  label_user_search: "جستجو برای کاربر:"
+  
+  button_login: ورود
+  button_submit: واگذاری
+  button_save: نگهداری
+  button_check_all: گزینش همه
+  button_uncheck_all: گزینش هیچ
+  button_delete: پاک
+  button_create: ساخت
+  button_create_and_continue: ساخت و ادامه
+  button_test: آزمایش
+  button_edit: ویرایش
+  button_edit_associated_wikipage: "ویرایش برگه ویکی وابسته: %{page_title}"
+  button_add: افزودن
+  button_change: ویرایش
+  button_apply: انجام
+  button_clear: پاک
+  button_lock: گذاشتن قفل
+  button_unlock: برداشتن قفل
+  button_download: دریافت
+  button_list: فهرست
+  button_view: دیدن
+  button_move: جابجایی
+  button_move_and_follow: جابجایی و ادامه
+  button_back: برگشت
+  button_cancel: بازگشت
+  button_activate: فعالسازی
+  button_sort: جور کرد
+  button_log_time: زمان‌نویسی
+  button_rollback: برگرد به این نگارش
+  button_watch: دیده‌بانی
+  button_unwatch: نا‌دیده‌بانی
+  button_reply: پاسخ
+  button_archive: بایگانی
+  button_unarchive: برگشت از بایگانی
+  button_reset: بازنشانی
+  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_registered: نام‌نویسی شده
+  status_locked: قفل
+  
+  version_status_open: باز
+  version_status_locked: قفل
+  version_status_closed: بسته
+
+  field_active: فعال
+  
+  text_select_mail_notifications: فرمان‌هایی که برای آن‌ها باید ایمیل فرستاده شود را برگزینید.
+  text_regexp_info: برای نمونه ^[A-Z0-9]+$
+  text_min_max_length_info: 0 یعنی بدون کران
+  text_project_destroy_confirmation: آیا براستی می‌خواهید این پروژه و همه داده‌های آن را پاک کنید؟
+  text_subprojects_destroy_warning: "زیرپروژه‌های آن: %{value} هم پاک خواهند شد."
+  text_workflow_edit: یک نقش و یک پیگرد را برای ویرایش گردش کار برگزینید
+  text_are_you_sure: آیا این کار انجام شود؟
+  text_are_you_sure_with_children: "آیا پیامد و همه زیرپیامدهای آن پاک شوند؟"
+  text_journal_changed: "«%{label}» از «%{old}» به «%{new}» جایگزین شد"
+  text_journal_set_to: "«%{label}» به «%{value}» نشانده شد"
+  text_journal_deleted: "«%{label}» پاک شد (%{old})"
+  text_journal_added: "«%{label}»، «%{value}» را افزود"
+  text_tip_task_begin_day: روز آغاز پیامد
+  text_tip_task_end_day: روز پایان پیامد
+  text_tip_task_begin_end_day: روز آغاز و پایان پیامد
+  text_project_identifier_info: 'تنها نویسه‌های کوچک (a-z)، شماره‌ها و خط تیره پذیرفتنی است.<br />پس از ذخیره سازی، شناسه نمی‌تواند جایگزین شود.'
+  text_caracters_maximum: "بیشترین اندازه %{count} است."
+  text_caracters_minimum: "کمترین اندازه %{count} است."
+  text_length_between: "باید میان %{min} و %{max} نویسه باشد."
+  text_tracker_no_workflow: هیچ گردش کاری برای این پیگرد مشخص نشده است
+  text_unallowed_characters: نویسه‌های ناپسند
+  text_comma_separated: چند مقدار پذیرفتنی است (با «,» از هم جدا شوند).
+  text_line_separated: چند مقدار پذیرفتنی است (هر مقدار در یک خط).
+  text_issues_ref_in_commit_messages: نشانه روی و بستن پیامدها در پیام‌های انباره
+  text_issue_added: "پیامد %{id} به دست %{author} گزارش شد."
+  text_issue_updated: "پیامد %{id} به دست %{author} بروز شد."
+  text_wiki_destroy_confirmation: آیا براستی می‌خواهید این ویکی و همه محتوای آن را پاک کنید؟
+  text_issue_category_destroy_question: "برخی پیامدها (%{count}) به این دسته واگذار شده‌اند. می‌خواهید چه کنید؟"
+  text_issue_category_destroy_assignments: پاک کردن واگذاری به دسته
+  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: "دریافت ایمیل پیکربندی نشده است و آگاه‌سازی‌ها غیر فعال هستند.\nکارگزار SMTP خود را در config/email.yml پیکربندی کنید و برنامه را بازنشانی کنید تا فعال شوند."
+  text_repository_usernames_mapping: "کاربر Redmine که به هر نام کاربری پیام‌های انباره نگاشت می‌شود را برگزینید.\nکاربرانی که نام کاربری یا ایمیل همسان دارند، خود به خود نگاشت می‌شوند."
+  text_diff_truncated: '... این تفاوت بریده شده چون بیشتر از بیشترین اندازه نمایش دادنی است.'
+  text_custom_field_possible_values_info: 'یک خط برای هر مقدار'
+  text_wiki_page_destroy_question: "این برگه %{descendants} زیربرگه دارد.می‌خواهید چه کنید؟"
+  text_wiki_page_nullify_children: "زیربرگه‌ها برگه ریشه شوند"
+  text_wiki_page_destroy_children: "زیربرگه‌ها و زیربرگه‌های آن‌ها پاک شوند"
+  text_wiki_page_reassign_children: "زیربرگه‌ها به زیر این برگه پدر بروند"
+  text_own_membership_delete_confirmation: "شما دارید برخی یا همه پروانه‌های خود را برمی‌دارید و شاید پس از این دیگر نتوانید این پروژه را ویرایش کنید.\nآیا می‌خواهید این کار را بکنید؟"
+  text_zoom_in: درشتنمایی
+  text_zoom_out: ریزنمایی
+  
+  default_role_manager: سرپرست
+  default_role_developer: برنامه‌نویس
+  default_role_reporter: گزارش‌دهنده
+  default_tracker_bug: ایراد
+  default_tracker_feature: ویژگی
+  default_tracker_support: پشتیبانی
+  default_issue_status_new: تازه
+  default_issue_status_in_progress: در گردش
+  default_issue_status_resolved: درست شده
+  default_issue_status_feedback: بازخورد
+  default_issue_status_closed: بسته
+  default_issue_status_rejected: برگشت خورده
+  default_doc_category_user: نوشتار کاربر
+  default_doc_category_tech: نوشتار فنی
+  default_priority_low: پایین
+  default_priority_normal: میانه
+  default_priority_high: بالا
+  default_priority_urgent: زود
+  default_priority_immediate: بیدرنگ
+  default_activity_design: طراحی
+  default_activity_development: ساخت
+  
+  enumeration_issue_priorities: برتری‌های پیامد
+  enumeration_doc_categories: دسته‌های نوشتار
+  enumeration_activities: فعالیت‌ها (پیگیری زمان)
+  enumeration_system_activity: فعالیت سامانه
+
+  text_tip_issue_begin_day: issue beginning this day
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_tip_issue_begin_end_day: issue beginning and ending this day
+  text_tip_issue_end_day: issue ending this day
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/fi.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/fi.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -957,3 +957,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/fr.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/fr.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -307,6 +307,7 @@
   field_active: Actif
   field_parent_issue: Tâche parente
   field_visible: Visible
+  field_warn_on_leaving_unsaved: "M'avertir lorsque je quitte une page contenant du texte non sauvegardé"
   
   setting_app_title: Titre de l'application
   setting_app_subtitle: Sous-titre de l'application
@@ -596,6 +597,7 @@
   label_query: Rapport personnalisé
   label_query_plural: Rapports personnalisés
   label_query_new: Nouveau rapport
+  label_my_queries: Mes rapports personnalisés
   label_filter_add: "Ajouter le filtre "
   label_filter_plural: Filtres
   label_equals: égal
@@ -889,6 +891,7 @@
   text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
   text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page"
   text_own_membership_delete_confirmation: "Vous allez supprimer tout ou partie de vos permissions sur ce projet et ne serez peut-être plus autorisé à modifier ce projet.\nEtes-vous sûr de vouloir continuer ?"
+  text_warn_on_leaving_unsaved: "Cette page contient du texte non sauvegardé qui sera perdu si vous quittez la page."
   
   default_role_manager: "Manager "
   default_role_developer: "Développeur "
@@ -923,6 +926,7 @@
   error_no_tracker_in_project: "Aucun tracker n'est associé à ce projet. Vérifier la configuration du projet."
   error_no_default_issue_status: "Aucun statut de demande n'est défini par défaut. Vérifier votre configuration (Administration -> Statuts de demandes)."
   text_journal_changed: "%{label} changé de %{old} à %{new}"
+  text_journal_changed_no_detail: "%{label} mis à jour"
   text_journal_set_to: "%{label} mis à %{value}"
   text_journal_deleted: "%{label} %{old} supprimé"
   text_journal_added: "%{label} %{value} ajouté"
--- a/config/locales/gl.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/gl.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -948,3 +948,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/he.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/he.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -941,3 +941,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/hr.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/hr.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -943,3 +943,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/hu.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/hu.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -955,3 +955,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/id.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/id.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -944,3 +944,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/it.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/it.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Abilita registrazione del tempo di collegamento
   notice_gantt_chart_truncated: Il grafico è stato troncato perchè eccede il numero di oggetti (%{max}) da visualizzare
   setting_gantt_items_limit: Massimo numero di oggetti da visualizzare sul diagramma di gantt
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/ja.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/ja.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -957,3 +957,7 @@
   enumeration_doc_categories: 文書カテゴリ
   enumeration_activities: 作業分類 (時間トラッキング)
   enumeration_system_activity: システム作業分類
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/ko.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/ko.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -988,3 +988,7 @@
   setting_commit_logtime_enabled: 커밋 시점에 작업 시간 기록 활성화
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/lt.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/lt.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -996,3 +996,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/lv.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/lv.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -931,3 +931,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/mk.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/mk.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/mn.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/mn.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/nl.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/nl.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -918,3 +918,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/no.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/no.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -923,3 +923,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/pl.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/pl.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -953,3 +953,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/pt-BR.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/pt-BR.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -956,3 +956,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/pt.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/pt.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -940,3 +940,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/ro.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/ro.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -929,3 +929,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/ru.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/ru.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -1049,3 +1049,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/sk.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/sk.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -931,3 +931,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/sl.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/sl.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -932,3 +932,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/sr-YU.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/sr-YU.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -936,3 +936,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/sr.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/sr.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -937,3 +937,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/sv.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/sv.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -977,3 +977,7 @@
   enumeration_doc_categories: Dokumentkategorier
   enumeration_activities: Aktiviteter (tidsuppföljning)
   enumeration_system_activity: Systemaktivitet
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/th.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/th.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -933,3 +933,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/tr.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/tr.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -955,3 +955,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/uk.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/uk.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -932,3 +932,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/vi.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/vi.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -987,3 +987,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/zh-TW.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/zh-TW.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -1017,3 +1017,7 @@
   enumeration_doc_categories: 文件分類
   enumeration_activities: 活動 (時間追蹤)
   enumeration_system_activity: 系統活動
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/config/locales/zh.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/config/locales/zh.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -950,3 +950,7 @@
   setting_commit_logtime_enabled: Enable time logging
   notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
   setting_gantt_items_limit: Maximum number of items displayed on the gantt chart
+  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
+  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
+  label_my_queries: My custom queries
+  text_journal_changed_no_detail: "%{label} updated"
--- a/db/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/db/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 27
-/svn/!svn/ver/4753/trunk/db
+/svn/!svn/ver/4981/trunk/db
 END
--- a/db/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/db/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/db
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-23T10:25:48.265995Z
-4753
-jplang
+2011-03-01T10:14:47.182368Z
+4981
+tmaruyama
 has-props
 
 
--- a/db/migrate/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/db/migrate/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 35
-/svn/!svn/ver/4610/trunk/db/migrate
+/svn/!svn/ver/4981/trunk/db/migrate
 END
 20101107130441_add_custom_fields_visible.rb
 K 25
@@ -105,18 +105,18 @@
 V 64
 /svn/!svn/ver/67/trunk/db/migrate/008_create_user_preferences.rb
 END
+025_add_search_permission.rb
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/!svn/ver/674/trunk/db/migrate/025_add_search_permission.rb
+END
 023_add_tracker_is_in_roadmap.rb
 K 25
 svn:wc:ra_dav:version-url
 V 67
 /svn/!svn/ver/228/trunk/db/migrate/023_add_tracker_is_in_roadmap.rb
 END
-025_add_search_permission.rb
-K 25
-svn:wc:ra_dav:version-url
-V 63
-/svn/!svn/ver/674/trunk/db/migrate/025_add_search_permission.rb
-END
 20091220183727_add_index_to_settings_name.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -153,11 +153,11 @@
 V 71
 /svn/!svn/ver/1814/trunk/db/migrate/096_add_commit_access_permission.rb
 END
-024_add_roadmap_permission.rb
+20090401221305_update_enumerations_to_sti.rb
 K 25
 svn:wc:ra_dav:version-url
-V 64
-/svn/!svn/ver/674/trunk/db/migrate/024_add_roadmap_permission.rb
+V 80
+/svn/!svn/ver/2777/trunk/db/migrate/20090401221305_update_enumerations_to_sti.rb
 END
 091_change_changesets_revision_to_string.rb
 K 25
@@ -165,11 +165,11 @@
 V 79
 /svn/!svn/ver/1236/trunk/db/migrate/091_change_changesets_revision_to_string.rb
 END
-20090401221305_update_enumerations_to_sti.rb
+024_add_roadmap_permission.rb
 K 25
 svn:wc:ra_dav:version-url
-V 80
-/svn/!svn/ver/2777/trunk/db/migrate/20090401221305_update_enumerations_to_sti.rb
+V 64
+/svn/!svn/ver/674/trunk/db/migrate/024_add_roadmap_permission.rb
 END
 20091017214720_add_missing_indexes_to_wiki_redirects.rb
 K 25
@@ -177,18 +177,18 @@
 V 91
 /svn/!svn/ver/2928/trunk/db/migrate/20091017214720_add_missing_indexes_to_wiki_redirects.rb
 END
+072_add_enumerations_position.rb
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/1623/trunk/db/migrate/072_add_enumerations_position.rb
+END
 034_create_changesets.rb
 K 25
 svn:wc:ra_dav:version-url
 V 59
 /svn/!svn/ver/479/trunk/db/migrate/034_create_changesets.rb
 END
-072_add_enumerations_position.rb
-K 25
-svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/1623/trunk/db/migrate/072_add_enumerations_position.rb
-END
 20090614091200_fix_messages_sticky_null.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -249,6 +249,12 @@
 V 66
 /svn/!svn/ver/674/trunk/db/migrate/012_add_comments_permissions.rb
 END
+20110223180953_salt_user_passwords.rb
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/!svn/ver/4936/trunk/db/migrate/20110223180953_salt_user_passwords.rb
+END
 038_add_custom_field_is_filter.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -273,6 +279,12 @@
 V 77
 /svn/!svn/ver/3240/trunk/db/migrate/20091225164732_remove_enumerations_opt.rb
 END
+20110220160626_add_workflows_assignee_and_author.rb
+K 25
+svn:wc:ra_dav:version-url
+V 87
+/svn/!svn/ver/4895/trunk/db/migrate/20110220160626_add_workflows_assignee_and_author.rb
+END
 030_add_projects_feeds_permissions.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -285,6 +297,12 @@
 V 55
 /svn/!svn/ver/864/trunk/db/migrate/045_create_boards.rb
 END
+20110228000000_add_repositories_log_encoding.rb
+K 25
+svn:wc:ra_dav:version-url
+V 83
+/svn/!svn/ver/4980/trunk/db/migrate/20110228000000_add_repositories_log_encoding.rb
+END
 076_allow_null_position.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -399,11 +417,17 @@
 V 59
 /svn/!svn/ver/864/trunk/db/migrate/020_add_role_position.rb
 END
-20100129193813_update_mail_notification_values.rb
+20091010093521_fix_users_custom_values.rb
 K 25
 svn:wc:ra_dav:version-url
-V 85
-/svn/!svn/ver/4413/trunk/db/migrate/20100129193813_update_mail_notification_values.rb
+V 77
+/svn/!svn/ver/2905/trunk/db/migrate/20091010093521_fix_users_custom_values.rb
+END
+001_setup.rb
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/!svn/ver/1764/trunk/db/migrate/001_setup.rb
 END
 016_add_repositories_permissions.rb
 K 25
@@ -411,17 +435,11 @@
 V 70
 /svn/!svn/ver/674/trunk/db/migrate/016_add_repositories_permissions.rb
 END
-001_setup.rb
+20100129193813_update_mail_notification_values.rb
 K 25
 svn:wc:ra_dav:version-url
-V 48
-/svn/!svn/ver/1764/trunk/db/migrate/001_setup.rb
-END
-20091010093521_fix_users_custom_values.rb
-K 25
-svn:wc:ra_dav:version-url
-V 77
-/svn/!svn/ver/2905/trunk/db/migrate/20091010093521_fix_users_custom_values.rb
+V 85
+/svn/!svn/ver/4413/trunk/db/migrate/20100129193813_update_mail_notification_values.rb
 END
 20091017214611_add_missing_indexes_to_journals.rb
 K 25
@@ -429,17 +447,29 @@
 V 85
 /svn/!svn/ver/2928/trunk/db/migrate/20091017214611_add_missing_indexes_to_journals.rb
 END
+041_rename_comment_to_comments.rb
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/482/trunk/db/migrate/041_rename_comment_to_comments.rb
+END
 20091017214107_add_missing_indexes_to_custom_fields.rb
 K 25
 svn:wc:ra_dav:version-url
 V 90
 /svn/!svn/ver/2928/trunk/db/migrate/20091017214107_add_missing_indexes_to_custom_fields.rb
 END
-041_rename_comment_to_comments.rb
+089_add_attachments_description.rb
 K 25
 svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/482/trunk/db/migrate/041_rename_comment_to_comments.rb
+V 70
+/svn/!svn/ver/1180/trunk/db/migrate/089_add_attachments_description.rb
+END
+067_create_wiki_redirects.rb
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/!svn/ver/720/trunk/db/migrate/067_create_wiki_redirects.rb
 END
 20091017214750_add_missing_indexes_to_custom_fields_trackers.rb
 K 25
@@ -447,41 +477,41 @@
 V 99
 /svn/!svn/ver/2928/trunk/db/migrate/20091017214750_add_missing_indexes_to_custom_fields_trackers.rb
 END
-067_create_wiki_redirects.rb
-K 25
-svn:wc:ra_dav:version-url
-V 63
-/svn/!svn/ver/720/trunk/db/migrate/067_create_wiki_redirects.rb
-END
-089_add_attachments_description.rb
-K 25
-svn:wc:ra_dav:version-url
-V 70
-/svn/!svn/ver/1180/trunk/db/migrate/089_add_attachments_description.rb
-END
 103_set_custom_fields_editable.rb
 K 25
 svn:wc:ra_dav:version-url
 V 69
 /svn/!svn/ver/2279/trunk/db/migrate/103_set_custom_fields_editable.rb
 END
+20110226120132_change_auth_sources_account_password_limit.rb
+K 25
+svn:wc:ra_dav:version-url
+V 96
+/svn/!svn/ver/4950/trunk/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb
+END
 094_change_projects_homepage_limit.rb
 K 25
 svn:wc:ra_dav:version-url
 V 73
 /svn/!svn/ver/1457/trunk/db/migrate/094_change_projects_homepage_limit.rb
 END
+093_add_wiki_pages_protected.rb
+K 25
+svn:wc:ra_dav:version-url
+V 67
+/svn/!svn/ver/1415/trunk/db/migrate/093_add_wiki_pages_protected.rb
+END
 039_create_watchers.rb
 K 25
 svn:wc:ra_dav:version-url
 V 57
 /svn/!svn/ver/454/trunk/db/migrate/039_create_watchers.rb
 END
-093_add_wiki_pages_protected.rb
+083_add_messages_sticky.rb
 K 25
 svn:wc:ra_dav:version-url
-V 67
-/svn/!svn/ver/1415/trunk/db/migrate/093_add_wiki_pages_protected.rb
+V 61
+/svn/!svn/ver/926/trunk/db/migrate/083_add_messages_sticky.rb
 END
 060_change_changesets_committer_limit.rb
 K 25
@@ -489,12 +519,6 @@
 V 76
 /svn/!svn/ver/1222/trunk/db/migrate/060_change_changesets_committer_limit.rb
 END
-083_add_messages_sticky.rb
-K 25
-svn:wc:ra_dav:version-url
-V 61
-/svn/!svn/ver/926/trunk/db/migrate/083_add_messages_sticky.rb
-END
 069_add_issues_estimated_hours.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -561,18 +585,18 @@
 V 87
 /svn/!svn/ver/1938/trunk/db/migrate/099_add_delete_wiki_pages_attachments_permission.rb
 END
+098_set_topic_authors_as_watchers.rb
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/2415/trunk/db/migrate/098_set_topic_authors_as_watchers.rb
+END
 059_add_roles_assignable.rb
 K 25
 svn:wc:ra_dav:version-url
 V 62
 /svn/!svn/ver/649/trunk/db/migrate/059_add_roles_assignable.rb
 END
-098_set_topic_authors_as_watchers.rb
-K 25
-svn:wc:ra_dav:version-url
-V 72
-/svn/!svn/ver/2415/trunk/db/migrate/098_set_topic_authors_as_watchers.rb
-END
 013_create_queries.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -585,18 +609,18 @@
 V 74
 /svn/!svn/ver/674/trunk/db/migrate/049_add_wiki_destroy_page_permission.rb
 END
+040_create_changesets_issues.rb
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/!svn/ver/473/trunk/db/migrate/040_create_changesets_issues.rb
+END
 048_allow_null_version_effective_date.rb
 K 25
 svn:wc:ra_dav:version-url
 V 76
 /svn/!svn/ver/1140/trunk/db/migrate/048_allow_null_version_effective_date.rb
 END
-040_create_changesets_issues.rb
-K 25
-svn:wc:ra_dav:version-url
-V 66
-/svn/!svn/ver/473/trunk/db/migrate/040_create_changesets_issues.rb
-END
 085_add_role_tracker_old_status_index_to_workflows.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -621,29 +645,35 @@
 V 81
 /svn/!svn/ver/1236/trunk/db/migrate/092_change_changes_from_revision_to_string.rb
 END
+20110223180944_add_users_salt.rb
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/4936/trunk/db/migrate/20110223180944_add_users_salt.rb
+END
 20090214190337_add_watchers_user_id_type_index.rb
 K 25
 svn:wc:ra_dav:version-url
 V 85
 /svn/!svn/ver/2466/trunk/db/migrate/20090214190337_add_watchers_user_id_type_index.rb
 END
+20091017212457_add_missing_indexes_to_custom_fields_projects.rb
+K 25
+svn:wc:ra_dav:version-url
+V 99
+/svn/!svn/ver/2928/trunk/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb
+END
 054_add_changesets_scmid.rb
 K 25
 svn:wc:ra_dav:version-url
 V 62
 /svn/!svn/ver/559/trunk/db/migrate/054_add_changesets_scmid.rb
 END
-20091017212457_add_missing_indexes_to_custom_fields_projects.rb
+097_add_view_wiki_edits_permission.rb
 K 25
 svn:wc:ra_dav:version-url
-V 99
-/svn/!svn/ver/2928/trunk/db/migrate/20091017212457_add_missing_indexes_to_custom_fields_projects.rb
-END
-20091017213716_add_missing_indexes_to_member_roles.rb
-K 25
-svn:wc:ra_dav:version-url
-V 89
-/svn/!svn/ver/2928/trunk/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb
+V 73
+/svn/!svn/ver/1896/trunk/db/migrate/097_add_view_wiki_edits_permission.rb
 END
 065_add_settings_updated_on.rb
 K 25
@@ -651,11 +681,11 @@
 V 65
 /svn/!svn/ver/685/trunk/db/migrate/065_add_settings_updated_on.rb
 END
-097_add_view_wiki_edits_permission.rb
+20091017213716_add_missing_indexes_to_member_roles.rb
 K 25
 svn:wc:ra_dav:version-url
-V 73
-/svn/!svn/ver/1896/trunk/db/migrate/097_add_view_wiki_edits_permission.rb
+V 89
+/svn/!svn/ver/2928/trunk/db/migrate/20091017213716_add_missing_indexes_to_member_roles.rb
 END
 20091108092559_add_versions_status.rb
 K 25
@@ -669,6 +699,12 @@
 V 85
 /svn/!svn/ver/2928/trunk/db/migrate/20091017213228_add_missing_indexes_to_watchers.rb
 END
+20110228000100_copy_repositories_log_encoding.rb
+K 25
+svn:wc:ra_dav:version-url
+V 84
+/svn/!svn/ver/4981/trunk/db/migrate/20110228000100_copy_repositories_log_encoding.rb
+END
 063_add_roles_permissions.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -681,17 +717,23 @@
 V 73
 /svn/!svn/ver/2869/trunk/db/migrate/20090704172350_populate_users_type.rb
 END
+20090503121505_populate_member_roles.rb
+K 25
+svn:wc:ra_dav:version-url
+V 75
+/svn/!svn/ver/2729/trunk/db/migrate/20090503121505_populate_member_roles.rb
+END
 052_add_changes_revision.rb
 K 25
 svn:wc:ra_dav:version-url
 V 62
 /svn/!svn/ver/559/trunk/db/migrate/052_add_changes_revision.rb
 END
-20090503121505_populate_member_roles.rb
+050_add_wiki_attachments_permissions.rb
 K 25
 svn:wc:ra_dav:version-url
-V 75
-/svn/!svn/ver/2729/trunk/db/migrate/20090503121505_populate_member_roles.rb
+V 74
+/svn/!svn/ver/674/trunk/db/migrate/050_add_wiki_attachments_permissions.rb
 END
 062_insert_builtin_roles.rb
 K 25
@@ -699,11 +741,11 @@
 V 62
 /svn/!svn/ver/674/trunk/db/migrate/062_insert_builtin_roles.rb
 END
-050_add_wiki_attachments_permissions.rb
+104_add_projects_lft_and_rgt.rb
 K 25
 svn:wc:ra_dav:version-url
-V 74
-/svn/!svn/ver/674/trunk/db/migrate/050_add_wiki_attachments_permissions.rb
+V 67
+/svn/!svn/ver/2304/trunk/db/migrate/104_add_projects_lft_and_rgt.rb
 END
 074_add_auth_sources_tls.rb
 K 25
@@ -711,11 +753,23 @@
 V 62
 /svn/!svn/ver/845/trunk/db/migrate/074_add_auth_sources_tls.rb
 END
-104_add_projects_lft_and_rgt.rb
+20091114105931_add_view_issues_permission.rb
 K 25
 svn:wc:ra_dav:version-url
-V 67
-/svn/!svn/ver/2304/trunk/db/migrate/104_add_projects_lft_and_rgt.rb
+V 80
+/svn/!svn/ver/3039/trunk/db/migrate/20091114105931_add_view_issues_permission.rb
+END
+20091017214336_add_missing_indexes_to_users.rb
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/!svn/ver/2928/trunk/db/migrate/20091017214336_add_missing_indexes_to_users.rb
+END
+082_add_messages_locked.rb
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/!svn/ver/926/trunk/db/migrate/082_add_messages_locked.rb
 END
 20091017213113_add_missing_indexes_to_enumerations.rb
 K 25
@@ -723,23 +777,11 @@
 V 89
 /svn/!svn/ver/2928/trunk/db/migrate/20091017213113_add_missing_indexes_to_enumerations.rb
 END
-082_add_messages_locked.rb
+20091017213444_add_missing_indexes_to_tokens.rb
 K 25
 svn:wc:ra_dav:version-url
-V 61
-/svn/!svn/ver/926/trunk/db/migrate/082_add_messages_locked.rb
-END
-20091017214336_add_missing_indexes_to_users.rb
-K 25
-svn:wc:ra_dav:version-url
-V 82
-/svn/!svn/ver/2928/trunk/db/migrate/20091017214336_add_missing_indexes_to_users.rb
-END
-20091114105931_add_view_issues_permission.rb
-K 25
-svn:wc:ra_dav:version-url
-V 80
-/svn/!svn/ver/3039/trunk/db/migrate/20091114105931_add_view_issues_permission.rb
+V 83
+/svn/!svn/ver/2928/trunk/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb
 END
 20090503121501_create_member_roles.rb
 K 25
@@ -747,11 +789,11 @@
 V 73
 /svn/!svn/ver/2726/trunk/db/migrate/20090503121501_create_member_roles.rb
 END
-20091017213444_add_missing_indexes_to_tokens.rb
+057_add_versions_wiki_page_title.rb
 K 25
 svn:wc:ra_dav:version-url
-V 83
-/svn/!svn/ver/2928/trunk/db/migrate/20091017213444_add_missing_indexes_to_tokens.rb
+V 70
+/svn/!svn/ver/564/trunk/db/migrate/057_add_versions_wiki_page_title.rb
 END
 20090323224724_add_type_to_enumerations.rb
 K 25
@@ -759,12 +801,6 @@
 V 78
 /svn/!svn/ver/2777/trunk/db/migrate/20090323224724_add_type_to_enumerations.rb
 END
-057_add_versions_wiki_page_title.rb
-K 25
-svn:wc:ra_dav:version-url
-V 70
-/svn/!svn/ver/564/trunk/db/migrate/057_add_versions_wiki_page_title.rb
-END
 004_export_pdf.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -879,12 +915,24 @@
 V 77
 /svn/!svn/ver/674/trunk/db/migrate/056_add_repositories_changes_permission.rb
 END
+20110224000000_add_repositories_path_encoding.rb
+K 25
+svn:wc:ra_dav:version-url
+V 84
+/svn/!svn/ver/4940/trunk/db/migrate/20110224000000_add_repositories_path_encoding.rb
+END
 032_create_time_entries.rb
 K 25
 svn:wc:ra_dav:version-url
 V 61
 /svn/!svn/ver/479/trunk/db/migrate/032_create_time_entries.rb
 END
+20110226120112_change_repositories_password_limit.rb
+K 25
+svn:wc:ra_dav:version-url
+V 88
+/svn/!svn/ver/4950/trunk/db/migrate/20110226120112_change_repositories_password_limit.rb
+END
 068_create_enabled_modules.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -1059,6 +1107,12 @@
 V 57
 /svn/!svn/ver/167/trunk/db/migrate/017_create_settings.rb
 END
+20110227125750_change_journal_details_values_to_text.rb
+K 25
+svn:wc:ra_dav:version-url
+V 91
+/svn/!svn/ver/4954/trunk/db/migrate/20110227125750_change_journal_details_values_to_text.rb
+END
 095_add_wiki_pages_parent_id.rb
 K 25
 svn:wc:ra_dav:version-url
--- a/db/migrate/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/db/migrate/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/db/migrate
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-01T23:08:49.766359Z
-4610
-jbbarth
+2011-03-01T10:14:47.182368Z
+4981
+tmaruyama
 
 
 
@@ -604,6 +604,40 @@
 
 281
 
+025_add_search_permission.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+42937036f9c414f7d9b028f629b1ce20
+2007-08-29T16:52:35.680643Z
+674
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+412
+
 023_add_tracker_is_in_roadmap.rb
 file
 
@@ -638,40 +672,6 @@
 
 230
 
-025_add_search_permission.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-42937036f9c414f7d9b028f629b1ce20
-2007-08-29T16:52:35.680643Z
-674
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-412
-
 20091220183727_add_index_to_settings_name.rb
 file
 
@@ -876,39 +876,39 @@
 
 321
 
-024_add_roadmap_permission.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-f1b96e04888c0a48bf29dd0556ba8027
-2007-08-29T16:52:35.680643Z
-674
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-445
+20090401221305_update_enumerations_to_sti.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+d343c3ba8f04d1cc71f20c9860d5907b
+2009-05-30T23:30:36.923541Z
+2777
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+329
 
 091_change_changesets_revision_to_string.rb
 file
@@ -944,39 +944,39 @@
 
 245
 
-20090401221305_update_enumerations_to_sti.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-d343c3ba8f04d1cc71f20c9860d5907b
-2009-05-30T23:30:36.923541Z
-2777
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-329
+024_add_roadmap_permission.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+f1b96e04888c0a48bf29dd0556ba8027
+2007-08-29T16:52:35.680643Z
+674
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+445
 
 20091017214720_add_missing_indexes_to_wiki_redirects.rb
 file
@@ -1012,40 +1012,6 @@
 
 195
 
-034_create_changesets.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-82595f307b6fe5053151a681b737f063
-2007-04-25T15:06:20.062636Z
-479
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-515
-
 072_add_enumerations_position.rb
 file
 
@@ -1080,6 +1046,40 @@
 
 495
 
+034_create_changesets.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+82595f307b6fe5053151a681b737f063
+2007-04-25T15:06:20.062636Z
+479
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+515
+
 20090614091200_fix_messages_sticky_null.rb
 file
 
@@ -1420,6 +1420,40 @@
 
 751
 
+20110223180953_salt_user_passwords.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+f72892b525076a1ffaf1f2548822d560
+2011-02-23T17:27:31.762248Z
+4936
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+384
+
 038_add_custom_field_is_filter.rb
 file
 
@@ -1556,6 +1590,40 @@
 
 442
 
+20110220160626_add_workflows_assignee_and_author.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+8e7a8d0f81e207e3d673703de33fdb69
+2011-02-20T15:38:07.840581Z
+4895
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+495
+
 030_add_projects_feeds_permissions.rb
 file
 
@@ -1624,6 +1692,40 @@
 
 607
 
+20110228000000_add_repositories_log_encoding.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+dbe736040dcb44e3db78219ecfdb3d62
+2011-03-01T09:47:06.578325Z
+4980
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+237
+
 076_allow_null_position.rb
 file
 
@@ -2270,108 +2372,6 @@
 
 275
 
-20100129193813_update_mail_notification_values.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-d2251c92048ec4169e2c220f1510d803
-2010-11-20T09:55:06.580420Z
-4413
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-241
-
-016_add_repositories_permissions.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-e770aa6387bb4737804d5024e743cd25
-2007-08-29T16:52:35.680643Z
-674
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1658
-
-001_setup.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-b740a77ff87e6390f7ad86eaf0710040
-2008-08-25T16:35:20.899166Z
-1764
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-18072
-
 20091010093521_fix_users_custom_values.rb
 file
 
@@ -2406,6 +2406,108 @@
 
 276
 
+001_setup.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+b740a77ff87e6390f7ad86eaf0710040
+2008-08-25T16:35:20.899166Z
+1764
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+18072
+
+016_add_repositories_permissions.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+e770aa6387bb4737804d5024e743cd25
+2007-08-29T16:52:35.680643Z
+674
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1658
+
+20100129193813_update_mail_notification_values.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+d2251c92048ec4169e2c220f1510d803
+2010-11-20T09:55:06.580420Z
+4413
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+241
+
 20091017214611_add_missing_indexes_to_journals.rb
 file
 
@@ -2440,6 +2542,40 @@
 
 263
 
+041_rename_comment_to_comments.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+4901b560613f6a0ae3e5df5bcf2dd11c
+2007-04-25T16:48:01.299251Z
+482
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+896
+
 20091017214107_add_missing_indexes_to_custom_fields.rb
 file
 
@@ -2474,73 +2610,39 @@
 
 211
 
-041_rename_comment_to_comments.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-4901b560613f6a0ae3e5df5bcf2dd11c
-2007-04-25T16:48:01.299251Z
-482
+089_add_attachments_description.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+f60a0c1f633a6ff65fb2734173b57fe4
+2008-02-29T19:46:58.834023Z
+1180
 jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-896
-
-20091017214750_add_missing_indexes_to_custom_fields_trackers.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-871a600c06a6965f52c63177a82fbe15
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-275
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+201
 
 067_create_wiki_redirects.rb
 file
@@ -2576,39 +2678,39 @@
 
 441
 
-089_add_attachments_description.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-f60a0c1f633a6ff65fb2734173b57fe4
-2008-02-29T19:46:58.834023Z
-1180
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-201
+20091017214750_add_missing_indexes_to_custom_fields_trackers.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+871a600c06a6965f52c63177a82fbe15
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+275
 
 103_set_custom_fields_editable.rb
 file
@@ -2644,6 +2746,40 @@
 
 270
 
+20110226120132_change_auth_sources_account_password_limit.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+fccbbb0aadf883abb7a337961c2199e4
+2011-02-26T13:09:25.657748Z
+4950
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+298
+
 094_change_projects_homepage_limit.rb
 file
 
@@ -2678,40 +2814,6 @@
 
 264
 
-039_create_watchers.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-07bf6636d0acf3ec84b38648bbe2c07a
-2007-04-21T12:09:07.794422Z
-454
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-337
-
 093_add_wiki_pages_protected.rb
 file
 
@@ -2746,16 +2848,16 @@
 
 227
 
-060_change_changesets_committer_limit.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-0abbef63f1f391688df012906a94877b
-2008-03-09T18:25:37.323226Z
-1222
+039_create_watchers.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+07bf6636d0acf3ec84b38648bbe2c07a
+2007-04-21T12:09:07.794422Z
+454
 jplang
 
 
@@ -2778,7 +2880,7 @@
 
 
 
-241
+337
 
 083_add_messages_sticky.rb
 file
@@ -2814,6 +2916,40 @@
 
 193
 
+060_change_changesets_committer_limit.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+0abbef63f1f391688df012906a94877b
+2008-03-09T18:25:37.323226Z
+1222
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+241
+
 069_add_issues_estimated_hours.rb
 file
 
@@ -3188,40 +3324,6 @@
 
 339
 
-059_add_roles_assignable.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-aa67262417630fc088eb57df8d2dd9d3
-2007-08-16T17:47:41.639068Z
-649
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-199
-
 098_set_topic_authors_as_watchers.rb
 file
 
@@ -3256,6 +3358,40 @@
 
 749
 
+059_add_roles_assignable.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+aa67262417630fc088eb57df8d2dd9d3
+2007-08-16T17:47:41.639068Z
+649
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+199
+
 013_create_queries.rb
 file
 
@@ -3324,6 +3460,40 @@
 
 418
 
+040_create_changesets_issues.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+dc28d8674409819b866f6d878b33d288
+2007-04-24T13:57:27.960164Z
+473
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+418
+
 048_allow_null_version_effective_date.rb
 file
 
@@ -3358,40 +3528,6 @@
 
 225
 
-040_create_changesets_issues.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-dc28d8674409819b866f6d878b33d288
-2007-04-24T13:57:27.960164Z
-473
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-418
-
 085_add_role_tracker_old_status_index_to_workflows.rb
 file
 
@@ -3528,6 +3664,40 @@
 
 218
 
+20110223180944_add_users_salt.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+6dd75e3da92087226c787a4edc76032e
+2011-02-23T17:27:31.762248Z
+4936
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+176
+
 20090214190337_add_watchers_user_id_type_index.rb
 file
 
@@ -3562,6 +3732,40 @@
 
 252
 
+20091017212457_add_missing_indexes_to_custom_fields_projects.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+90bb42121a57db140491ecb2a0763d00
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+275
+
 054_add_changesets_scmid.rb
 file
 
@@ -3596,73 +3800,39 @@
 
 180
 
-20091017212457_add_missing_indexes_to_custom_fields_projects.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-90bb42121a57db140491ecb2a0763d00
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-275
-
-20091017213716_add_missing_indexes_to_member_roles.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-4bfd0623186217eee4346313f148ea7a
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-272
+097_add_view_wiki_edits_permission.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+e00f8e7739afbb2d07a21decd1422a0a
+2008-09-21T20:38:36.877257Z
+1896
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+298
 
 065_add_settings_updated_on.rb
 file
@@ -3698,39 +3868,39 @@
 
 248
 
-097_add_view_wiki_edits_permission.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-e00f8e7739afbb2d07a21decd1422a0a
-2008-09-21T20:38:36.877257Z
-1896
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-298
+20091017213716_add_missing_indexes_to_member_roles.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+4bfd0623186217eee4346313f148ea7a
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+272
 
 20091108092559_add_versions_status.rb
 file
@@ -3800,6 +3970,40 @@
 
 308
 
+20110228000100_copy_repositories_log_encoding.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+22941cc81d233c2602be827d70670c10
+2011-03-01T10:14:47.182368Z
+4981
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+497
+
 063_add_roles_permissions.rb
 file
 
@@ -3868,40 +4072,6 @@
 
 155
 
-052_add_changes_revision.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-3af07746c4eab3a1716744971ac26ffc
-2007-06-12T20:12:05.590809Z
-559
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-180
-
 20090503121505_populate_member_roles.rb
 file
 
@@ -3936,6 +4106,74 @@
 
 276
 
+052_add_changes_revision.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+3af07746c4eab3a1716744971ac26ffc
+2007-06-12T20:12:05.590809Z
+559
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+180
+
+050_add_wiki_attachments_permissions.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+67d6e1898c150c8df560cb2ce8a2f2d7
+2007-08-29T16:52:35.680643Z
+674
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+718
+
 062_insert_builtin_roles.rb
 file
 
@@ -3970,39 +4208,39 @@
 
 403
 
-050_add_wiki_attachments_permissions.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-67d6e1898c150c8df560cb2ce8a2f2d7
-2007-08-29T16:52:35.680643Z
-674
+104_add_projects_lft_and_rgt.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+46effb13ff7d1a62b7b8c93afc7da9c8
+2009-01-24T11:31:15.122844Z
+2304
 jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-718
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+250
 
 074_add_auth_sources_tls.rb
 file
@@ -4038,16 +4276,16 @@
 
 215
 
-104_add_projects_lft_and_rgt.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-46effb13ff7d1a62b7b8c93afc7da9c8
-2009-01-24T11:31:15.122844Z
-2304
+20091114105931_add_view_issues_permission.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+886411cb32a18ec492acc798194210af
+2009-11-14T12:08:47.175978Z
+3039
 jplang
 has-props
 
@@ -4070,75 +4308,7 @@
 
 
 
-250
-
-20091017214336_add_missing_indexes_to_users.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-8251942eb30b7c709ac6e3dc1ab5eedb
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-267
-
-20091017213113_add_missing_indexes_to_enumerations.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-22e6afc0519b7befbae2c4a4433c20f5
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-209
+262
 
 082_add_messages_locked.rb
 file
@@ -4174,39 +4344,107 @@
 
 197
 
-20091114105931_add_view_issues_permission.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-886411cb32a18ec492acc798194210af
-2009-11-14T12:08:47.175978Z
-3039
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-262
+20091017213113_add_missing_indexes_to_enumerations.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+22e6afc0519b7befbae2c4a4433c20f5
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+209
+
+20091017214336_add_missing_indexes_to_users.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+8251942eb30b7c709ac6e3dc1ab5eedb
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+267
+
+20091017213444_add_missing_indexes_to_tokens.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+4c220f0316e1b04fa8350f0309698f24
+2009-10-17T22:23:29.892475Z
+2928
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+172
 
 20090503121501_create_member_roles.rb
 file
@@ -4242,39 +4480,39 @@
 
 274
 
-20091017213444_add_missing_indexes_to_tokens.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-4c220f0316e1b04fa8350f0309698f24
-2009-10-17T22:23:29.892475Z
-2928
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-172
+057_add_versions_wiki_page_title.rb
+file
+
+
+
+
+2011-03-03T11:05:12.000000Z
+6a4944f1162c00f2405200fb38773886
+2007-06-14T18:26:27.748707Z
+564
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+202
 
 20090323224724_add_type_to_enumerations.rb
 file
@@ -4310,40 +4548,6 @@
 
 185
 
-057_add_versions_wiki_page_title.rb
-file
-
-
-
-
-2011-03-03T11:05:12.000000Z
-6a4944f1162c00f2405200fb38773886
-2007-06-14T18:26:27.748707Z
-564
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-202
-
 004_export_pdf.rb
 file
 
@@ -4990,6 +5194,40 @@
 
 443
 
+20110224000000_add_repositories_path_encoding.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+7cd80bdf7897357500a46e87ed82b84b
+2011-02-24T05:58:37.876075Z
+4940
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+240
+
 032_create_time_entries.rb
 file
 
@@ -5024,6 +5262,40 @@
 
 966
 
+20110226120112_change_repositories_password_limit.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+e809364786bdcce227961318e7428700
+2011-02-26T13:09:25.657748Z
+4950
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+276
+
 068_create_enabled_modules.rb
 file
 
@@ -6010,6 +6282,40 @@
 
 284
 
+20110227125750_change_journal_details_values_to_text.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+768603dc014def8d2fc0a0bb8d81ef79
+2011-02-27T13:34:41.060565Z
+4954
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+324
+
 095_add_wiki_pages_parent_id.rb
 file
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110220160626_add_workflows_assignee_and_author.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110223180944_add_users_salt.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110223180953_salt_user_passwords.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110226120112_change_repositories_password_limit.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110226120132_change_auth_sources_account_password_limit.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/prop-base/20110227125750_change_journal_details_values_to_text.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110220160626_add_workflows_assignee_and_author.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,13 @@
+class AddWorkflowsAssigneeAndAuthor < ActiveRecord::Migration
+  def self.up
+    add_column :workflows, :assignee, :boolean, :null => false, :default => false
+    add_column :workflows, :author, :boolean, :null => false, :default => false
+    Workflow.update_all("assignee = #{Workflow.connection.quoted_false}")
+    Workflow.update_all("author = #{Workflow.connection.quoted_false}")
+  end
+
+  def self.down
+    remove_column :workflows, :assignee
+    remove_column :workflows, :author
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110223180944_add_users_salt.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddUsersSalt < ActiveRecord::Migration
+  def self.up
+    add_column :users, :salt, :string, :limit => 64
+  end
+
+  def self.down
+    remove_column :users, :salt
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110223180953_salt_user_passwords.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,13 @@
+class SaltUserPasswords < ActiveRecord::Migration
+  
+  def self.up
+    say_with_time "Salting user passwords, this may take some time..." do
+      User.salt_unsalted_passwords!
+    end
+  end
+
+  def self.down
+    # Unsalted passwords can not be restored
+    raise ActiveRecord::IrreversibleMigration, "Can't decypher salted passwords. This migration can not be rollback'ed."
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110224000000_add_repositories_path_encoding.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddRepositoriesPathEncoding < ActiveRecord::Migration
+  def self.up
+    add_column :repositories, :path_encoding, :string, :limit => 64, :default => nil
+  end
+
+  def self.down
+    remove_column :repositories, :path_encoding
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110226120112_change_repositories_password_limit.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class ChangeRepositoriesPasswordLimit < ActiveRecord::Migration
+  def self.up
+    change_column :repositories, :password, :string, :limit => nil, :default => ''
+  end
+
+  def self.down
+    change_column :repositories, :password, :string, :limit => 60, :default => ''
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110226120132_change_auth_sources_account_password_limit.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class ChangeAuthSourcesAccountPasswordLimit < ActiveRecord::Migration
+  def self.up
+    change_column :auth_sources, :account_password, :string, :limit => nil, :default => ''
+  end
+
+  def self.down
+    change_column :auth_sources, :account_password, :string, :limit => 60, :default => ''
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110227125750_change_journal_details_values_to_text.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,11 @@
+class ChangeJournalDetailsValuesToText < ActiveRecord::Migration
+  def self.up
+    change_column :journal_details, :old_value, :text
+    change_column :journal_details, :value, :text
+  end
+
+  def self.down
+    change_column :journal_details, :old_value, :string
+    change_column :journal_details, :value, :string
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110228000000_add_repositories_log_encoding.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddRepositoriesLogEncoding < ActiveRecord::Migration
+  def self.up
+    add_column :repositories, :log_encoding, :string, :limit => 64, :default => nil
+  end
+
+  def self.down
+    remove_column :repositories, :log_encoding
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/.svn/text-base/20110228000100_copy_repositories_log_encoding.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,18 @@
+class CopyRepositoriesLogEncoding < ActiveRecord::Migration
+  def self.up
+    encoding = Setting.commit_logs_encoding.to_s.strip
+    encoding = encoding.blank? ? 'UTF-8' : encoding
+    Repository.find(:all).each do |repo|
+      scm = repo.scm_name
+      case scm
+        when 'Subversion', 'Mercurial', 'Git', 'Filesystem' 
+          repo.update_attribute(:log_encoding, nil)
+        else
+          repo.update_attribute(:log_encoding, encoding)
+      end
+    end
+  end
+
+  def self.down
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110220160626_add_workflows_assignee_and_author.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,13 @@
+class AddWorkflowsAssigneeAndAuthor < ActiveRecord::Migration
+  def self.up
+    add_column :workflows, :assignee, :boolean, :null => false, :default => false
+    add_column :workflows, :author, :boolean, :null => false, :default => false
+    Workflow.update_all("assignee = #{Workflow.connection.quoted_false}")
+    Workflow.update_all("author = #{Workflow.connection.quoted_false}")
+  end
+
+  def self.down
+    remove_column :workflows, :assignee
+    remove_column :workflows, :author
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110223180944_add_users_salt.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddUsersSalt < ActiveRecord::Migration
+  def self.up
+    add_column :users, :salt, :string, :limit => 64
+  end
+
+  def self.down
+    remove_column :users, :salt
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110223180953_salt_user_passwords.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,13 @@
+class SaltUserPasswords < ActiveRecord::Migration
+  
+  def self.up
+    say_with_time "Salting user passwords, this may take some time..." do
+      User.salt_unsalted_passwords!
+    end
+  end
+
+  def self.down
+    # Unsalted passwords can not be restored
+    raise ActiveRecord::IrreversibleMigration, "Can't decypher salted passwords. This migration can not be rollback'ed."
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110224000000_add_repositories_path_encoding.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddRepositoriesPathEncoding < ActiveRecord::Migration
+  def self.up
+    add_column :repositories, :path_encoding, :string, :limit => 64, :default => nil
+  end
+
+  def self.down
+    remove_column :repositories, :path_encoding
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110226120112_change_repositories_password_limit.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class ChangeRepositoriesPasswordLimit < ActiveRecord::Migration
+  def self.up
+    change_column :repositories, :password, :string, :limit => nil, :default => ''
+  end
+
+  def self.down
+    change_column :repositories, :password, :string, :limit => 60, :default => ''
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110226120132_change_auth_sources_account_password_limit.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class ChangeAuthSourcesAccountPasswordLimit < ActiveRecord::Migration
+  def self.up
+    change_column :auth_sources, :account_password, :string, :limit => nil, :default => ''
+  end
+
+  def self.down
+    change_column :auth_sources, :account_password, :string, :limit => 60, :default => ''
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110227125750_change_journal_details_values_to_text.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,11 @@
+class ChangeJournalDetailsValuesToText < ActiveRecord::Migration
+  def self.up
+    change_column :journal_details, :old_value, :text
+    change_column :journal_details, :value, :text
+  end
+
+  def self.down
+    change_column :journal_details, :old_value, :string
+    change_column :journal_details, :value, :string
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110228000000_add_repositories_log_encoding.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,9 @@
+class AddRepositoriesLogEncoding < ActiveRecord::Migration
+  def self.up
+    add_column :repositories, :log_encoding, :string, :limit => 64, :default => nil
+  end
+
+  def self.down
+    remove_column :repositories, :log_encoding
+  end
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20110228000100_copy_repositories_log_encoding.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,18 @@
+class CopyRepositoriesLogEncoding < ActiveRecord::Migration
+  def self.up
+    encoding = Setting.commit_logs_encoding.to_s.strip
+    encoding = encoding.blank? ? 'UTF-8' : encoding
+    Repository.find(:all).each do |repo|
+      scm = repo.scm_name
+      case scm
+        when 'Subversion', 'Mercurial', 'Git', 'Filesystem' 
+          repo.update_attribute(:log_encoding, nil)
+        else
+          repo.update_attribute(:log_encoding, encoding)
+      end
+    end
+  end
+
+  def self.down
+  end
+end
--- a/doc/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/doc/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/doc
 http://redmine.rubyforge.org/svn
 
--- a/extra/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 30
-/svn/!svn/ver/4725/trunk/extra
+/svn/!svn/ver/4936/trunk/extra
 END
--- a/extra/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-15T14:48:33.715032Z
-4725
+2011-02-23T17:27:31.762248Z
+4936
 jplang
 
 
--- a/extra/mail_handler/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/mail_handler/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/mail_handler
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/models
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/views
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/views/example/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/views/example/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/views/example
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/views/my/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/views/my/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/views/my
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/views/my/blocks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/views/my/blocks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/views/my/blocks
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/app/views/settings/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/app/views/settings/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/app/views/settings
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/assets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/assets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/assets
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/assets/images/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/assets/images/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/assets/images
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/assets/stylesheets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/assets/stylesheets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/assets/stylesheets
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/config/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/config/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/config
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/config/locales/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/config/locales/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/config/locales
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/db/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/db/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/db
 http://redmine.rubyforge.org/svn
 
--- a/extra/sample_plugin/db/migrate/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/sample_plugin/db/migrate/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/sample_plugin/db/migrate
 http://redmine.rubyforge.org/svn
 
--- a/extra/svn/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/svn/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 34
-/svn/!svn/ver/4309/trunk/extra/svn
+/svn/!svn/ver/4936/trunk/extra/svn
 END
 reposman.rb
 K 25
@@ -19,7 +19,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 45
-/svn/!svn/ver/4309/trunk/extra/svn/Redmine.pm
+/svn/!svn/ver/4936/trunk/extra/svn/Redmine.pm
 END
 create_views.sql
 K 25
--- a/extra/svn/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/svn/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/extra/svn
 http://redmine.rubyforge.org/svn
 
 
 
-2010-10-29T22:55:50.222644Z
-4309
-jbbarth
+2011-02-23T17:27:31.762248Z
+4936
+jplang
 
 
 
@@ -100,11 +100,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-5ed4546a59c9729cbd9b407ad0996b9b
-2010-10-29T22:55:50.222644Z
-4309
-jbbarth
+2011-03-03T11:40:18.000000Z
+c3d331d6024a3d0f0c250fda387ce052
+2011-02-23T17:27:31.762248Z
+4936
+jplang
 has-props
 
 
@@ -126,7 +126,7 @@
 
 
 
-10752
+10843
 
 create_views.sql
 file
--- a/extra/svn/.svn/text-base/Redmine.pm.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/svn/.svn/text-base/Redmine.pm.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -148,7 +148,7 @@
   my ($self, $parms, $arg) = @_;
   $self->{RedmineDSN} = $arg;
   my $query = "SELECT 
-                 hashed_password, auth_source_id, permissions
+                 hashed_password, salt, auth_source_id, permissions
               FROM members, projects, users, roles, member_roles
               WHERE 
                 projects.id=members.project_id
@@ -316,11 +316,12 @@
   $sth->execute($redmine_user, $project_id);
 
   my $ret;
-  while (my ($hashed_password, $auth_source_id, $permissions) = $sth->fetchrow_array) {
+  while (my ($hashed_password, $salt, $auth_source_id, $permissions) = $sth->fetchrow_array) {
 
       unless ($auth_source_id) {
-	  my $method = $r->method;
-          if ($hashed_password eq $pass_digest && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
+	  			my $method = $r->method;
+          my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest);
+					if ($hashed_password eq $salted_password && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
               $ret = 1;
               last;
           }
--- a/extra/svn/Redmine.pm	Thu Mar 03 11:40:10 2011 +0000
+++ b/extra/svn/Redmine.pm	Thu Mar 03 11:42:28 2011 +0000
@@ -148,7 +148,7 @@
   my ($self, $parms, $arg) = @_;
   $self->{RedmineDSN} = $arg;
   my $query = "SELECT 
-                 hashed_password, auth_source_id, permissions
+                 hashed_password, salt, auth_source_id, permissions
               FROM members, projects, users, roles, member_roles
               WHERE 
                 projects.id=members.project_id
@@ -316,11 +316,12 @@
   $sth->execute($redmine_user, $project_id);
 
   my $ret;
-  while (my ($hashed_password, $auth_source_id, $permissions) = $sth->fetchrow_array) {
+  while (my ($hashed_password, $salt, $auth_source_id, $permissions) = $sth->fetchrow_array) {
 
       unless ($auth_source_id) {
-	  my $method = $r->method;
-          if ($hashed_password eq $pass_digest && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
+	  			my $method = $r->method;
+          my $salted_password = Digest::SHA1::sha1_hex($salt.$pass_digest);
+					if ($hashed_password eq $salted_password && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/) ) {
               $ret = 1;
               last;
           }
--- a/files/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/files/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/files
 http://redmine.rubyforge.org/svn
 
--- a/lib/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 28
-/svn/!svn/ver/4797/trunk/lib
+/svn/!svn/ver/4993/trunk/lib
 END
 faster_csv.rb
 K 25
@@ -13,7 +13,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 39
-/svn/!svn/ver/4466/trunk/lib/redmine.rb
+/svn/!svn/ver/4954/trunk/lib/redmine.rb
 END
 tabular_form_builder.rb
 K 25
--- a/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 
 
@@ -78,10 +78,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-a25bf842b86584d0d77844d95b6ab907
-2010-12-04T17:43:39.823144Z
-4466
+2011-03-03T11:40:18.000000Z
+931d36182ff7c72cf9e133581a6e1822
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -104,7 +104,7 @@
 
 
 
-12841
+12850
 
 tabular_form_builder.rb
 file
--- a/lib/.svn/text-base/redmine.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/.svn/text-base/redmine.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -62,7 +62,7 @@
                                   :auto_complete => [:issues],
                                   :context_menus => [:issues],
                                   :versions => [:index, :show, :status_by],
-                                  :journals => :index,
+                                  :journals => [:index, :diff],
                                   :queries => :index,
                                   :reports => [:issue_report, :issue_report_details]}
     map.permission :add_issues, {:issues => [:new, :create, :update_form]}
--- a/lib/SVG/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/SVG/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/SVG
 http://redmine.rubyforge.org/svn
 
--- a/lib/SVG/Graph/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/SVG/Graph/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/SVG/Graph
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin/templates
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin_controller/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin_controller/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin_controller
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin_controller/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin_controller/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin_controller/templates
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin_model/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin_model/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin_model
 http://redmine.rubyforge.org/svn
 
--- a/lib/generators/redmine_plugin_model/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/generators/redmine_plugin_model/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/generators/redmine_plugin_model/templates
 http://redmine.rubyforge.org/svn
 
--- a/lib/plugins/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/plugins/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/plugins
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -62,7 +62,7 @@
                                   :auto_complete => [:issues],
                                   :context_menus => [:issues],
                                   :versions => [:index, :show, :status_by],
-                                  :journals => :index,
+                                  :journals => [:index, :diff],
                                   :queries => :index,
                                   :reports => [:issue_report, :issue_report_details]}
     map.permission :add_issues, {:issues => [:new, :create, :update_form]}
--- a/lib/redmine/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 36
-/svn/!svn/ver/4797/trunk/lib/redmine
+/svn/!svn/ver/4993/trunk/lib/redmine
 END
 i18n.rb
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4516/trunk/lib/redmine/i18n.rb
+/svn/!svn/ver/4894/trunk/lib/redmine/i18n.rb
 END
 pop3.rb
 K 25
@@ -15,23 +15,23 @@
 V 44
 /svn/!svn/ver/4737/trunk/lib/redmine/pop3.rb
 END
+safe_attributes.rb
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/!svn/ver/4491/trunk/lib/redmine/safe_attributes.rb
+END
 platform.rb
 K 25
 svn:wc:ra_dav:version-url
 V 48
 /svn/!svn/ver/1753/trunk/lib/redmine/platform.rb
 END
-safe_attributes.rb
+custom_field_format.rb
 K 25
 svn:wc:ra_dav:version-url
-V 55
-/svn/!svn/ver/4491/trunk/lib/redmine/safe_attributes.rb
-END
-version.rb
-K 25
-svn:wc:ra_dav:version-url
-V 47
-/svn/!svn/ver/4784/trunk/lib/redmine/version.rb
+V 59
+/svn/!svn/ver/3675/trunk/lib/redmine/custom_field_format.rb
 END
 themes.rb
 K 25
@@ -39,11 +39,11 @@
 V 46
 /svn/!svn/ver/4559/trunk/lib/redmine/themes.rb
 END
-custom_field_format.rb
+version.rb
 K 25
 svn:wc:ra_dav:version-url
-V 59
-/svn/!svn/ver/3675/trunk/lib/redmine/custom_field_format.rb
+V 47
+/svn/!svn/ver/4784/trunk/lib/redmine/version.rb
 END
 imap.rb
 K 25
@@ -63,36 +63,36 @@
 V 44
 /svn/!svn/ver/2776/trunk/lib/redmine/info.rb
 END
+access_keys.rb
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/!svn/ver/1081/trunk/lib/redmine/access_keys.rb
+END
 activity.rb
 K 25
 svn:wc:ra_dav:version-url
 V 48
 /svn/!svn/ver/1702/trunk/lib/redmine/activity.rb
 END
-access_keys.rb
-K 25
-svn:wc:ra_dav:version-url
-V 51
-/svn/!svn/ver/1081/trunk/lib/redmine/access_keys.rb
-END
 wiki_formatting.rb
 K 25
 svn:wc:ra_dav:version-url
 V 55
 /svn/!svn/ver/3446/trunk/lib/redmine/wiki_formatting.rb
 END
+menu_manager.rb
+K 25
+svn:wc:ra_dav:version-url
+V 52
+/svn/!svn/ver/4406/trunk/lib/redmine/menu_manager.rb
+END
 plugin.rb
 K 25
 svn:wc:ra_dav:version-url
 V 46
 /svn/!svn/ver/4293/trunk/lib/redmine/plugin.rb
 END
-menu_manager.rb
-K 25
-svn:wc:ra_dav:version-url
-V 52
-/svn/!svn/ver/4406/trunk/lib/redmine/menu_manager.rb
-END
 utils.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -121,7 +121,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4752/trunk/lib/redmine/configuration.rb
+/svn/!svn/ver/4949/trunk/lib/redmine/configuration.rb
 END
 core_ext.rb
 K 25
@@ -129,6 +129,12 @@
 V 48
 /svn/!svn/ver/1361/trunk/lib/redmine/core_ext.rb
 END
+ciphering.rb
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/4950/trunk/lib/redmine/ciphering.rb
+END
 about.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -145,7 +151,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 52
-/svn/!svn/ver/3028/trunk/lib/redmine/unified_diff.rb
+/svn/!svn/ver/4929/trunk/lib/redmine/unified_diff.rb
 END
 notifiable.rb
 K 25
--- a/lib/redmine/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 
 
@@ -316,10 +316,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-d5040eb318ca88ba187170e4713bbb27
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:18.000000Z
+2f47dda69333c012a55496a3792c369e
+2011-02-25T14:30:05.998365Z
+4949
 jplang
 has-props
 
@@ -342,7 +342,7 @@
 
 
 
-3309
+3639
 
 about.rb
 file
@@ -452,10 +452,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-009b7a9ada5c3e83d6a7a26256c34951
-2010-12-17T08:34:29.830642Z
-4516
+2011-03-03T11:40:18.000000Z
+cc684405103aabd5f4aea0c21fd7c732
+2011-02-20T14:56:37.399906Z
+4894
 jplang
 has-props
 
@@ -478,11 +478,45 @@
 
 
 
-2315
+2255
 
 scm
 dir
 
+safe_attributes.rb
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+7f659c02de1ea89806beda1772dc4d36
+2010-12-12T13:11:53.259618Z
+4491
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2579
+
 platform.rb
 file
 
@@ -517,74 +551,6 @@
 
 1009
 
-safe_attributes.rb
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-7f659c02de1ea89806beda1772dc4d36
-2010-12-12T13:11:53.259618Z
-4491
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2579
-
-custom_field_format.rb
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-7fd1fcfb204480b0e9903fd03c53a563
-2010-04-16T15:34:05.970144Z
-3675
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2761
-
 version.rb
 file
 
@@ -619,6 +585,40 @@
 
 1056
 
+custom_field_format.rb
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+7fd1fcfb204480b0e9903fd03c53a563
+2010-04-16T15:34:05.970144Z
+3675
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2761
+
 mime_type.rb
 file
 
@@ -653,10 +653,10 @@
 
 3498
 
-views
+wiki_formatting
 dir
 
-wiki_formatting
+views
 dir
 
 activity.rb
@@ -727,6 +727,40 @@
 
 4431
 
+plugin.rb
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+81bc46012d5a0067e18e08bada197d8c
+2010-10-25T23:32:01.793182Z
+4293
+edavis10
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+11219
+
 menu_manager.rb
 file
 
@@ -761,40 +795,6 @@
 
 15303
 
-plugin.rb
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-81bc46012d5a0067e18e08bada197d8c
-2010-10-25T23:32:01.793182Z
-4293
-edavis10
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-11219
-
 hook.rb
 file
 
@@ -863,6 +863,40 @@
 
 77
 
+ciphering.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+763ba2f765c62f378371f2472679c464
+2011-02-26T13:09:25.657748Z
+4950
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2933
+
 default_data
 dir
 
@@ -872,11 +906,11 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-69c22a4064f90e2ce460a0c9013c7cd0
-2009-11-11T13:25:53.648186Z
-3028
-jplang
+2011-03-03T11:40:18.000000Z
+561d23da6665fb790120f9d59962fb78
+2011-02-23T07:03:45.049119Z
+4929
+tmaruyama
 has-props
 
 
@@ -898,5 +932,5 @@
 
 
 
-5259
+5678
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/.svn/prop-base/ciphering.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/.svn/text-base/ciphering.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,95 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Ciphering
+    def self.included(base) 
+      base.extend ClassMethods
+    end
+    
+    class << self
+      def encrypt_text(text)
+        if cipher_key.blank?
+          text
+        else
+          c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
+          iv = c.random_iv
+          c.encrypt
+          c.key = cipher_key
+          c.iv = iv
+          e = c.update(text.to_s)
+          e << c.final
+          "aes-256-cbc:" + [e, iv].map {|v| Base64.encode64(v).strip}.join('--')
+        end
+      end
+      
+      def decrypt_text(text)
+        if text && match = text.match(/\Aaes-256-cbc:(.+)\Z/)
+          text = match[1]
+          c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
+          e, iv = text.split("--").map {|s| Base64.decode64(s)}
+          c.decrypt
+          c.key = cipher_key
+          c.iv = iv
+          d = c.update(e)
+          d << c.final
+        else
+          text
+        end
+      end
+      
+      def cipher_key
+        key = Redmine::Configuration['database_cipher_key'].to_s
+        key.blank? ? nil : Digest::SHA256.hexdigest(key)
+      end
+    end
+  
+    module ClassMethods
+      def encrypt_all(attribute)
+        transaction do
+          all.each do |object|
+            clear = object.send(attribute)
+            object.send "#{attribute}=", clear
+            raise(ActiveRecord::Rollback) unless object.save(false)
+          end
+        end ? true : false
+      end
+      
+      def decrypt_all(attribute)
+        transaction do
+          all.each do |object|
+            clear = object.send(attribute)
+            object.write_attribute attribute, clear
+            raise(ActiveRecord::Rollback) unless object.save(false)
+          end
+        end
+      end ? true : false
+    end
+    
+    private
+    
+    # Returns the value of the given ciphered attribute
+    def read_ciphered_attribute(attribute)
+      Redmine::Ciphering.decrypt_text(read_attribute(attribute))
+    end
+    
+    # Sets the value of the given ciphered attribute
+    def write_ciphered_attribute(attribute, value)
+      write_attribute(attribute, Redmine::Ciphering.encrypt_text(value))
+    end
+  end
+end
--- a/lib/redmine/.svn/text-base/configuration.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/.svn/text-base/configuration.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -66,6 +66,16 @@
         @config[name]
       end
       
+      # Yields a block with the specified hash configuration settings
+      def with(settings)
+        settings.stringify_keys!
+        load unless @config
+        was = settings.keys.inject({}) {|h,v| h[v] = @config[v]; h}
+        @config.merge! settings
+        yield if block_given?
+        @config.merge! was
+      end
+      
       private
       
       def load_from_yaml(filename, env)
--- a/lib/redmine/.svn/text-base/i18n.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/.svn/text-base/i18n.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -45,8 +45,8 @@
       time = time.to_time if time.is_a?(String)
       zone = User.current.time_zone
       local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time)
-      Setting.time_format.blank? ? ::I18n.l(local, :format => (include_date ? :default : :time)) : 
-                                   ((include_date ? "#{format_date(time)} " : "") + "#{local.strftime(Setting.time_format)}")
+      (include_date ? "#{format_date(local)} " : "") +
+        (Setting.time_format.blank? ? ::I18n.l(local, :format => :time) : local.strftime(Setting.time_format))
     end
 
     def day_name(day)
--- a/lib/redmine/.svn/text-base/unified_diff.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/.svn/text-base/unified_diff.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -22,13 +22,21 @@
       options.assert_valid_keys(:type, :max_lines)
       diff = diff.split("\n") if diff.is_a?(String)
       diff_type = options[:type] || 'inline'
-      
       lines = 0
       @truncated = false
       diff_table = DiffTable.new(diff_type)
       diff.each do |line|
+        line_encoding = nil
+        if line.respond_to?(:force_encoding)
+          line_encoding = line.encoding
+          # TODO: UTF-16 and Japanese CP932 which is imcompatible with ASCII
+          #       In Japan, diffrence between file path encoding
+          #       and file contents encoding is popular.
+          line.force_encoding('ASCII-8BIT')
+        end
         unless diff_table.add_line line
-          self << diff_table if diff_table.length > 1
+          line.force_encoding(line_encoding) if line_encoding
+          self << diff_table if diff_table.length > 0
           diff_table = DiffTable.new(diff_type)
         end
         lines += 1
@@ -40,7 +48,7 @@
       self << diff_table unless diff_table.empty?
       self
     end
-    
+
     def truncated?; @truncated; end
   end
 
--- a/lib/redmine/activity/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/activity/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/activity
 http://redmine.rubyforge.org/svn
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/ciphering.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,95 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Ciphering
+    def self.included(base) 
+      base.extend ClassMethods
+    end
+    
+    class << self
+      def encrypt_text(text)
+        if cipher_key.blank?
+          text
+        else
+          c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
+          iv = c.random_iv
+          c.encrypt
+          c.key = cipher_key
+          c.iv = iv
+          e = c.update(text.to_s)
+          e << c.final
+          "aes-256-cbc:" + [e, iv].map {|v| Base64.encode64(v).strip}.join('--')
+        end
+      end
+      
+      def decrypt_text(text)
+        if text && match = text.match(/\Aaes-256-cbc:(.+)\Z/)
+          text = match[1]
+          c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
+          e, iv = text.split("--").map {|s| Base64.decode64(s)}
+          c.decrypt
+          c.key = cipher_key
+          c.iv = iv
+          d = c.update(e)
+          d << c.final
+        else
+          text
+        end
+      end
+      
+      def cipher_key
+        key = Redmine::Configuration['database_cipher_key'].to_s
+        key.blank? ? nil : Digest::SHA256.hexdigest(key)
+      end
+    end
+  
+    module ClassMethods
+      def encrypt_all(attribute)
+        transaction do
+          all.each do |object|
+            clear = object.send(attribute)
+            object.send "#{attribute}=", clear
+            raise(ActiveRecord::Rollback) unless object.save(false)
+          end
+        end ? true : false
+      end
+      
+      def decrypt_all(attribute)
+        transaction do
+          all.each do |object|
+            clear = object.send(attribute)
+            object.write_attribute attribute, clear
+            raise(ActiveRecord::Rollback) unless object.save(false)
+          end
+        end
+      end ? true : false
+    end
+    
+    private
+    
+    # Returns the value of the given ciphered attribute
+    def read_ciphered_attribute(attribute)
+      Redmine::Ciphering.decrypt_text(read_attribute(attribute))
+    end
+    
+    # Sets the value of the given ciphered attribute
+    def write_ciphered_attribute(attribute, value)
+      write_attribute(attribute, Redmine::Ciphering.encrypt_text(value))
+    end
+  end
+end
--- a/lib/redmine/configuration.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/configuration.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -66,6 +66,16 @@
         @config[name]
       end
       
+      # Yields a block with the specified hash configuration settings
+      def with(settings)
+        settings.stringify_keys!
+        load unless @config
+        was = settings.keys.inject({}) {|h,v| h[v] = @config[v]; h}
+        @config.merge! settings
+        yield if block_given?
+        @config.merge! was
+      end
+      
       private
       
       def load_from_yaml(filename, env)
--- a/lib/redmine/core_ext/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/core_ext/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/core_ext
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/core_ext/string/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/core_ext/string/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/core_ext/string
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/default_data/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/default_data/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/default_data
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/export/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/export/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/export
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/helpers/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/helpers/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,13 +1,19 @@
 K 25
 svn:wc:ra_dav:version-url
 V 44
-/svn/!svn/ver/4782/trunk/lib/redmine/helpers
+/svn/!svn/ver/4968/trunk/lib/redmine/helpers
 END
 gantt.rb
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4782/trunk/lib/redmine/helpers/gantt.rb
+/svn/!svn/ver/4968/trunk/lib/redmine/helpers/gantt.rb
+END
+diff.rb
+K 25
+svn:wc:ra_dav:version-url
+V 52
+/svn/!svn/ver/4953/trunk/lib/redmine/helpers/diff.rb
 END
 calendar.rb
 K 25
--- a/lib/redmine/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/helpers
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-30T09:09:50.276451Z
-4782
+2011-02-28T20:23:28.847227Z
+4968
 jplang
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-2c61985f04e8f13965fd9880ff9ad5dc
-2011-01-30T09:09:50.276451Z
-4782
+2011-03-03T11:40:18.000000Z
+b06b1d003a56093679e3004b619b0e04
+2011-02-28T20:23:28.847227Z
+4968
 jplang
 has-props
 
@@ -58,7 +58,41 @@
 
 
 
-32266
+32380
+
+diff.rb
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+a3487dfca2baab10aacea141b7c0fc5f
+2011-02-27T12:50:47.369941Z
+4953
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2408
 
 calendar.rb
 file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/helpers/.svn/prop-base/diff.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/helpers/.svn/text-base/diff.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,72 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Helpers
+    class Diff
+      include ERB::Util
+      include ActionView::Helpers::TagHelper
+      include ActionView::Helpers::TextHelper
+      attr_reader :diff, :words
+      
+      def initialize(content_to, content_from)
+        @words = content_to.to_s.split(/(\s+)/)
+        @words = @words.select {|word| word != ' '}
+        words_from = content_from.to_s.split(/(\s+)/)
+        words_from = words_from.select {|word| word != ' '}    
+        @diff = words_from.diff @words
+      end
+  
+      def to_html
+        words = self.words.collect{|word| h(word)}
+        words_add = 0
+        words_del = 0
+        dels = 0
+        del_off = 0
+        diff.diffs.each do |diff|
+          add_at = nil
+          add_to = nil
+          del_at = nil
+          deleted = ""      
+          diff.each do |change|
+            pos = change[1]
+            if change[0] == "+"
+              add_at = pos + dels unless add_at
+              add_to = pos + dels
+              words_add += 1
+            else
+              del_at = pos unless del_at
+              deleted << ' ' + h(change[2])
+              words_del  += 1
+            end
+          end
+          if add_at
+            words[add_at] = '<span class="diff_in">' + words[add_at]
+            words[add_to] = words[add_to] + '</span>'
+          end
+          if del_at
+            words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>'
+            dels += 1
+            del_off += words_del
+            words_del = 0
+          end
+        end
+        words.join(' ')
+      end
+    end
+  end
+end
--- a/lib/redmine/helpers/.svn/text-base/gantt.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/helpers/.svn/text-base/gantt.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -353,11 +353,11 @@
           subject = "<span class='#{css_classes}'>"
           if issue.assigned_to.present?
             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
           subject << view.link_to_issue(issue)
           subject << '</span>'
-          html_subject(options, subject, :css => "issue-subject") + "\n"
+          html_subject(options, subject, :css => "issue-subject", :title => issue.subject) + "\n"
         when :image
           image_subject(options, issue.subject)
         when :pdf
@@ -709,9 +709,10 @@
       end
       
       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;'>"
-        output << subject
-        output << "</div>"
+        style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;"
+        style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width]
+        
+        output = view.content_tag 'div', subject, :class => options[:css], :style => style, :title => options[:title]
         @subjects << output
         output
       end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/helpers/diff.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,72 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Helpers
+    class Diff
+      include ERB::Util
+      include ActionView::Helpers::TagHelper
+      include ActionView::Helpers::TextHelper
+      attr_reader :diff, :words
+      
+      def initialize(content_to, content_from)
+        @words = content_to.to_s.split(/(\s+)/)
+        @words = @words.select {|word| word != ' '}
+        words_from = content_from.to_s.split(/(\s+)/)
+        words_from = words_from.select {|word| word != ' '}    
+        @diff = words_from.diff @words
+      end
+  
+      def to_html
+        words = self.words.collect{|word| h(word)}
+        words_add = 0
+        words_del = 0
+        dels = 0
+        del_off = 0
+        diff.diffs.each do |diff|
+          add_at = nil
+          add_to = nil
+          del_at = nil
+          deleted = ""      
+          diff.each do |change|
+            pos = change[1]
+            if change[0] == "+"
+              add_at = pos + dels unless add_at
+              add_to = pos + dels
+              words_add += 1
+            else
+              del_at = pos unless del_at
+              deleted << ' ' + h(change[2])
+              words_del  += 1
+            end
+          end
+          if add_at
+            words[add_at] = '<span class="diff_in">' + words[add_at]
+            words[add_to] = words[add_to] + '</span>'
+          end
+          if del_at
+            words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>'
+            dels += 1
+            del_off += words_del
+            words_del = 0
+          end
+        end
+        words.join(' ')
+      end
+    end
+  end
+end
--- a/lib/redmine/helpers/gantt.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/helpers/gantt.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -353,11 +353,11 @@
           subject = "<span class='#{css_classes}'>"
           if issue.assigned_to.present?
             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
           subject << view.link_to_issue(issue)
           subject << '</span>'
-          html_subject(options, subject, :css => "issue-subject") + "\n"
+          html_subject(options, subject, :css => "issue-subject", :title => issue.subject) + "\n"
         when :image
           image_subject(options, issue.subject)
         when :pdf
@@ -709,9 +709,10 @@
       end
       
       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;'>"
-        output << subject
-        output << "</div>"
+        style = "position: absolute;top:#{params[:top]}px;left:#{params[:indent]}px;"
+        style << "width:#{params[:subject_width] - params[:indent]}px;" if params[:subject_width]
+        
+        output = view.content_tag 'div', subject, :class => options[:css], :style => style, :title => options[:title]
         @subjects << output
         output
       end
--- a/lib/redmine/i18n.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/i18n.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -45,8 +45,8 @@
       time = time.to_time if time.is_a?(String)
       zone = User.current.time_zone
       local = zone ? time.in_time_zone(zone) : (time.utc? ? time.localtime : time)
-      Setting.time_format.blank? ? ::I18n.l(local, :format => (include_date ? :default : :time)) : 
-                                   ((include_date ? "#{format_date(time)} " : "") + "#{local.strftime(Setting.time_format)}")
+      (include_date ? "#{format_date(local)} " : "") +
+        (Setting.time_format.blank? ? ::I18n.l(local, :format => :time) : local.strftime(Setting.time_format))
     end
 
     def day_name(day)
--- a/lib/redmine/scm/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 40
-/svn/!svn/ver/4797/trunk/lib/redmine/scm
+/svn/!svn/ver/4993/trunk/lib/redmine/scm
 END
 base.rb
 K 25
--- a/lib/redmine/scm/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/scm
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 
 
--- a/lib/redmine/scm/adapters/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,53 +1,53 @@
 K 25
 svn:wc:ra_dav:version-url
 V 49
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters
+/svn/!svn/ver/4993/trunk/lib/redmine/scm/adapters
 END
 subversion_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 71
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/subversion_adapter.rb
+/svn/!svn/ver/4993/trunk/lib/redmine/scm/adapters/subversion_adapter.rb
 END
 bazaar_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 67
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/bazaar_adapter.rb
+/svn/!svn/ver/4992/trunk/lib/redmine/scm/adapters/bazaar_adapter.rb
 END
 abstract_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 69
-/svn/!svn/ver/4613/trunk/lib/redmine/scm/adapters/abstract_adapter.rb
+/svn/!svn/ver/4959/trunk/lib/redmine/scm/adapters/abstract_adapter.rb
 END
 git_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/git_adapter.rb
+/svn/!svn/ver/4992/trunk/lib/redmine/scm/adapters/git_adapter.rb
 END
 mercurial_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 70
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/mercurial_adapter.rb
+/svn/!svn/ver/4993/trunk/lib/redmine/scm/adapters/mercurial_adapter.rb
 END
 filesystem_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 71
-/svn/!svn/ver/1510/trunk/lib/redmine/scm/adapters/filesystem_adapter.rb
+/svn/!svn/ver/4941/trunk/lib/redmine/scm/adapters/filesystem_adapter.rb
 END
 cvs_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/cvs_adapter.rb
+/svn/!svn/ver/4992/trunk/lib/redmine/scm/adapters/cvs_adapter.rb
 END
 darcs_adapter.rb
 K 25
 svn:wc:ra_dav:version-url
 V 66
-/svn/!svn/ver/4797/trunk/lib/redmine/scm/adapters/darcs_adapter.rb
+/svn/!svn/ver/4992/trunk/lib/redmine/scm/adapters/darcs_adapter.rb
 END
--- a/lib/redmine/scm/adapters/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/scm/adapters
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-8435e09135c73a27534e626ffa21139c
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+7e0b7e8a12996f271854b48e2d7611e4
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 
 
@@ -58,7 +58,7 @@
 
 
 
-10793
+11535
 
 bazaar_adapter.rb
 file
@@ -66,10 +66,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-215a6667fc0893c697388b6351e170f9
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+2614557fb37905301939071ec226fe16
+2011-03-03T05:32:33.802461Z
+4992
 tmaruyama
 has-props
 
@@ -92,7 +92,7 @@
 
 
 
-7400
+8274
 
 mercurial
 dir
@@ -103,10 +103,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-b63a1e9ae95a7fb7c053bc363cf6672b
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:18.000000Z
+5cc0323dd42df9a3377099b0fdf9e95f
+2011-02-28T04:46:42.639929Z
+4959
 tmaruyama
 has-props
 
@@ -129,7 +129,7 @@
 
 
 
-9889
+9832
 
 git_adapter.rb
 file
@@ -137,10 +137,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-f4e47a55981d092307fda1755aa76af7
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+ba10ae64fed2363f2533aa558752be37
+2011-03-03T05:32:33.802461Z
+4992
 tmaruyama
 has-props
 
@@ -163,7 +163,7 @@
 
 
 
-10147
+11905
 
 mercurial_adapter.rb
 file
@@ -171,10 +171,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-65d72801f3587acd03e0c83201f46e1f
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+fe99380d7b29fe936554e10293751813
+2011-03-03T05:51:46.224821Z
+4993
 tmaruyama
 has-props
 
@@ -197,7 +197,7 @@
 
 
 
-8662
+11159
 
 filesystem_adapter.rb
 file
@@ -205,11 +205,11 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-5f311f051bcb17a87475757807f8a63e
-2008-06-08T15:44:23.440995Z
-1510
-jplang
+2011-03-03T11:40:18.000000Z
+4acd04cfa5dac0e54a35b8ef4a565217
+2011-02-24T05:58:59.661399Z
+4941
+tmaruyama
 has-props
 
 
@@ -231,7 +231,7 @@
 
 
 
-3509
+4266
 
 cvs_adapter.rb
 file
@@ -239,10 +239,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-0e124e1908ef1c6ae98ae8086562f960
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+a3914eff33df4b5a05a108945137360b
+2011-03-03T05:32:33.802461Z
+4992
 tmaruyama
 has-props
 
@@ -265,7 +265,7 @@
 
 
 
-13743
+14573
 
 darcs_adapter.rb
 file
@@ -273,10 +273,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-ac48aa0ac0732d1cc698484e7a40b356
-2011-02-04T10:24:10.099771Z
-4797
+2011-03-03T11:40:18.000000Z
+23725596dd2797f4dcdd5336e715c59a
+2011-03-03T05:32:33.802461Z
+4992
 tmaruyama
 has-props
 
@@ -299,5 +299,5 @@
 
 
 
-8564
+8925
 
--- a/lib/redmine/scm/adapters/.svn/text-base/abstract_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/abstract_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,25 +19,29 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class CommandFailed < StandardError #:nodoc:
       end
-      
+
       class AbstractAdapter #:nodoc:
         class << self
+          def client_command
+            ""
+          end
+
           # Returns the version of the scm client
           # Eg: [1, 5, 0] or [] if unknown
           def client_version
             []
           end
-          
+
           # Returns the version string of the scm client
           # Eg: '1.5.0' or 'Unknown version' if unknown
           def client_version_string
             v = client_version || 'Unknown version'
             v.is_a?(Array) ? v.join('.') : v.to_s
           end
-          
+
           # Returns true if the current client version is above
           # or equals the given one
           # If option is :unknown is set to true, it will return
@@ -45,19 +49,32 @@
           def client_version_above?(v, options={})
             ((client_version <=> v) >= 0) || (client_version.empty? && options[:unknown])
           end
+
+          def client_available
+            true
+          end
+
+          def shell_quote(str)
+            if Redmine::Platform.mswin?
+              '"' + str.gsub(/"/, '\\"') + '"'
+            else
+              "'" + str.gsub(/'/, "'\"'\"'") + "'"
+            end
+          end
         end
-                
-        def initialize(url, root_url=nil, login=nil, password=nil)
+
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @login = login if login && !login.empty?
           @password = (password || "") if @login
           @root_url = root_url.blank? ? retrieve_root_url : root_url
         end
-        
+
         def adapter_name
           'Abstract'
         end
-        
+
         def supports_cat?
           true
         end
@@ -65,11 +82,11 @@
         def supports_annotate?
           respond_to?('annotate')
         end
-        
+
         def root_url
           @root_url
         end
-      
+
         def url
           @url
         end
@@ -138,7 +155,7 @@
           path ||= ''
           (path[-1,1] == "/") ? path : "#{path}/"
         end
-        
+
         def without_leading_slash(path)
           path ||= ''
           path.gsub(%r{^/+}, '')
@@ -148,13 +165,9 @@
           path ||= ''
           (path[-1,1] == "/") ? path[0..-2] : path
          end
-        
+
         def shell_quote(str)
-          if Redmine::Platform.mswin?
-            '"' + str.gsub(/"/, '\\"') + '"'
-          else
-            "'" + str.gsub(/'/, "'\"'\"'") + "'"
-          end
+          self.class.shell_quote(str)
         end
 
       private
@@ -168,19 +181,19 @@
           base = path.match(/^\//) ? root_url : url
           shell_quote("#{base}/#{path}".gsub(/[?<>\*]/, ''))
         end
-            
+
         def logger
           self.class.logger
         end
-        
+
         def shellout(cmd, &block)
           self.class.shellout(cmd, &block)
         end
-        
+
         def self.logger
           RAILS_DEFAULT_LOGGER
         end
-        
+
         def self.shellout(cmd, &block)
           logger.debug "Shelling out: #{strip_credential(cmd)}" if logger && logger.debug?
           if Rails.env == 'development'
@@ -188,7 +201,12 @@
             cmd = "#{cmd} 2>>#{RAILS_ROOT}/log/scm.stderr.log"
           end
           begin
-            IO.popen(cmd, "r+") do |io|
+            if RUBY_VERSION < '1.9'
+              mode = "r+"
+            else
+              mode = "r+:ASCII-8BIT"
+            end
+            IO.popen(cmd, mode) do |io|
               io.close_write
               block.call(io) if block_given?
             end
@@ -198,8 +216,8 @@
             logger.error("SCM command failed, make sure that your SCM binary (eg. svn) is in PATH (#{ENV['PATH']}): #{strip_credential(cmd)}\n  with: #{msg}")
             raise CommandFailed.new(msg)
           end
-        end  
-        
+        end
+
         # Hides username/password in a given command
         def self.strip_credential(cmd)
           q = (Redmine::Platform.mswin? ? '"' : "'")
@@ -209,8 +227,19 @@
         def strip_credential(cmd)
           self.class.strip_credential(cmd)
         end
+
+        def scm_iconv(to, from, str)
+          return nil if str.nil?
+          return str if to == from
+          begin
+            Iconv.conv(to, from, str)
+          rescue Iconv::Failure => err
+            logger.error("failed to convert from #{from} to #{to}. #{err}")
+            nil
+          end
+        end
       end
-      
+
       class Entries < Array
         def sort_by_name
           sort {|x,y| 
@@ -219,7 +248,7 @@
             else
               x.kind <=> y.kind
             end
-          }   
+          }
         end
         
         def revisions
@@ -295,29 +324,8 @@
         def format_identifier
           identifier
         end
+      end
 
-        def save(repo)
-          Changeset.transaction do
-            changeset = Changeset.new(
-              :repository => repo,
-              :revision => identifier,
-              :scmid => scmid,
-              :committer => author, 
-              :committed_on => time,
-              :comments => message)
-            
-            if changeset.save
-              paths.each do |file|
-                Change.create(
-                  :changeset => changeset,
-                  :action => file[:action],
-                  :path => file[:path])
-              end
-            end
-          end
-        end
-      end
-        
       class Annotate
         attr_reader :lines, :revisions
         
--- a/lib/redmine/scm/adapters/.svn/text-base/bazaar_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/bazaar_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,15 +19,47 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class BazaarAdapter < AbstractAdapter
-      
+
         # Bazaar executable name
         BZR_BIN = Redmine::Configuration['scm_bazaar_command'] || "bzr"
-        
+
+        class << self
+          def client_command
+            @@bin    ||= BZR_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(BZR_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            !client_version.empty?
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
+          end
+        end
+
         # Get info about the repository
         def info
-          cmd = "#{BZR_BIN} revno #{target('')}"
+          cmd = "#{self.class.sq_bin} revno #{target('')}"
           info = nil
           shellout(cmd) do |io|
             if io.read =~ %r{^(\d+)\r?$}
@@ -43,13 +75,13 @@
         rescue CommandFailed
           return nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path ||= ''
           entries = Entries.new
-          cmd = "#{BZR_BIN} ls -v --show-ids"
+          cmd = "#{self.class.sq_bin} ls -v --show-ids"
           identifier = -1 unless identifier && identifier.to_i > 0 
           cmd << " -r#{identifier.to_i}" 
           cmd << " #{target(path)}"
@@ -71,13 +103,13 @@
           logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
           entries.sort_by_name
         end
-    
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path ||= ''
           identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : 'last:1'
           identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : 1
           revisions = Revisions.new
-          cmd = "#{BZR_BIN} log -v --show-ids -r#{identifier_to}..#{identifier_from} #{target(path)}"
+          cmd = "#{self.class.sq_bin} log -v --show-ids -r#{identifier_to}..#{identifier_from} #{target(path)}"
           shellout(cmd) do |io|
             revision = nil
             parsing = nil
@@ -132,7 +164,7 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil)
           path ||= ''
           if identifier_to
@@ -143,7 +175,7 @@
           if identifier_from
             identifier_from = identifier_from.to_i
           end
-          cmd = "#{BZR_BIN} diff -r#{identifier_to}..#{identifier_from} #{target(path)}"
+          cmd = "#{self.class.sq_bin} diff -r#{identifier_to}..#{identifier_from} #{target(path)}"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -153,9 +185,9 @@
           #return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
-          cmd = "#{BZR_BIN} cat"
+          cmd = "#{self.class.sq_bin} cat"
           cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
           cmd << " #{target(path)}"
           cat = nil
@@ -166,9 +198,9 @@
           return nil if $? && $?.exitstatus != 0
           cat
         end
-        
+
         def annotate(path, identifier=nil)
-          cmd = "#{BZR_BIN} annotate --all"
+          cmd = "#{self.class.sq_bin} annotate --all"
           cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
           cmd << " #{target(path)}"
           blame = Annotate.new
--- a/lib/redmine/scm/adapters/.svn/text-base/cvs_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/cvs_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -24,13 +24,46 @@
 
         # CVS executable name
         CVS_BIN = Redmine::Configuration['scm_cvs_command'] || "cvs"
-    
+
+        class << self
+          def client_command
+            @@bin    ||= CVS_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(CVS_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            client_version_above?([1, 12])
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}m)
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
+          end
+        end
+
         # Guidelines for the input:
         #  url -> the project-path, relative to the cvsroot (eg. module name)
         #  root_url -> the good old, sometimes damned, CVSROOT
         #  login -> unnecessary
         #  password -> unnecessary too
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @login = login if login && !login.empty?
           @password = (password || "") if @login
@@ -38,24 +71,24 @@
           raise CommandFailed if root_url.blank?
           @root_url = root_url
         end
-        
+
         def root_url
           @root_url
         end
-        
+
         def url
           @url
         end
-        
+
         def info
           logger.debug "<cvs> info"
           Info.new({:root_url => @root_url, :lastrev => nil})
         end
-        
+
         def get_previous_revision(revision)
           CvsRevisionHelper.new(revision).prevRev
         end
-    
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         # this method is used by the repository-browser (aka LIST)
@@ -63,14 +96,14 @@
           logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'"
           path_with_project="#{url}#{with_leading_slash(path)}"
           entries = Entries.new
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rls -e"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rls -e"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " #{shell_quote path_with_project}"
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)
               logger.debug(">>InspectLine #{fields.inspect}")
-              
+
               if fields[0]!="D"
                 entries << Entry.new({:name => fields[-5],
                   #:path => fields[-4].include?(path)?fields[-4]:(path + "/"+ fields[-4]),
@@ -96,19 +129,19 @@
           end
           return nil if $? && $?.exitstatus != 0
           entries.sort_by_name
-        end  
+        end
 
         STARTLOG="----------------------------"
         ENDLOG  ="============================================================================="
-        
+
         # Returns all revisions found between identifier_from and identifier_to
         # in the repository. both identifier have to be dates or nil.
         # these method returns nothing but yield every result in block
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}, &block)
           logger.debug "<cvs> revisions path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
-          
+
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rlog"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rlog"
           cmd << " -d\">#{time_to_cvstime_rlog(identifier_from)}\"" if identifier_from
           cmd << " #{shell_quote path_with_project}"
           shellout(cmd) do |io|
@@ -123,7 +156,7 @@
             file_state=nil
             branch_map=nil
             
-            io.each_line() do |line|            
+            io.each_line() do |line|
               
               if state!="revision" && /^#{ENDLOG}/ =~ line
                 commit_log=String.new
@@ -162,9 +195,9 @@
                 end
                 next
               elsif state=="revision"
-                if /^#{ENDLOG}/ =~ line || /^#{STARTLOG}/ =~ line               
+                if /^#{ENDLOG}/ =~ line || /^#{STARTLOG}/ =~ line
                   if revision
-                    
+
                     revHelper=CvsRevisionHelper.new(revision)
                     revBranch="HEAD"
                     
@@ -176,7 +209,7 @@
                     
                     logger.debug("********** YIELD Revision #{revision}::#{revBranch}")
                     
-                    yield Revision.new({                    
+                    yield Revision.new({
                       :time => date,
                       :author => author,
                       :message=>commit_log.chomp,
@@ -188,9 +221,9 @@
                         :kind=>'file',
                         :action=>file_state
                       }]
-                    })                 
+                    })
                   end
-    
+
                   commit_log=String.new
                   revision=nil
                   
@@ -199,7 +232,7 @@
                   end
                   next
                 end
-                  
+
                 if /^branches: (.+)$/ =~ line
                   #TODO: version.branch = $1
                 elsif /^revision (\d+(?:\.\d+)+).*$/ =~ line
@@ -216,20 +249,20 @@
                   #                  version.line_minus = linechanges[2]
                   #                else
                   #                  version.line_plus  = 0
-                  #                  version.line_minus = 0     
-                  #                end              
-                else            
+                  #                  version.line_minus = 0
+                  #                end
+                else
                   commit_log << line unless line =~ /^\*\*\* empty log message \*\*\*/
-                end 
-              end 
+                end
+              end
             end
           end
-        end  
-        
+        end
+
         def diff(path, identifier_from, identifier_to=nil)
           logger.debug "<cvs> diff path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -238,28 +271,29 @@
           end
           return nil if $? && $?.exitstatus != 0
           diff
-        end  
-        
+        end
+
         def cat(path, identifier=nil)
           identifier = (identifier) ? identifier : "HEAD"
           logger.debug "<cvs> cat path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} co"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} co"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " -p #{shell_quote path_with_project}"
           cat = nil
           shellout(cmd) do |io|
+            io.binmode
             cat = io.read
           end
           return nil if $? && $?.exitstatus != 0
           cat
-        end  
+        end
 
         def annotate(path, identifier=nil)
           identifier = (identifier) ? identifier.to_i : "HEAD"
           logger.debug "<cvs> annotate path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
           blame = Annotate.new
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -270,9 +304,9 @@
           return nil if $? && $?.exitstatus != 0
           blame
         end
-         
+
         private
-        
+
         # Returns the root url without the connexion string
         # :pserver:anonymous@foo.bar:/path => /path
         # :ext:cvsservername:/path => /path
@@ -345,7 +379,11 @@
         private
         def buildRevision(rev)
           if rev== 0
-            @base
+            if @branchid.nil?
+              @base+".0"
+            else
+              @base
+            end
           elsif @branchid.nil? 
             @base+"."+rev.to_s
           else
--- a/lib/redmine/scm/adapters/.svn/text-base/darcs_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/darcs_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,29 +20,45 @@
 
 module Redmine
   module Scm
-    module Adapters    
-      class DarcsAdapter < AbstractAdapter      
+    module Adapters
+      class DarcsAdapter < AbstractAdapter
         # Darcs executable name
         DARCS_BIN = Redmine::Configuration['scm_darcs_command'] || "darcs"
-        
+
         class << self
+          def client_command
+            @@bin    ||= DARCS_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(DARCS_BIN)
+          end
+
           def client_version
             @@client_version ||= (darcs_binary_version || [])
           end
-  	  
+
+          def client_available
+            !client_version.empty?
+          end
+
           def darcs_binary_version
-            darcsversion = darcs_binary_version_from_command_line
+            darcsversion = darcs_binary_version_from_command_line.dup
+            if darcsversion.respond_to?(:force_encoding)
+              darcsversion.force_encoding('ASCII-8BIT')
+            end
             if m = darcsversion.match(%r{\A(.*?)((\d+\.)+\d+)})
               m[2].scan(%r{\d+}).collect(&:to_i)
             end
           end
 
           def darcs_binary_version_from_command_line
-            shellout("#{DARCS_BIN} --version") { |io| io.read }.to_s
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
         end
 
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @root_url = url
         end
@@ -57,7 +73,7 @@
           rev = revisions(nil,nil,nil,{:limit => 1})
           rev ? Info.new({:root_url => @url, :lastrev => rev.last}) : nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
@@ -65,8 +81,8 @@
           if path.blank?
             path = ( self.class.client_version_above?([2, 2, 0]) ? @url : '.' )
           end
-          entries = Entries.new          
-          cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output"
+          entries = Entries.new
+          cmd = "#{self.class.sq_bin} annotate --repodir #{shell_quote @url} --xml-output"
           cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
           cmd << " #{shell_quote path}"
           shellout(cmd) do |io|
@@ -86,11 +102,11 @@
           return nil if $? && $?.exitstatus != 0
           entries.compact.sort_by_name
         end
-    
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path = '.' if path.blank?
           revisions = Revisions.new
-          cmd = "#{DARCS_BIN} changes --repodir #{shell_quote @url} --xml-output"
+          cmd = "#{self.class.sq_bin} changes --repodir #{shell_quote @url} --xml-output"
           cmd << " --from-match #{shell_quote("hash #{identifier_from}")}" if identifier_from
           cmd << " --last #{options[:limit].to_i}" if options[:limit]
           shellout(cmd) do |io|
@@ -113,10 +129,10 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil)
           path = '*' if path.blank?
-          cmd = "#{DARCS_BIN} diff --repodir #{shell_quote @url}"
+          cmd = "#{self.class.sq_bin} diff --repodir #{shell_quote @url}"
           if identifier_to.nil?
             cmd << " --match #{shell_quote("hash #{identifier_from}")}"
           else
@@ -133,9 +149,9 @@
           return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
-          cmd = "#{DARCS_BIN} show content --repodir #{shell_quote @url}"
+          cmd = "#{self.class.sq_bin} show content --repodir #{shell_quote @url}"
           cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
           cmd << " #{shell_quote path}"
           cat = nil
@@ -148,7 +164,7 @@
         end
 
         private
-        
+
         # Returns an Entry from the given XML element
         # or nil if the entry was deleted
         def entry_from_xml(element, path_prefix)
@@ -156,7 +172,7 @@
           if modified_element.elements['modified_how'].text.match(/removed/)
             return nil
           end
-          
+
           Entry.new({:name => element.attributes['name'],
                      :path => path_prefix + element.attributes['name'],
                      :kind => element.name == 'file' ? 'file' : 'dir',
@@ -165,7 +181,7 @@
                        :identifier => nil,
                        :scmid => modified_element.elements['patch'].attributes['hash']
                        })
-                     })        
+                     })
         end
 
         def get_paths_for_patch(hash)
@@ -196,10 +212,10 @@
           end
           paths
         end
-        
+
         # Retrieve changed paths for a single patch
         def get_paths_for_patch_raw(hash)
-          cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output"
+          cmd = "#{self.class.sq_bin} annotate --repodir #{shell_quote @url} --summary --xml-output"
           cmd << " --match #{shell_quote("hash #{hash}")} "
           paths = []
           shellout(cmd) do |io|
--- a/lib/redmine/scm/adapters/.svn/text-base/filesystem_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/filesystem_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -23,12 +23,19 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class FilesystemAdapter < AbstractAdapter
-        
 
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        class << self
+          def client_available
+            true
+          end
+        end
+
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = with_trailling_slash(url)
+          @path_encoding = path_encoding || 'UTF-8'
         end
 
         def format_path_ends(path, leading=true, trailling=true)
@@ -46,47 +53,59 @@
         rescue CommandFailed
           return nil
         end
-        
+
         def entries(path="", identifier=nil)
           entries = Entries.new
-          Dir.new(target(path)).each do |e|
-            relative_path = format_path_ends((format_path_ends(path,
-                                                               false,
-                                                               true) + e),
-                                             false,false)
-            target = target(relative_path)
-            entries << 
-              Entry.new({ :name => File.basename(e),
+          trgt_utf8 = target(path)
+          trgt = scm_iconv(@path_encoding, 'UTF-8', trgt_utf8)
+          Dir.new(trgt).each do |e1|
+            e_utf8 = scm_iconv('UTF-8', @path_encoding, e1)
+            relative_path_utf8 = format_path_ends((format_path_ends(path,false,true) + e_utf8),false,false)
+            t1_utf8 = target(relative_path_utf8)
+            t1 = scm_iconv(@path_encoding, 'UTF-8', t1_utf8)
+            relative_path = scm_iconv(@path_encoding, 'UTF-8', relative_path_utf8)
+            e1 = scm_iconv(@path_encoding, 'UTF-8', e_utf8)
+            if File.exist?(t1) and # paranoid test
+                  %w{file directory}.include?(File.ftype(t1)) and # avoid special types
+                  not File.basename(e1).match(/^\.+$/) # avoid . and ..
+              p1         = File.readable?(t1) ? relative_path : ""
+              utf_8_path = scm_iconv('UTF-8', @path_encoding, p1)
+              entries <<
+                Entry.new({ :name => scm_iconv('UTF-8', @path_encoding, File.basename(e1)),
                           # below : list unreadable files, but dont link them.
-                          :path => File.readable?(target) ? relative_path : "",
-                          :kind => (File.directory?(target) ? 'dir' : 'file'),
-                          :size => (File.directory?(target) ? nil : [File.size(target)].pack('l').unpack('L').first),
+                          :path => utf_8_path,
+                          :kind => (File.directory?(t1) ? 'dir' : 'file'),
+                          :size => (File.directory?(t1) ? nil : [File.size(t1)].pack('l').unpack('L').first),
                           :lastrev => 
-                          Revision.new({:time => (File.mtime(target)).localtime,
-                                       })
-                        }) if File.exist?(target) and # paranoid test
-              %w{file directory}.include?(File.ftype(target)) and # avoid special types
-              not File.basename(e).match(/^\.+$/) # avoid . and ..             
+                              Revision.new({:time => (File.mtime(t1)) })
+                        })
+            end
           end
           entries.sort_by_name
+        rescue  => err
+          logger.error "scm: filesystem: error: #{err.message}"
+          raise CommandFailed.new(err.message)
         end
-        
+
         def cat(path, identifier=nil)
-          File.new(target(path), "rb").read
+          p = scm_iconv(@path_encoding, 'UTF-8', target(path))
+          File.new(p, "rb").read
+        rescue  => err
+          logger.error "scm: filesystem: error: #{err.message}"
+          raise CommandFailed.new(err.message)
         end
 
         private
-        
+
         # AbstractAdapter::target is implicitly made to quote paths.
         # Here we do not shell-out, so we do not want quotes.
         def target(path=nil)
-          #Prevent the use of ..
+          # Prevent the use of ..
           if path and !path.match(/(^|\/)\.\.(\/|$)/)
             return "#{self.url}#{without_leading_slash(path)}"
           end
           return self.url
         end
-        
       end
     end
   end
--- a/lib/redmine/scm/adapters/.svn/text-base/git_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/git_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,11 +19,54 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class GitAdapter < AbstractAdapter
+
+        SCM_GIT_REPORT_LAST_COMMIT = true
+
         # Git executable name
         GIT_BIN = Redmine::Configuration['scm_git_command'] || "git"
 
+        # raised if scm command exited with error, e.g. unknown revision.
+        class ScmCommandAborted < CommandFailed; end
+
+        class << self
+          def client_command
+            @@bin    ||= GIT_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(GIT_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            !client_version.empty?
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version --no-color") { |io| io.read }.to_s
+          end
+        end
+
+        def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
+          super
+          @flag_report_last_commit = SCM_GIT_REPORT_LAST_COMMIT
+        end
+
         def info
           begin
             Info.new(:root_url => url, :lastrev => lastrev('',nil))
@@ -35,7 +78,7 @@
         def branches
           return @branches if @branches
           @branches = []
-          cmd = "#{GIT_BIN} --git-dir #{target('')} branch --no-color"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} branch --no-color"
           shellout(cmd) do |io|
             io.each_line do |line|
               @branches << line.match('\s*\*?\s*(.*)$')[1]
@@ -46,20 +89,20 @@
 
         def tags
           return @tags if @tags
-          cmd = "#{GIT_BIN} --git-dir #{target('')} tag"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} tag"
           shellout(cmd) do |io|
             @tags = io.readlines.sort!.map{|t| t.strip}
           end
         end
 
         def default_branch
-          branches.include?('master') ? 'master' : branches.first 
+          branches.include?('master') ? 'master' : branches.first
         end
-        
+
         def entries(path=nil, identifier=nil)
           path ||= ''
           entries = Entries.new
-          cmd = "#{GIT_BIN} --git-dir #{target('')} ls-tree -l "
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} ls-tree -l "
           cmd << shell_quote("HEAD:" + path) if identifier.nil?
           cmd << shell_quote(identifier + ":" + path) if identifier
           shellout(cmd)  do |io|
@@ -75,7 +118,7 @@
                  :path => full_path,
                  :kind => (type == "tree") ? 'dir' : 'file',
                  :size => (type == "tree") ? nil : size,
-                 :lastrev => lastrev(full_path,identifier)
+                 :lastrev => @flag_report_last_commit ? lastrev(full_path,identifier) : Revision.new
                 }) unless entries.detect{|entry| entry.name == name}
               end
             end
@@ -84,18 +127,17 @@
           entries.sort_by_name
         end
 
-        def lastrev(path,rev)
+        def lastrev(path, rev)
           return nil if path.nil?
-          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 path} " unless path.empty?
+          cmd_args = %w|log --no-color --encoding=UTF-8 --date=iso --pretty=fuller --no-merges -n 1|
+          cmd_args << rev if rev 
+          cmd_args << "--" << path unless path.empty?
           lines = []
-          shellout(cmd) { |io| lines = io.readlines }
-          return nil if $? && $?.exitstatus != 0
+          scm_cmd(*cmd_args) { |io| lines = io.readlines }
           begin
               id = lines[0].split[1]
               author = lines[1].match('Author:\s+(.*)$')[1]
-              time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1]).localtime
+              time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1])
 
               Revision.new({
                 :identifier => id,
@@ -104,26 +146,29 @@
                 :time => time,
                 :message => nil, 
                 :paths => nil 
-              })
+                })
           rescue NoMethodError => e
               logger.error("The revision '#{path}' has a wrong format")
               return nil
           end
+        rescue ScmCommandAborted
+          nil
         end
 
         def revisions(path, identifier_from, identifier_to, options={})
           revisions = Revisions.new
+          cmd_args = %w|log --no-color --encoding=UTF-8 --raw --date=iso --pretty=fuller|
+          cmd_args << "--reverse" if options[:reverse]
+          cmd_args << "--all" if options[:all]
+          cmd_args << "-n" << "#{options[:limit].to_i}" if options[:limit]
+          from_to = ""
+          from_to << "#{identifier_from}.." if identifier_from
+          from_to << "#{identifier_to}" if identifier_to
+          cmd_args << from_to if !from_to.empty?
+          cmd_args << "--since=#{options[:since].strftime("%Y-%m-%d %H:%M:%S")}" if options[:since]
+          cmd_args << "--" << path if path && !path.empty?
 
-          cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --raw --date=iso --pretty=fuller "
-          cmd << " --reverse " if options[:reverse]
-          cmd << " --all " if options[:all]
-          cmd << " -n #{options[:limit].to_i} " if options[:limit]
-          cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from
-          cmd << "#{shell_quote identifier_to}" if identifier_to
-          cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since]
-          cmd << " -- #{shell_quote path}" if path && !path.empty?
-
-          shellout(cmd) do |io|
+          scm_cmd *cmd_args do |io|
             files=[]
             changeset = {}
             parsing_descr = 0  #0: not parsing desc or files, 1: parsing desc, 2: parsing files
@@ -200,8 +245,8 @@
               end
             end
           end
-
-          return nil if $? && $?.exitstatus != 0
+          revisions
+        rescue ScmCommandAborted
           revisions
         end
 
@@ -209,9 +254,9 @@
           path ||= ''
 
           if identifier_to
-            cmd = "#{GIT_BIN} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" 
+            cmd = "#{self.class.sq_bin} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" 
           else
-            cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}"
+            cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}"
           end
 
           cmd << " -- #{shell_quote path}" unless path.empty?
@@ -227,7 +272,7 @@
         
         def annotate(path, identifier=nil)
           identifier = 'HEAD' if identifier.blank?
-          cmd = "#{GIT_BIN} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}"
           blame = Annotate.new
           content = nil
           shellout(cmd) { |io| io.binmode; content = io.read }
@@ -250,12 +295,12 @@
           end
           blame
         end
-        
+
         def cat(path, identifier=nil)
           if identifier.nil?
             identifier = 'HEAD'
           end
-          cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}"
           cat = nil
           shellout(cmd) do |io|
             io.binmode
@@ -271,6 +316,18 @@
             identifier[0,8]
           end
         end
+
+        def scm_cmd(*args, &block)
+          repo_path = root_url || url
+          full_args = [GIT_BIN, '--git-dir', repo_path]
+          full_args += args
+          ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block)
+          if $? && $?.exitstatus != 0
+            raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}"
+          end
+          ret
+        end
+        private :scm_cmd
       end
     end
   end
--- a/lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,32 +20,51 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class MercurialAdapter < AbstractAdapter
 
         # Mercurial executable name
         HG_BIN = Redmine::Configuration['scm_mercurial_command'] || "hg"
-        TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial"
+        HELPERS_DIR = File.dirname(__FILE__) + "/mercurial"
+        HG_HELPER_EXT = "#{HELPERS_DIR}/redminehelper.py"
         TEMPLATE_NAME = "hg-template"
         TEMPLATE_EXTENSION = "tmpl"
 
+        # raised if hg command exited with error, e.g. unknown revision.
+        class HgCommandAborted < CommandFailed; end
+
         class << self
+          def client_command
+            @@bin    ||= HG_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(HG_BIN)
+          end
+
           def client_version
             @@client_version ||= (hgversion || [])
           end
 
-          def hgversion  
+          def client_available
+            !client_version.empty?
+          end
+
+          def hgversion
             # The hg version is expressed either as a
             # release number (eg 0.9.5 or 1.0) or as a revision
             # id composed of 12 hexa characters.
-            theversion = hgversion_from_command_line
+            theversion = hgversion_from_command_line.dup
+            if theversion.respond_to?(:force_encoding)
+              theversion.force_encoding('ASCII-8BIT')
+            end
             if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)})
               m[2].scan(%r{\d+}).collect(&:to_i)
             end
           end
 
           def hgversion_from_command_line
-            shellout("#{HG_BIN} --version") { |io| io.read }.to_s
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
 
           def template_path
@@ -58,153 +77,193 @@
             else
               ver = "0.9.5"
             end
-            "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
+            "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
           end
         end
 
-        def info
-          cmd = "#{HG_BIN} -R #{target('')} root"
-          root_url = nil
-          shellout(cmd) do |io|
-            root_url = io.read
-          end
-          return nil if $? && $?.exitstatus != 0
-          info = Info.new({:root_url => root_url.chomp,
-                            :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
-                          })
-          info
-        rescue CommandFailed
-          return nil
+        def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
+          super
+          @path_encoding = path_encoding || 'UTF-8'
         end
 
-        def entries(path=nil, identifier=nil)
-          path ||= ''
-          entries = Entries.new
-          cmd = "#{HG_BIN} -R #{target('')} --cwd #{target('')} locate"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " " + shell_quote("path:#{path}") unless path.empty?
-          shellout(cmd) do |io|
-            io.each_line do |line|
-              # HG uses antislashs as separator on Windows
-              line = line.gsub(/\\/, "/")
-              if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'')
-                e ||= line
-                e = e.chomp.split(%r{[\/\\]})
-                entries << Entry.new({:name => e.first,
-                                       :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"),
-                                       :kind => (e.size > 1 ? 'dir' : 'file'),
-                                       :lastrev => Revision.new
-                                     }) unless e.empty? || entries.detect{|entry| entry.name == e.first}
-              end
+        def info
+          tip = summary['repository']['tip']
+          Info.new(:root_url => CGI.unescape(summary['repository']['root']),
+                   :lastrev => Revision.new(:revision => tip['revision'],
+                                            :scmid => tip['node']))
+        end
+
+        def tags
+          as_ary(summary['repository']['tag']).map { |e| e['name'] }
+        end
+
+        # Returns map of {'tag' => 'nodeid', ...}
+        def tagmap
+          alist = as_ary(summary['repository']['tag']).map do |e|
+            e.values_at('name', 'node')
+          end
+          Hash[*alist.flatten]
+        end
+
+        def branches
+          as_ary(summary['repository']['branch']).map { |e| e['name'] }
+        end
+
+        # Returns map of {'branch' => 'nodeid', ...}
+        def branchmap
+          alist = as_ary(summary['repository']['branch']).map do |e|
+            e.values_at('name', 'node')
+          end
+          Hash[*alist.flatten]
+        end
+
+        def summary
+          return @summary if @summary 
+          hg 'rhsummary' do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
+            begin
+              @summary = ActiveSupport::XmlMini.parse(output)['rhsummary']
+            rescue
             end
           end
-          return nil if $? && $?.exitstatus != 0
-          entries.sort_by_name
+        end
+        private :summary
+
+        def entries(path=nil, identifier=nil)
+          p1 = scm_iconv(@path_encoding, 'UTF-8', path)
+          manifest = hg('rhmanifest', '-r', CGI.escape(hgrev(identifier)),
+                        CGI.escape(without_leading_slash(p1.to_s))) do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
+            begin
+              ActiveSupport::XmlMini.parse(output)['rhmanifest']['repository']['manifest']
+            rescue
+            end
+          end
+          path_prefix = path.blank? ? '' : with_trailling_slash(path)
+
+          entries = Entries.new
+          as_ary(manifest['dir']).each do |e|
+            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
+            p = "#{path_prefix}#{n}"
+            entries << Entry.new(:name => n, :path => p, :kind => 'dir')
+          end
+
+          as_ary(manifest['file']).each do |e|
+            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
+            p = "#{path_prefix}#{n}"
+            lr = Revision.new(:revision => e['revision'], :scmid => e['node'],
+                              :identifier => e['node'],
+                              :time => Time.at(e['time'].to_i))
+            entries << Entry.new(:name => n, :path => p, :kind => 'file',
+                                 :size => e['size'].to_i, :lastrev => lr)
+          end
+
+          entries
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
-        # Fetch the revisions by using a template file that 
+        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
+          revs = Revisions.new
+          each_revision(path, identifier_from, identifier_to, options) { |e| revs << e }
+          revs
+        end
+
+        # Iterates the revisions by using a template file that
         # makes Mercurial produce a xml output.
-        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})  
-          revisions = Revisions.new
-          cmd = "#{HG_BIN} --debug --encoding utf8 -R #{target('')} log -C --style #{shell_quote self.class.template_path}"
-          if identifier_from && identifier_to
-            cmd << " -r #{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
-          elsif identifier_from
-            cmd << " -r #{hgrev(identifier_from)}:"
-          end
-          cmd << " --limit #{options[:limit].to_i}" if options[:limit]
-          cmd << " #{shell_quote path}" unless path.blank?
-          shellout(cmd) do |io|
+        def each_revision(path=nil, identifier_from=nil, identifier_to=nil, options={})
+          hg_args = ['log', '--debug', '-C', '--style', self.class.template_path]
+          hg_args << '-r' << "#{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
+          hg_args << '--limit' << options[:limit] if options[:limit]
+          hg_args << hgtarget(path) unless path.blank?
+          log = hg(*hg_args) do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
-              # HG doesn't close the XML Document...
-              doc = REXML::Document.new(io.read << "</log>")
-              doc.elements.each("log/logentry") do |logentry|
-                paths = []
-                copies = logentry.get_elements('paths/path-copied')
-                logentry.elements.each("paths/path") do |path|
-                  # Detect if the added file is a copy
-                  if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text }
-                    from_path = c.attributes['copyfrom-path']
-                    from_rev = logentry.attributes['revision']
-                  end
-                  paths << {:action => path.attributes['action'],
-                    :path => "/#{CGI.unescape(path.text)}",
-                    :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil,
-                    :from_revision => from_rev ? from_rev : nil
-                  }
-                end
-                paths.sort! { |x,y| x[:path] <=> y[:path] }
-
-                revisions << Revision.new({:identifier => logentry.attributes['revision'],
-                                            :scmid => logentry.attributes['node'],
-                                            :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""),
-                                            :time => Time.parse(logentry.elements['date'].text).localtime,
-                                            :message => logentry.elements['msg'].text,
-                                            :paths => paths
-                                          })
-              end
+              # Mercurial < 1.5 does not support footer template for '</log>'
+              ActiveSupport::XmlMini.parse("#{output}</log>")['log']
             rescue
-              logger.debug($!)
             end
           end
-          return nil if $? && $?.exitstatus != 0
-          revisions
+
+          as_ary(log['logentry']).each do |le|
+            cpalist = as_ary(le['paths']['path-copied']).map do |e|
+              [e['__content__'], e['copyfrom-path']].map { |s| CGI.unescape(s) }
+            end
+            cpmap = Hash[*cpalist.flatten]
+
+            paths = as_ary(le['paths']['path']).map do |e|
+              p = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['__content__']) )
+              {:action => e['action'], :path => with_leading_slash(p),
+               :from_path => (cpmap.member?(p) ? with_leading_slash(cpmap[p]) : nil),
+               :from_revision => (cpmap.member?(p) ? le['revision'] : nil)}
+            end.sort { |a, b| a[:path] <=> b[:path] }
+
+            yield Revision.new(:revision => le['revision'],
+                               :scmid => le['node'],
+                               :author => (le['author']['__content__'] rescue ''),
+                               :time => Time.parse(le['date']['__content__']).localtime,
+                               :message => le['msg']['__content__'],
+                               :paths => paths)
+          end
+          self
         end
 
         def diff(path, identifier_from, identifier_to=nil)
-          path ||= ''
-          diff_args = ''
+          hg_args = %w|rhdiff|
+          if identifier_to
+            hg_args << '-r' << hgrev(identifier_to) << '-r' << hgrev(identifier_from)
+          else
+            hg_args << '-c' << hgrev(identifier_from)
+          end
+          unless path.blank?
+            p = scm_iconv(@path_encoding, 'UTF-8', path)
+            hg_args << CGI.escape(hgtarget(p))
+          end
           diff = []
-          if identifier_to
-            diff_args = "-r #{hgrev(identifier_to)} -r #{hgrev(identifier_from)}"
-          else
-            if self.class.client_version_above?([1, 2])
-              diff_args = "-c #{hgrev(identifier_from)}"
-            else
-              return []
-            end
-          end
-          cmd = "#{HG_BIN} -R #{target('')} --config diff.git=false diff --nodates #{diff_args}"
-          cmd << " -I #{target(path)}" unless path.empty?
-          shellout(cmd) do |io|
+          hg *hg_args do |io|
             io.each_line do |line|
               diff << line
             end
           end
-          return nil if $? && $?.exitstatus != 0
           diff
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
         def cat(path, identifier=nil)
-          cmd = "#{HG_BIN} -R #{target('')} cat"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " #{target(path)}"
-          cat = nil
-          shellout(cmd) do |io|
+          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
+          hg 'rhcat', '-r', hgrev(identifier), hgtarget(p) do |io|
             io.binmode
-            cat = io.read
+            io.read
           end
-          return nil if $? && $?.exitstatus != 0
-          cat
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
         def annotate(path, identifier=nil)
-          path ||= ''
-          cmd = "#{HG_BIN} -R #{target('')}"
-          cmd << " annotate -ncu"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " #{target(path)}"
+          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
           blame = Annotate.new
-          shellout(cmd) do |io|
+          hg 'rhannotate', '-ncu', '-r', hgrev(identifier), hgtarget(p) do |io|
             io.each_line do |line|
+              line.force_encoding('ASCII-8BIT') if line.respond_to?(:force_encoding)
               next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$}
               r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3,
                                :identifier => $3)
               blame.add_line($4.rstrip, r)
             end
           end
-          return nil if $? && $?.exitstatus != 0
           blame
+        rescue HgCommandAborted
+          nil  # means not found or cannot be annotated
         end
 
         class Revision < Redmine::Scm::Adapters::Revision
@@ -214,11 +273,40 @@
           end
         end
 
+        # Runs 'hg' command with the given args
+        def hg(*args, &block)
+          repo_path = root_url || url
+          full_args = [HG_BIN, '-R', repo_path, '--encoding', 'utf-8']
+          full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}"
+          full_args << '--config' << 'diff.git=false'
+          full_args += args
+          ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block)
+          if $? && $?.exitstatus != 0
+            raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}"
+          end
+          ret
+        end
+        private :hg
+
         # Returns correct revision identifier
-        def hgrev(identifier)
-          shell_quote(identifier.blank? ? 'tip' : identifier.to_s)
+        def hgrev(identifier, sq=false)
+          rev = identifier.blank? ? 'tip' : identifier.to_s
+          rev = shell_quote(rev) if sq
+          rev
         end
         private :hgrev
+
+        def hgtarget(path)
+          path ||= ''
+          root_url + '/' + without_leading_slash(path)
+        end
+        private :hgtarget
+
+        def as_ary(o)
+          return [] unless o
+          o.is_a?(Array) ? o : Array[o]
+        end
+        private :as_ary
       end
     end
   end
--- a/lib/redmine/scm/adapters/.svn/text-base/subversion_adapter.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/.svn/text-base/subversion_adapter.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,38 +20,54 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class SubversionAdapter < AbstractAdapter
-      
+
         # SVN executable name
         SVN_BIN = Redmine::Configuration['scm_subversion_command'] || "svn"
-        
+
         class << self
+          def client_command
+            @@bin    ||= SVN_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(SVN_BIN)
+          end
+
           def client_version
             @@client_version ||= (svn_binary_version || [])
           end
-          
+
+          def client_available
+            !client_version.empty?
+          end
+
           def svn_binary_version
-            cmd = "#{SVN_BIN} --version"
-            version = nil
-            shellout(cmd) do |io|
-              # Read svn version in first returned line
-              if m = io.read.to_s.match(%r{\A(.*?)((\d+\.)+\d+)})
-                version = m[2].scan(%r{\d+}).collect(&:to_i)
-              end
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
             end
-            return nil if $? && $?.exitstatus != 0
-            version
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
         end
-        
+
         # Get info about the svn repository
         def info
-          cmd = "#{SVN_BIN} info --xml #{target}"
+          cmd = "#{self.class.sq_bin} info --xml #{target}"
           cmd << credentials_string
           info = nil
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               #root_url = doc.elements["info/entry/repository/root"].text          
@@ -70,17 +86,20 @@
         rescue CommandFailed
           return nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path ||= ''
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
           entries = Entries.new
-          cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} list --xml #{target(path)}@#{identifier}"
           cmd << credentials_string
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['lists']['list'], 'entry') do |entry|
@@ -110,17 +129,20 @@
           logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
           entries.sort_by_name
         end
-        
+
         def properties(path, identifier=nil)
           # proplist xml output supported in svn 1.5.0 and higher
           return nil unless self.class.client_version_above?([1, 5, 0])
           
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} proplist --verbose --xml #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} proplist --verbose --xml #{target(path)}@#{identifier}"
           cmd << credentials_string
           properties = {}
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['properties']['target'], 'property') do |property|
@@ -132,19 +154,22 @@
           return nil if $? && $?.exitstatus != 0
           properties
         end
-        
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path ||= ''
           identifier_from = (identifier_from && identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD"
           identifier_to = (identifier_to && identifier_to.to_i > 0) ? identifier_to.to_i : 1
           revisions = Revisions.new
-          cmd = "#{SVN_BIN} log --xml -r #{identifier_from}:#{identifier_to}"
+          cmd = "#{self.class.sq_bin} log --xml -r #{identifier_from}:#{identifier_to}"
           cmd << credentials_string
           cmd << " --verbose " if  options[:with_paths]
           cmd << " --limit #{options[:limit].to_i}" if options[:limit]
           cmd << ' ' + target(path)
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['log'], 'logentry') do |logentry|
@@ -171,13 +196,14 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil, type="inline")
           path ||= ''
           identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : ''
+
           identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1)
-          
-          cmd = "#{SVN_BIN} diff -r "
+
+          cmd = "#{self.class.sq_bin} diff -r "
           cmd << "#{identifier_to}:"
           cmd << "#{identifier_from}"
           cmd << " #{target(path)}@#{identifier_from}"
@@ -191,10 +217,10 @@
           return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} cat #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} cat #{target(path)}@#{identifier}"
           cmd << credentials_string
           cat = nil
           shellout(cmd) do |io|
@@ -204,10 +230,10 @@
           return nil if $? && $?.exitstatus != 0
           cat
         end
-        
+
         def annotate(path, identifier=nil)
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} blame #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} blame #{target(path)}@#{identifier}"
           cmd << credentials_string
           blame = Annotate.new
           shellout(cmd) do |io|
--- a/lib/redmine/scm/adapters/abstract_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/abstract_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,25 +19,29 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class CommandFailed < StandardError #:nodoc:
       end
-      
+
       class AbstractAdapter #:nodoc:
         class << self
+          def client_command
+            ""
+          end
+
           # Returns the version of the scm client
           # Eg: [1, 5, 0] or [] if unknown
           def client_version
             []
           end
-          
+
           # Returns the version string of the scm client
           # Eg: '1.5.0' or 'Unknown version' if unknown
           def client_version_string
             v = client_version || 'Unknown version'
             v.is_a?(Array) ? v.join('.') : v.to_s
           end
-          
+
           # Returns true if the current client version is above
           # or equals the given one
           # If option is :unknown is set to true, it will return
@@ -45,19 +49,32 @@
           def client_version_above?(v, options={})
             ((client_version <=> v) >= 0) || (client_version.empty? && options[:unknown])
           end
+
+          def client_available
+            true
+          end
+
+          def shell_quote(str)
+            if Redmine::Platform.mswin?
+              '"' + str.gsub(/"/, '\\"') + '"'
+            else
+              "'" + str.gsub(/'/, "'\"'\"'") + "'"
+            end
+          end
         end
-                
-        def initialize(url, root_url=nil, login=nil, password=nil)
+
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @login = login if login && !login.empty?
           @password = (password || "") if @login
           @root_url = root_url.blank? ? retrieve_root_url : root_url
         end
-        
+
         def adapter_name
           'Abstract'
         end
-        
+
         def supports_cat?
           true
         end
@@ -65,11 +82,11 @@
         def supports_annotate?
           respond_to?('annotate')
         end
-        
+
         def root_url
           @root_url
         end
-      
+
         def url
           @url
         end
@@ -138,7 +155,7 @@
           path ||= ''
           (path[-1,1] == "/") ? path : "#{path}/"
         end
-        
+
         def without_leading_slash(path)
           path ||= ''
           path.gsub(%r{^/+}, '')
@@ -148,13 +165,9 @@
           path ||= ''
           (path[-1,1] == "/") ? path[0..-2] : path
          end
-        
+
         def shell_quote(str)
-          if Redmine::Platform.mswin?
-            '"' + str.gsub(/"/, '\\"') + '"'
-          else
-            "'" + str.gsub(/'/, "'\"'\"'") + "'"
-          end
+          self.class.shell_quote(str)
         end
 
       private
@@ -168,19 +181,19 @@
           base = path.match(/^\//) ? root_url : url
           shell_quote("#{base}/#{path}".gsub(/[?<>\*]/, ''))
         end
-            
+
         def logger
           self.class.logger
         end
-        
+
         def shellout(cmd, &block)
           self.class.shellout(cmd, &block)
         end
-        
+
         def self.logger
           RAILS_DEFAULT_LOGGER
         end
-        
+
         def self.shellout(cmd, &block)
           logger.debug "Shelling out: #{strip_credential(cmd)}" if logger && logger.debug?
           if Rails.env == 'development'
@@ -188,7 +201,12 @@
             cmd = "#{cmd} 2>>#{RAILS_ROOT}/log/scm.stderr.log"
           end
           begin
-            IO.popen(cmd, "r+") do |io|
+            if RUBY_VERSION < '1.9'
+              mode = "r+"
+            else
+              mode = "r+:ASCII-8BIT"
+            end
+            IO.popen(cmd, mode) do |io|
               io.close_write
               block.call(io) if block_given?
             end
@@ -198,8 +216,8 @@
             logger.error("SCM command failed, make sure that your SCM binary (eg. svn) is in PATH (#{ENV['PATH']}): #{strip_credential(cmd)}\n  with: #{msg}")
             raise CommandFailed.new(msg)
           end
-        end  
-        
+        end
+
         # Hides username/password in a given command
         def self.strip_credential(cmd)
           q = (Redmine::Platform.mswin? ? '"' : "'")
@@ -209,8 +227,19 @@
         def strip_credential(cmd)
           self.class.strip_credential(cmd)
         end
+
+        def scm_iconv(to, from, str)
+          return nil if str.nil?
+          return str if to == from
+          begin
+            Iconv.conv(to, from, str)
+          rescue Iconv::Failure => err
+            logger.error("failed to convert from #{from} to #{to}. #{err}")
+            nil
+          end
+        end
       end
-      
+
       class Entries < Array
         def sort_by_name
           sort {|x,y| 
@@ -219,7 +248,7 @@
             else
               x.kind <=> y.kind
             end
-          }   
+          }
         end
         
         def revisions
@@ -295,29 +324,8 @@
         def format_identifier
           identifier
         end
+      end
 
-        def save(repo)
-          Changeset.transaction do
-            changeset = Changeset.new(
-              :repository => repo,
-              :revision => identifier,
-              :scmid => scmid,
-              :committer => author, 
-              :committed_on => time,
-              :comments => message)
-            
-            if changeset.save
-              paths.each do |file|
-                Change.create(
-                  :changeset => changeset,
-                  :action => file[:action],
-                  :path => file[:path])
-              end
-            end
-          end
-        end
-      end
-        
       class Annotate
         attr_reader :lines, :revisions
         
--- a/lib/redmine/scm/adapters/bazaar_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/bazaar_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,15 +19,47 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class BazaarAdapter < AbstractAdapter
-      
+
         # Bazaar executable name
         BZR_BIN = Redmine::Configuration['scm_bazaar_command'] || "bzr"
-        
+
+        class << self
+          def client_command
+            @@bin    ||= BZR_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(BZR_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            !client_version.empty?
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
+          end
+        end
+
         # Get info about the repository
         def info
-          cmd = "#{BZR_BIN} revno #{target('')}"
+          cmd = "#{self.class.sq_bin} revno #{target('')}"
           info = nil
           shellout(cmd) do |io|
             if io.read =~ %r{^(\d+)\r?$}
@@ -43,13 +75,13 @@
         rescue CommandFailed
           return nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path ||= ''
           entries = Entries.new
-          cmd = "#{BZR_BIN} ls -v --show-ids"
+          cmd = "#{self.class.sq_bin} ls -v --show-ids"
           identifier = -1 unless identifier && identifier.to_i > 0 
           cmd << " -r#{identifier.to_i}" 
           cmd << " #{target(path)}"
@@ -71,13 +103,13 @@
           logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
           entries.sort_by_name
         end
-    
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path ||= ''
           identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : 'last:1'
           identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : 1
           revisions = Revisions.new
-          cmd = "#{BZR_BIN} log -v --show-ids -r#{identifier_to}..#{identifier_from} #{target(path)}"
+          cmd = "#{self.class.sq_bin} log -v --show-ids -r#{identifier_to}..#{identifier_from} #{target(path)}"
           shellout(cmd) do |io|
             revision = nil
             parsing = nil
@@ -132,7 +164,7 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil)
           path ||= ''
           if identifier_to
@@ -143,7 +175,7 @@
           if identifier_from
             identifier_from = identifier_from.to_i
           end
-          cmd = "#{BZR_BIN} diff -r#{identifier_to}..#{identifier_from} #{target(path)}"
+          cmd = "#{self.class.sq_bin} diff -r#{identifier_to}..#{identifier_from} #{target(path)}"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -153,9 +185,9 @@
           #return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
-          cmd = "#{BZR_BIN} cat"
+          cmd = "#{self.class.sq_bin} cat"
           cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
           cmd << " #{target(path)}"
           cat = nil
@@ -166,9 +198,9 @@
           return nil if $? && $?.exitstatus != 0
           cat
         end
-        
+
         def annotate(path, identifier=nil)
-          cmd = "#{BZR_BIN} annotate --all"
+          cmd = "#{self.class.sq_bin} annotate --all"
           cmd << " -r#{identifier.to_i}" if identifier && identifier.to_i > 0
           cmd << " #{target(path)}"
           blame = Annotate.new
--- a/lib/redmine/scm/adapters/cvs_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/cvs_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -24,13 +24,46 @@
 
         # CVS executable name
         CVS_BIN = Redmine::Configuration['scm_cvs_command'] || "cvs"
-    
+
+        class << self
+          def client_command
+            @@bin    ||= CVS_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(CVS_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            client_version_above?([1, 12])
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)}m)
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
+          end
+        end
+
         # Guidelines for the input:
         #  url -> the project-path, relative to the cvsroot (eg. module name)
         #  root_url -> the good old, sometimes damned, CVSROOT
         #  login -> unnecessary
         #  password -> unnecessary too
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @login = login if login && !login.empty?
           @password = (password || "") if @login
@@ -38,24 +71,24 @@
           raise CommandFailed if root_url.blank?
           @root_url = root_url
         end
-        
+
         def root_url
           @root_url
         end
-        
+
         def url
           @url
         end
-        
+
         def info
           logger.debug "<cvs> info"
           Info.new({:root_url => @root_url, :lastrev => nil})
         end
-        
+
         def get_previous_revision(revision)
           CvsRevisionHelper.new(revision).prevRev
         end
-    
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         # this method is used by the repository-browser (aka LIST)
@@ -63,14 +96,14 @@
           logger.debug "<cvs> entries '#{path}' with identifier '#{identifier}'"
           path_with_project="#{url}#{with_leading_slash(path)}"
           entries = Entries.new
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rls -e"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rls -e"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " #{shell_quote path_with_project}"
           shellout(cmd) do |io|
             io.each_line(){|line|
               fields=line.chop.split('/',-1)
               logger.debug(">>InspectLine #{fields.inspect}")
-              
+
               if fields[0]!="D"
                 entries << Entry.new({:name => fields[-5],
                   #:path => fields[-4].include?(path)?fields[-4]:(path + "/"+ fields[-4]),
@@ -96,19 +129,19 @@
           end
           return nil if $? && $?.exitstatus != 0
           entries.sort_by_name
-        end  
+        end
 
         STARTLOG="----------------------------"
         ENDLOG  ="============================================================================="
-        
+
         # Returns all revisions found between identifier_from and identifier_to
         # in the repository. both identifier have to be dates or nil.
         # these method returns nothing but yield every result in block
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={}, &block)
           logger.debug "<cvs> revisions path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
-          
+
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rlog"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rlog"
           cmd << " -d\">#{time_to_cvstime_rlog(identifier_from)}\"" if identifier_from
           cmd << " #{shell_quote path_with_project}"
           shellout(cmd) do |io|
@@ -123,7 +156,7 @@
             file_state=nil
             branch_map=nil
             
-            io.each_line() do |line|            
+            io.each_line() do |line|
               
               if state!="revision" && /^#{ENDLOG}/ =~ line
                 commit_log=String.new
@@ -162,9 +195,9 @@
                 end
                 next
               elsif state=="revision"
-                if /^#{ENDLOG}/ =~ line || /^#{STARTLOG}/ =~ line               
+                if /^#{ENDLOG}/ =~ line || /^#{STARTLOG}/ =~ line
                   if revision
-                    
+
                     revHelper=CvsRevisionHelper.new(revision)
                     revBranch="HEAD"
                     
@@ -176,7 +209,7 @@
                     
                     logger.debug("********** YIELD Revision #{revision}::#{revBranch}")
                     
-                    yield Revision.new({                    
+                    yield Revision.new({
                       :time => date,
                       :author => author,
                       :message=>commit_log.chomp,
@@ -188,9 +221,9 @@
                         :kind=>'file',
                         :action=>file_state
                       }]
-                    })                 
+                    })
                   end
-    
+
                   commit_log=String.new
                   revision=nil
                   
@@ -199,7 +232,7 @@
                   end
                   next
                 end
-                  
+
                 if /^branches: (.+)$/ =~ line
                   #TODO: version.branch = $1
                 elsif /^revision (\d+(?:\.\d+)+).*$/ =~ line
@@ -216,20 +249,20 @@
                   #                  version.line_minus = linechanges[2]
                   #                else
                   #                  version.line_plus  = 0
-                  #                  version.line_minus = 0     
-                  #                end              
-                else            
+                  #                  version.line_minus = 0
+                  #                end
+                else
                   commit_log << line unless line =~ /^\*\*\* empty log message \*\*\*/
-                end 
-              end 
+                end
+              end
             end
           end
-        end  
-        
+        end
+
         def diff(path, identifier_from, identifier_to=nil)
           logger.debug "<cvs> diff path:'#{path}',identifier_from #{identifier_from}, identifier_to #{identifier_to}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rdiff -u -r#{identifier_to} -r#{identifier_from} #{shell_quote path_with_project}"
           diff = []
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -238,28 +271,29 @@
           end
           return nil if $? && $?.exitstatus != 0
           diff
-        end  
-        
+        end
+
         def cat(path, identifier=nil)
           identifier = (identifier) ? identifier : "HEAD"
           logger.debug "<cvs> cat path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} co"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} co"
           cmd << " -D \"#{time_to_cvstime(identifier)}\"" if identifier
           cmd << " -p #{shell_quote path_with_project}"
           cat = nil
           shellout(cmd) do |io|
+            io.binmode
             cat = io.read
           end
           return nil if $? && $?.exitstatus != 0
           cat
-        end  
+        end
 
         def annotate(path, identifier=nil)
           identifier = (identifier) ? identifier.to_i : "HEAD"
           logger.debug "<cvs> annotate path:'#{path}',identifier #{identifier}"
           path_with_project="#{url}#{with_leading_slash(path)}"
-          cmd = "#{CVS_BIN} -d #{shell_quote root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
+          cmd = "#{self.class.sq_bin} -d #{shell_quote root_url} rannotate -r#{identifier} #{shell_quote path_with_project}"
           blame = Annotate.new
           shellout(cmd) do |io|
             io.each_line do |line|
@@ -270,9 +304,9 @@
           return nil if $? && $?.exitstatus != 0
           blame
         end
-         
+
         private
-        
+
         # Returns the root url without the connexion string
         # :pserver:anonymous@foo.bar:/path => /path
         # :ext:cvsservername:/path => /path
@@ -345,7 +379,11 @@
         private
         def buildRevision(rev)
           if rev== 0
-            @base
+            if @branchid.nil?
+              @base+".0"
+            else
+              @base
+            end
           elsif @branchid.nil? 
             @base+"."+rev.to_s
           else
--- a/lib/redmine/scm/adapters/darcs_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/darcs_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -20,29 +20,45 @@
 
 module Redmine
   module Scm
-    module Adapters    
-      class DarcsAdapter < AbstractAdapter      
+    module Adapters
+      class DarcsAdapter < AbstractAdapter
         # Darcs executable name
         DARCS_BIN = Redmine::Configuration['scm_darcs_command'] || "darcs"
-        
+
         class << self
+          def client_command
+            @@bin    ||= DARCS_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(DARCS_BIN)
+          end
+
           def client_version
             @@client_version ||= (darcs_binary_version || [])
           end
-  	  
+
+          def client_available
+            !client_version.empty?
+          end
+
           def darcs_binary_version
-            darcsversion = darcs_binary_version_from_command_line
+            darcsversion = darcs_binary_version_from_command_line.dup
+            if darcsversion.respond_to?(:force_encoding)
+              darcsversion.force_encoding('ASCII-8BIT')
+            end
             if m = darcsversion.match(%r{\A(.*?)((\d+\.)+\d+)})
               m[2].scan(%r{\d+}).collect(&:to_i)
             end
           end
 
           def darcs_binary_version_from_command_line
-            shellout("#{DARCS_BIN} --version") { |io| io.read }.to_s
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
         end
 
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = url
           @root_url = url
         end
@@ -57,7 +73,7 @@
           rev = revisions(nil,nil,nil,{:limit => 1})
           rev ? Info.new({:root_url => @url, :lastrev => rev.last}) : nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
@@ -65,8 +81,8 @@
           if path.blank?
             path = ( self.class.client_version_above?([2, 2, 0]) ? @url : '.' )
           end
-          entries = Entries.new          
-          cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --xml-output"
+          entries = Entries.new
+          cmd = "#{self.class.sq_bin} annotate --repodir #{shell_quote @url} --xml-output"
           cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
           cmd << " #{shell_quote path}"
           shellout(cmd) do |io|
@@ -86,11 +102,11 @@
           return nil if $? && $?.exitstatus != 0
           entries.compact.sort_by_name
         end
-    
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path = '.' if path.blank?
           revisions = Revisions.new
-          cmd = "#{DARCS_BIN} changes --repodir #{shell_quote @url} --xml-output"
+          cmd = "#{self.class.sq_bin} changes --repodir #{shell_quote @url} --xml-output"
           cmd << " --from-match #{shell_quote("hash #{identifier_from}")}" if identifier_from
           cmd << " --last #{options[:limit].to_i}" if options[:limit]
           shellout(cmd) do |io|
@@ -113,10 +129,10 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil)
           path = '*' if path.blank?
-          cmd = "#{DARCS_BIN} diff --repodir #{shell_quote @url}"
+          cmd = "#{self.class.sq_bin} diff --repodir #{shell_quote @url}"
           if identifier_to.nil?
             cmd << " --match #{shell_quote("hash #{identifier_from}")}"
           else
@@ -133,9 +149,9 @@
           return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
-          cmd = "#{DARCS_BIN} show content --repodir #{shell_quote @url}"
+          cmd = "#{self.class.sq_bin} show content --repodir #{shell_quote @url}"
           cmd << " --match #{shell_quote("hash #{identifier}")}" if identifier
           cmd << " #{shell_quote path}"
           cat = nil
@@ -148,7 +164,7 @@
         end
 
         private
-        
+
         # Returns an Entry from the given XML element
         # or nil if the entry was deleted
         def entry_from_xml(element, path_prefix)
@@ -156,7 +172,7 @@
           if modified_element.elements['modified_how'].text.match(/removed/)
             return nil
           end
-          
+
           Entry.new({:name => element.attributes['name'],
                      :path => path_prefix + element.attributes['name'],
                      :kind => element.name == 'file' ? 'file' : 'dir',
@@ -165,7 +181,7 @@
                        :identifier => nil,
                        :scmid => modified_element.elements['patch'].attributes['hash']
                        })
-                     })        
+                     })
         end
 
         def get_paths_for_patch(hash)
@@ -196,10 +212,10 @@
           end
           paths
         end
-        
+
         # Retrieve changed paths for a single patch
         def get_paths_for_patch_raw(hash)
-          cmd = "#{DARCS_BIN} annotate --repodir #{shell_quote @url} --summary --xml-output"
+          cmd = "#{self.class.sq_bin} annotate --repodir #{shell_quote @url} --summary --xml-output"
           cmd << " --match #{shell_quote("hash #{hash}")} "
           paths = []
           shellout(cmd) do |io|
--- a/lib/redmine/scm/adapters/filesystem_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/filesystem_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -23,12 +23,19 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class FilesystemAdapter < AbstractAdapter
-        
 
-        def initialize(url, root_url=nil, login=nil, password=nil)
+        class << self
+          def client_available
+            true
+          end
+        end
+
+        def initialize(url, root_url=nil, login=nil, password=nil,
+                       path_encoding=nil)
           @url = with_trailling_slash(url)
+          @path_encoding = path_encoding || 'UTF-8'
         end
 
         def format_path_ends(path, leading=true, trailling=true)
@@ -46,47 +53,59 @@
         rescue CommandFailed
           return nil
         end
-        
+
         def entries(path="", identifier=nil)
           entries = Entries.new
-          Dir.new(target(path)).each do |e|
-            relative_path = format_path_ends((format_path_ends(path,
-                                                               false,
-                                                               true) + e),
-                                             false,false)
-            target = target(relative_path)
-            entries << 
-              Entry.new({ :name => File.basename(e),
+          trgt_utf8 = target(path)
+          trgt = scm_iconv(@path_encoding, 'UTF-8', trgt_utf8)
+          Dir.new(trgt).each do |e1|
+            e_utf8 = scm_iconv('UTF-8', @path_encoding, e1)
+            relative_path_utf8 = format_path_ends((format_path_ends(path,false,true) + e_utf8),false,false)
+            t1_utf8 = target(relative_path_utf8)
+            t1 = scm_iconv(@path_encoding, 'UTF-8', t1_utf8)
+            relative_path = scm_iconv(@path_encoding, 'UTF-8', relative_path_utf8)
+            e1 = scm_iconv(@path_encoding, 'UTF-8', e_utf8)
+            if File.exist?(t1) and # paranoid test
+                  %w{file directory}.include?(File.ftype(t1)) and # avoid special types
+                  not File.basename(e1).match(/^\.+$/) # avoid . and ..
+              p1         = File.readable?(t1) ? relative_path : ""
+              utf_8_path = scm_iconv('UTF-8', @path_encoding, p1)
+              entries <<
+                Entry.new({ :name => scm_iconv('UTF-8', @path_encoding, File.basename(e1)),
                           # below : list unreadable files, but dont link them.
-                          :path => File.readable?(target) ? relative_path : "",
-                          :kind => (File.directory?(target) ? 'dir' : 'file'),
-                          :size => (File.directory?(target) ? nil : [File.size(target)].pack('l').unpack('L').first),
+                          :path => utf_8_path,
+                          :kind => (File.directory?(t1) ? 'dir' : 'file'),
+                          :size => (File.directory?(t1) ? nil : [File.size(t1)].pack('l').unpack('L').first),
                           :lastrev => 
-                          Revision.new({:time => (File.mtime(target)).localtime,
-                                       })
-                        }) if File.exist?(target) and # paranoid test
-              %w{file directory}.include?(File.ftype(target)) and # avoid special types
-              not File.basename(e).match(/^\.+$/) # avoid . and ..             
+                              Revision.new({:time => (File.mtime(t1)) })
+                        })
+            end
           end
           entries.sort_by_name
+        rescue  => err
+          logger.error "scm: filesystem: error: #{err.message}"
+          raise CommandFailed.new(err.message)
         end
-        
+
         def cat(path, identifier=nil)
-          File.new(target(path), "rb").read
+          p = scm_iconv(@path_encoding, 'UTF-8', target(path))
+          File.new(p, "rb").read
+        rescue  => err
+          logger.error "scm: filesystem: error: #{err.message}"
+          raise CommandFailed.new(err.message)
         end
 
         private
-        
+
         # AbstractAdapter::target is implicitly made to quote paths.
         # Here we do not shell-out, so we do not want quotes.
         def target(path=nil)
-          #Prevent the use of ..
+          # Prevent the use of ..
           if path and !path.match(/(^|\/)\.\.(\/|$)/)
             return "#{self.url}#{without_leading_slash(path)}"
           end
           return self.url
         end
-        
       end
     end
   end
--- a/lib/redmine/scm/adapters/git_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/git_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,11 +19,54 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class GitAdapter < AbstractAdapter
+
+        SCM_GIT_REPORT_LAST_COMMIT = true
+
         # Git executable name
         GIT_BIN = Redmine::Configuration['scm_git_command'] || "git"
 
+        # raised if scm command exited with error, e.g. unknown revision.
+        class ScmCommandAborted < CommandFailed; end
+
+        class << self
+          def client_command
+            @@bin    ||= GIT_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(GIT_BIN)
+          end
+
+          def client_version
+            @@client_version ||= (scm_command_version || [])
+          end
+
+          def client_available
+            !client_version.empty?
+          end
+
+          def scm_command_version
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
+            end
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version --no-color") { |io| io.read }.to_s
+          end
+        end
+
+        def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
+          super
+          @flag_report_last_commit = SCM_GIT_REPORT_LAST_COMMIT
+        end
+
         def info
           begin
             Info.new(:root_url => url, :lastrev => lastrev('',nil))
@@ -35,7 +78,7 @@
         def branches
           return @branches if @branches
           @branches = []
-          cmd = "#{GIT_BIN} --git-dir #{target('')} branch --no-color"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} branch --no-color"
           shellout(cmd) do |io|
             io.each_line do |line|
               @branches << line.match('\s*\*?\s*(.*)$')[1]
@@ -46,20 +89,20 @@
 
         def tags
           return @tags if @tags
-          cmd = "#{GIT_BIN} --git-dir #{target('')} tag"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} tag"
           shellout(cmd) do |io|
             @tags = io.readlines.sort!.map{|t| t.strip}
           end
         end
 
         def default_branch
-          branches.include?('master') ? 'master' : branches.first 
+          branches.include?('master') ? 'master' : branches.first
         end
-        
+
         def entries(path=nil, identifier=nil)
           path ||= ''
           entries = Entries.new
-          cmd = "#{GIT_BIN} --git-dir #{target('')} ls-tree -l "
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} ls-tree -l "
           cmd << shell_quote("HEAD:" + path) if identifier.nil?
           cmd << shell_quote(identifier + ":" + path) if identifier
           shellout(cmd)  do |io|
@@ -75,7 +118,7 @@
                  :path => full_path,
                  :kind => (type == "tree") ? 'dir' : 'file',
                  :size => (type == "tree") ? nil : size,
-                 :lastrev => lastrev(full_path,identifier)
+                 :lastrev => @flag_report_last_commit ? lastrev(full_path,identifier) : Revision.new
                 }) unless entries.detect{|entry| entry.name == name}
               end
             end
@@ -84,18 +127,17 @@
           entries.sort_by_name
         end
 
-        def lastrev(path,rev)
+        def lastrev(path, rev)
           return nil if path.nil?
-          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 path} " unless path.empty?
+          cmd_args = %w|log --no-color --encoding=UTF-8 --date=iso --pretty=fuller --no-merges -n 1|
+          cmd_args << rev if rev 
+          cmd_args << "--" << path unless path.empty?
           lines = []
-          shellout(cmd) { |io| lines = io.readlines }
-          return nil if $? && $?.exitstatus != 0
+          scm_cmd(*cmd_args) { |io| lines = io.readlines }
           begin
               id = lines[0].split[1]
               author = lines[1].match('Author:\s+(.*)$')[1]
-              time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1]).localtime
+              time = Time.parse(lines[4].match('CommitDate:\s+(.*)$')[1])
 
               Revision.new({
                 :identifier => id,
@@ -104,26 +146,29 @@
                 :time => time,
                 :message => nil, 
                 :paths => nil 
-              })
+                })
           rescue NoMethodError => e
               logger.error("The revision '#{path}' has a wrong format")
               return nil
           end
+        rescue ScmCommandAborted
+          nil
         end
 
         def revisions(path, identifier_from, identifier_to, options={})
           revisions = Revisions.new
+          cmd_args = %w|log --no-color --encoding=UTF-8 --raw --date=iso --pretty=fuller|
+          cmd_args << "--reverse" if options[:reverse]
+          cmd_args << "--all" if options[:all]
+          cmd_args << "-n" << "#{options[:limit].to_i}" if options[:limit]
+          from_to = ""
+          from_to << "#{identifier_from}.." if identifier_from
+          from_to << "#{identifier_to}" if identifier_to
+          cmd_args << from_to if !from_to.empty?
+          cmd_args << "--since=#{options[:since].strftime("%Y-%m-%d %H:%M:%S")}" if options[:since]
+          cmd_args << "--" << path if path && !path.empty?
 
-          cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --raw --date=iso --pretty=fuller "
-          cmd << " --reverse " if options[:reverse]
-          cmd << " --all " if options[:all]
-          cmd << " -n #{options[:limit].to_i} " if options[:limit]
-          cmd << "#{shell_quote(identifier_from + '..')}" if identifier_from
-          cmd << "#{shell_quote identifier_to}" if identifier_to
-          cmd << " --since=#{shell_quote(options[:since].strftime("%Y-%m-%d %H:%M:%S"))}" if options[:since]
-          cmd << " -- #{shell_quote path}" if path && !path.empty?
-
-          shellout(cmd) do |io|
+          scm_cmd *cmd_args do |io|
             files=[]
             changeset = {}
             parsing_descr = 0  #0: not parsing desc or files, 1: parsing desc, 2: parsing files
@@ -200,8 +245,8 @@
               end
             end
           end
-
-          return nil if $? && $?.exitstatus != 0
+          revisions
+        rescue ScmCommandAborted
           revisions
         end
 
@@ -209,9 +254,9 @@
           path ||= ''
 
           if identifier_to
-            cmd = "#{GIT_BIN} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" 
+            cmd = "#{self.class.sq_bin} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" 
           else
-            cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}"
+            cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}"
           end
 
           cmd << " -- #{shell_quote path}" unless path.empty?
@@ -227,7 +272,7 @@
         
         def annotate(path, identifier=nil)
           identifier = 'HEAD' if identifier.blank?
-          cmd = "#{GIT_BIN} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}"
           blame = Annotate.new
           content = nil
           shellout(cmd) { |io| io.binmode; content = io.read }
@@ -250,12 +295,12 @@
           end
           blame
         end
-        
+
         def cat(path, identifier=nil)
           if identifier.nil?
             identifier = 'HEAD'
           end
-          cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}"
+          cmd = "#{self.class.sq_bin} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}"
           cat = nil
           shellout(cmd) do |io|
             io.binmode
@@ -271,6 +316,18 @@
             identifier[0,8]
           end
         end
+
+        def scm_cmd(*args, &block)
+          repo_path = root_url || url
+          full_args = [GIT_BIN, '--git-dir', repo_path]
+          full_args += args
+          ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block)
+          if $? && $?.exitstatus != 0
+            raise ScmCommandAborted, "git exited with non-zero status: #{$?.exitstatus}"
+          end
+          ret
+        end
+        private :scm_cmd
       end
     end
   end
--- a/lib/redmine/scm/adapters/mercurial/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/mercurial/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4633/trunk/lib/redmine/scm/adapters/mercurial
+/svn/!svn/ver/4989/trunk/lib/redmine/scm/adapters/mercurial
 END
 hg-template-0.9.5.tmpl
 K 25
@@ -9,6 +9,12 @@
 V 82
 /svn/!svn/ver/4633/trunk/lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl
 END
+redminehelper.py
+K 25
+svn:wc:ra_dav:version-url
+V 76
+/svn/!svn/ver/4989/trunk/lib/redmine/scm/adapters/mercurial/redminehelper.py
+END
 hg-template-1.0.tmpl
 K 25
 svn:wc:ra_dav:version-url
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/scm/adapters/mercurial/.svn/dir-prop-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,7 @@
+K 10
+svn:ignore
+V 36
+redminehelper.pyc
+redminehelper.pyo
+
+END
--- a/lib/redmine/scm/adapters/mercurial/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/mercurial/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,16 +1,16 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/scm/adapters/mercurial
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-05T15:02:24.961855Z
-4633
+2011-03-02T10:17:36.526269Z
+4989
 tmaruyama
-
+has-props
 
 
 
@@ -60,6 +60,40 @@
 
 824
 
+redminehelper.py
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+5bf6790a201bf33c17cae96c6a9d75fc
+2011-03-02T10:17:36.526269Z
+4989
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6270
+
 hg-template-1.0.tmpl
 file
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/scm/adapters/mercurial/.svn/text-base/redminehelper.py.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,183 @@
+# redminehelper: Redmine helper extension for Mercurial
+#
+# Copyright 2010 Alessio Franceschelli (alefranz.net)
+# Copyright 2010-2011 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+"""helper commands for Redmine to reduce the number of hg calls
+
+To test this extension, please try::
+
+    $ hg --config extensions.redminehelper=redminehelper.py rhsummary
+
+I/O encoding:
+
+:file path: urlencoded, raw string
+:tag name: utf-8
+:branch name: utf-8
+:node: 12-digits (short) hex string
+
+Output example of rhsummary::
+
+    <?xml version="1.0"?>
+    <rhsummary>
+      <repository root="/foo/bar">
+        <tip revision="1234" node="abcdef0123..."/>
+        <tag revision="123" node="34567abc..." name="1.1.1"/>
+        <branch .../>
+        ...
+      </repository>
+    </rhsummary>
+
+Output example of rhmanifest::
+
+    <?xml version="1.0"?>
+    <rhmanifest>
+      <repository root="/foo/bar">
+        <manifest revision="1234" path="lib">
+          <file name="diff.rb" revision="123" node="34567abc..." time="12345"
+                 size="100"/>
+          ...
+          <dir name="redmine"/>
+          ...
+        </manifest>
+      </repository>
+    </rhmanifest>
+"""
+import re, time, cgi, urllib
+from mercurial import cmdutil, commands, node, error
+
+_x = cgi.escape
+_u = lambda s: cgi.escape(urllib.quote(s))
+
+def _tip(ui, repo):
+    # see mercurial/commands.py:tip
+    def tiprev():
+        try:
+            return len(repo) - 1
+        except TypeError:  # Mercurial < 1.1
+            return repo.changelog.count() - 1
+    tipctx = repo.changectx(tiprev())
+    ui.write('<tip revision="%d" node="%s"/>\n'
+             % (tipctx.rev(), _x(node.short(tipctx.node()))))
+
+_SPECIAL_TAGS = ('tip',)
+
+def _tags(ui, repo):
+    # see mercurial/commands.py:tags
+    for t, n in reversed(repo.tagslist()):
+        if t in _SPECIAL_TAGS:
+            continue
+        try:
+            r = repo.changelog.rev(n)
+        except error.LookupError:
+            continue
+        ui.write('<tag revision="%d" node="%s" name="%s"/>\n'
+                 % (r, _x(node.short(n)), _x(t)))
+
+def _branches(ui, repo):
+    # see mercurial/commands.py:branches
+    def iterbranches():
+        for t, n in repo.branchtags().iteritems():
+            yield t, n, repo.changelog.rev(n)
+    def branchheads(branch):
+        try:
+            return repo.branchheads(branch, closed=False)
+        except TypeError:  # Mercurial < 1.2
+            return repo.branchheads(branch)
+    for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
+        if repo.lookup(r) in branchheads(t):
+            ui.write('<branch revision="%d" node="%s" name="%s"/>\n'
+                     % (r, _x(node.short(n)), _x(t)))
+
+def _manifest(ui, repo, path, rev):
+    ctx = repo.changectx(rev)
+    ui.write('<manifest revision="%d" path="%s">\n'
+             % (ctx.rev(), _u(path)))
+
+    known = set()
+    pathprefix = (path.rstrip('/') + '/').lstrip('/')
+    for f, n in sorted(ctx.manifest().iteritems(), key=lambda e: e[0]):
+        if not f.startswith(pathprefix):
+            continue
+        name = re.sub(r'/.*', '/', f[len(pathprefix):])
+        if name in known:
+            continue
+        known.add(name)
+
+        if name.endswith('/'):
+            ui.write('<dir name="%s"/>\n'
+                     % _x(urllib.quote(name[:-1])))
+        else:
+            fctx = repo.filectx(f, fileid=n)
+            tm, tzoffset = fctx.date()
+            ui.write('<file name="%s" revision="%d" node="%s" '
+                     'time="%d" size="%d"/>\n'
+                     % (_u(name), fctx.rev(), _x(node.short(fctx.node())),
+                        tm, fctx.size(), ))
+
+    ui.write('</manifest>\n')
+
+def rhannotate(ui, repo, *pats, **opts):
+    return commands.annotate(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+
+def rhcat(ui, repo, file1, *pats, **opts):
+    return commands.cat(ui, repo, urllib.unquote_plus(file1), *map(urllib.unquote_plus, pats), **opts)
+
+def rhdiff(ui, repo, *pats, **opts):
+    """diff repository (or selected files)"""
+    change = opts.pop('change', None)
+    if change:  # add -c option for Mercurial<1.1
+        base = repo.changectx(change).parents()[0].rev()
+        opts['rev'] = [str(base), change]
+    opts['nodates'] = True
+    return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+
+def rhmanifest(ui, repo, path='', **opts):
+    """output the sub-manifest of the specified directory"""
+    ui.write('<?xml version="1.0"?>\n')
+    ui.write('<rhmanifest>\n')
+    ui.write('<repository root="%s">\n' % _u(repo.root))
+    try:
+        _manifest(ui, repo, urllib.unquote_plus(path), urllib.unquote_plus(opts.get('rev')))
+    finally:
+        ui.write('</repository>\n')
+        ui.write('</rhmanifest>\n')
+
+def rhsummary(ui, repo, **opts):
+    """output the summary of the repository"""
+    ui.write('<?xml version="1.0"?>\n')
+    ui.write('<rhsummary>\n')
+    ui.write('<repository root="%s">\n' % _u(repo.root))
+    try:
+        _tip(ui, repo)
+        _tags(ui, repo)
+        _branches(ui, repo)
+        # TODO: bookmarks in core (Mercurial>=1.8)
+    finally:
+        ui.write('</repository>\n')
+        ui.write('</rhsummary>\n')
+
+# This extension should be compatible with Mercurial 0.9.5.
+# Note that Mercurial 0.9.5 doesn't have extensions.wrapfunction().
+cmdtable = {
+    'rhannotate': (rhannotate,
+         [('r', 'rev', '', 'revision'),
+          ('u', 'user', None, 'list the author (long with -v)'),
+          ('n', 'number', None, 'list the revision number (default)'),
+          ('c', 'changeset', None, 'list the changeset'),
+         ],
+         'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...'),
+    'rhcat': (rhcat,
+               [('r', 'rev', '', 'revision')],
+               'hg rhcat ([-r REV] ...) FILE...'),
+    'rhdiff': (rhdiff,
+               [('r', 'rev', [], 'revision'),
+                ('c', 'change', '', 'change made by revision')],
+               'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...'),
+    'rhmanifest': (rhmanifest,
+                   [('r', 'rev', '', 'show the specified revision')],
+                   'hg rhmanifest [-r REV] [PATH]'),
+    'rhsummary': (rhsummary, [], 'hg rhsummary'),
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/scm/adapters/mercurial/redminehelper.py	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,183 @@
+# redminehelper: Redmine helper extension for Mercurial
+#
+# Copyright 2010 Alessio Franceschelli (alefranz.net)
+# Copyright 2010-2011 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+"""helper commands for Redmine to reduce the number of hg calls
+
+To test this extension, please try::
+
+    $ hg --config extensions.redminehelper=redminehelper.py rhsummary
+
+I/O encoding:
+
+:file path: urlencoded, raw string
+:tag name: utf-8
+:branch name: utf-8
+:node: 12-digits (short) hex string
+
+Output example of rhsummary::
+
+    <?xml version="1.0"?>
+    <rhsummary>
+      <repository root="/foo/bar">
+        <tip revision="1234" node="abcdef0123..."/>
+        <tag revision="123" node="34567abc..." name="1.1.1"/>
+        <branch .../>
+        ...
+      </repository>
+    </rhsummary>
+
+Output example of rhmanifest::
+
+    <?xml version="1.0"?>
+    <rhmanifest>
+      <repository root="/foo/bar">
+        <manifest revision="1234" path="lib">
+          <file name="diff.rb" revision="123" node="34567abc..." time="12345"
+                 size="100"/>
+          ...
+          <dir name="redmine"/>
+          ...
+        </manifest>
+      </repository>
+    </rhmanifest>
+"""
+import re, time, cgi, urllib
+from mercurial import cmdutil, commands, node, error
+
+_x = cgi.escape
+_u = lambda s: cgi.escape(urllib.quote(s))
+
+def _tip(ui, repo):
+    # see mercurial/commands.py:tip
+    def tiprev():
+        try:
+            return len(repo) - 1
+        except TypeError:  # Mercurial < 1.1
+            return repo.changelog.count() - 1
+    tipctx = repo.changectx(tiprev())
+    ui.write('<tip revision="%d" node="%s"/>\n'
+             % (tipctx.rev(), _x(node.short(tipctx.node()))))
+
+_SPECIAL_TAGS = ('tip',)
+
+def _tags(ui, repo):
+    # see mercurial/commands.py:tags
+    for t, n in reversed(repo.tagslist()):
+        if t in _SPECIAL_TAGS:
+            continue
+        try:
+            r = repo.changelog.rev(n)
+        except error.LookupError:
+            continue
+        ui.write('<tag revision="%d" node="%s" name="%s"/>\n'
+                 % (r, _x(node.short(n)), _x(t)))
+
+def _branches(ui, repo):
+    # see mercurial/commands.py:branches
+    def iterbranches():
+        for t, n in repo.branchtags().iteritems():
+            yield t, n, repo.changelog.rev(n)
+    def branchheads(branch):
+        try:
+            return repo.branchheads(branch, closed=False)
+        except TypeError:  # Mercurial < 1.2
+            return repo.branchheads(branch)
+    for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
+        if repo.lookup(r) in branchheads(t):
+            ui.write('<branch revision="%d" node="%s" name="%s"/>\n'
+                     % (r, _x(node.short(n)), _x(t)))
+
+def _manifest(ui, repo, path, rev):
+    ctx = repo.changectx(rev)
+    ui.write('<manifest revision="%d" path="%s">\n'
+             % (ctx.rev(), _u(path)))
+
+    known = set()
+    pathprefix = (path.rstrip('/') + '/').lstrip('/')
+    for f, n in sorted(ctx.manifest().iteritems(), key=lambda e: e[0]):
+        if not f.startswith(pathprefix):
+            continue
+        name = re.sub(r'/.*', '/', f[len(pathprefix):])
+        if name in known:
+            continue
+        known.add(name)
+
+        if name.endswith('/'):
+            ui.write('<dir name="%s"/>\n'
+                     % _x(urllib.quote(name[:-1])))
+        else:
+            fctx = repo.filectx(f, fileid=n)
+            tm, tzoffset = fctx.date()
+            ui.write('<file name="%s" revision="%d" node="%s" '
+                     'time="%d" size="%d"/>\n'
+                     % (_u(name), fctx.rev(), _x(node.short(fctx.node())),
+                        tm, fctx.size(), ))
+
+    ui.write('</manifest>\n')
+
+def rhannotate(ui, repo, *pats, **opts):
+    return commands.annotate(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+
+def rhcat(ui, repo, file1, *pats, **opts):
+    return commands.cat(ui, repo, urllib.unquote_plus(file1), *map(urllib.unquote_plus, pats), **opts)
+
+def rhdiff(ui, repo, *pats, **opts):
+    """diff repository (or selected files)"""
+    change = opts.pop('change', None)
+    if change:  # add -c option for Mercurial<1.1
+        base = repo.changectx(change).parents()[0].rev()
+        opts['rev'] = [str(base), change]
+    opts['nodates'] = True
+    return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+
+def rhmanifest(ui, repo, path='', **opts):
+    """output the sub-manifest of the specified directory"""
+    ui.write('<?xml version="1.0"?>\n')
+    ui.write('<rhmanifest>\n')
+    ui.write('<repository root="%s">\n' % _u(repo.root))
+    try:
+        _manifest(ui, repo, urllib.unquote_plus(path), urllib.unquote_plus(opts.get('rev')))
+    finally:
+        ui.write('</repository>\n')
+        ui.write('</rhmanifest>\n')
+
+def rhsummary(ui, repo, **opts):
+    """output the summary of the repository"""
+    ui.write('<?xml version="1.0"?>\n')
+    ui.write('<rhsummary>\n')
+    ui.write('<repository root="%s">\n' % _u(repo.root))
+    try:
+        _tip(ui, repo)
+        _tags(ui, repo)
+        _branches(ui, repo)
+        # TODO: bookmarks in core (Mercurial>=1.8)
+    finally:
+        ui.write('</repository>\n')
+        ui.write('</rhsummary>\n')
+
+# This extension should be compatible with Mercurial 0.9.5.
+# Note that Mercurial 0.9.5 doesn't have extensions.wrapfunction().
+cmdtable = {
+    'rhannotate': (rhannotate,
+         [('r', 'rev', '', 'revision'),
+          ('u', 'user', None, 'list the author (long with -v)'),
+          ('n', 'number', None, 'list the revision number (default)'),
+          ('c', 'changeset', None, 'list the changeset'),
+         ],
+         'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...'),
+    'rhcat': (rhcat,
+               [('r', 'rev', '', 'revision')],
+               'hg rhcat ([-r REV] ...) FILE...'),
+    'rhdiff': (rhdiff,
+               [('r', 'rev', [], 'revision'),
+                ('c', 'change', '', 'change made by revision')],
+               'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...'),
+    'rhmanifest': (rhmanifest,
+                   [('r', 'rev', '', 'show the specified revision')],
+                   'hg rhmanifest [-r REV] [PATH]'),
+    'rhsummary': (rhsummary, [], 'hg rhsummary'),
+}
--- a/lib/redmine/scm/adapters/mercurial_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/mercurial_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -20,32 +20,51 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class MercurialAdapter < AbstractAdapter
 
         # Mercurial executable name
         HG_BIN = Redmine::Configuration['scm_mercurial_command'] || "hg"
-        TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial"
+        HELPERS_DIR = File.dirname(__FILE__) + "/mercurial"
+        HG_HELPER_EXT = "#{HELPERS_DIR}/redminehelper.py"
         TEMPLATE_NAME = "hg-template"
         TEMPLATE_EXTENSION = "tmpl"
 
+        # raised if hg command exited with error, e.g. unknown revision.
+        class HgCommandAborted < CommandFailed; end
+
         class << self
+          def client_command
+            @@bin    ||= HG_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(HG_BIN)
+          end
+
           def client_version
             @@client_version ||= (hgversion || [])
           end
 
-          def hgversion  
+          def client_available
+            !client_version.empty?
+          end
+
+          def hgversion
             # The hg version is expressed either as a
             # release number (eg 0.9.5 or 1.0) or as a revision
             # id composed of 12 hexa characters.
-            theversion = hgversion_from_command_line
+            theversion = hgversion_from_command_line.dup
+            if theversion.respond_to?(:force_encoding)
+              theversion.force_encoding('ASCII-8BIT')
+            end
             if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)})
               m[2].scan(%r{\d+}).collect(&:to_i)
             end
           end
 
           def hgversion_from_command_line
-            shellout("#{HG_BIN} --version") { |io| io.read }.to_s
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
 
           def template_path
@@ -58,153 +77,193 @@
             else
               ver = "0.9.5"
             end
-            "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
+            "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
           end
         end
 
-        def info
-          cmd = "#{HG_BIN} -R #{target('')} root"
-          root_url = nil
-          shellout(cmd) do |io|
-            root_url = io.read
-          end
-          return nil if $? && $?.exitstatus != 0
-          info = Info.new({:root_url => root_url.chomp,
-                            :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
-                          })
-          info
-        rescue CommandFailed
-          return nil
+        def initialize(url, root_url=nil, login=nil, password=nil, path_encoding=nil)
+          super
+          @path_encoding = path_encoding || 'UTF-8'
         end
 
-        def entries(path=nil, identifier=nil)
-          path ||= ''
-          entries = Entries.new
-          cmd = "#{HG_BIN} -R #{target('')} --cwd #{target('')} locate"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " " + shell_quote("path:#{path}") unless path.empty?
-          shellout(cmd) do |io|
-            io.each_line do |line|
-              # HG uses antislashs as separator on Windows
-              line = line.gsub(/\\/, "/")
-              if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'')
-                e ||= line
-                e = e.chomp.split(%r{[\/\\]})
-                entries << Entry.new({:name => e.first,
-                                       :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"),
-                                       :kind => (e.size > 1 ? 'dir' : 'file'),
-                                       :lastrev => Revision.new
-                                     }) unless e.empty? || entries.detect{|entry| entry.name == e.first}
-              end
+        def info
+          tip = summary['repository']['tip']
+          Info.new(:root_url => CGI.unescape(summary['repository']['root']),
+                   :lastrev => Revision.new(:revision => tip['revision'],
+                                            :scmid => tip['node']))
+        end
+
+        def tags
+          as_ary(summary['repository']['tag']).map { |e| e['name'] }
+        end
+
+        # Returns map of {'tag' => 'nodeid', ...}
+        def tagmap
+          alist = as_ary(summary['repository']['tag']).map do |e|
+            e.values_at('name', 'node')
+          end
+          Hash[*alist.flatten]
+        end
+
+        def branches
+          as_ary(summary['repository']['branch']).map { |e| e['name'] }
+        end
+
+        # Returns map of {'branch' => 'nodeid', ...}
+        def branchmap
+          alist = as_ary(summary['repository']['branch']).map do |e|
+            e.values_at('name', 'node')
+          end
+          Hash[*alist.flatten]
+        end
+
+        def summary
+          return @summary if @summary 
+          hg 'rhsummary' do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
+            begin
+              @summary = ActiveSupport::XmlMini.parse(output)['rhsummary']
+            rescue
             end
           end
-          return nil if $? && $?.exitstatus != 0
-          entries.sort_by_name
+        end
+        private :summary
+
+        def entries(path=nil, identifier=nil)
+          p1 = scm_iconv(@path_encoding, 'UTF-8', path)
+          manifest = hg('rhmanifest', '-r', CGI.escape(hgrev(identifier)),
+                        CGI.escape(without_leading_slash(p1.to_s))) do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
+            begin
+              ActiveSupport::XmlMini.parse(output)['rhmanifest']['repository']['manifest']
+            rescue
+            end
+          end
+          path_prefix = path.blank? ? '' : with_trailling_slash(path)
+
+          entries = Entries.new
+          as_ary(manifest['dir']).each do |e|
+            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
+            p = "#{path_prefix}#{n}"
+            entries << Entry.new(:name => n, :path => p, :kind => 'dir')
+          end
+
+          as_ary(manifest['file']).each do |e|
+            n = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['name']))
+            p = "#{path_prefix}#{n}"
+            lr = Revision.new(:revision => e['revision'], :scmid => e['node'],
+                              :identifier => e['node'],
+                              :time => Time.at(e['time'].to_i))
+            entries << Entry.new(:name => n, :path => p, :kind => 'file',
+                                 :size => e['size'].to_i, :lastrev => lr)
+          end
+
+          entries
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
-        # Fetch the revisions by using a template file that 
+        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
+          revs = Revisions.new
+          each_revision(path, identifier_from, identifier_to, options) { |e| revs << e }
+          revs
+        end
+
+        # Iterates the revisions by using a template file that
         # makes Mercurial produce a xml output.
-        def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})  
-          revisions = Revisions.new
-          cmd = "#{HG_BIN} --debug --encoding utf8 -R #{target('')} log -C --style #{shell_quote self.class.template_path}"
-          if identifier_from && identifier_to
-            cmd << " -r #{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
-          elsif identifier_from
-            cmd << " -r #{hgrev(identifier_from)}:"
-          end
-          cmd << " --limit #{options[:limit].to_i}" if options[:limit]
-          cmd << " #{shell_quote path}" unless path.blank?
-          shellout(cmd) do |io|
+        def each_revision(path=nil, identifier_from=nil, identifier_to=nil, options={})
+          hg_args = ['log', '--debug', '-C', '--style', self.class.template_path]
+          hg_args << '-r' << "#{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
+          hg_args << '--limit' << options[:limit] if options[:limit]
+          hg_args << hgtarget(path) unless path.blank?
+          log = hg(*hg_args) do |io|
+            output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
-              # HG doesn't close the XML Document...
-              doc = REXML::Document.new(io.read << "</log>")
-              doc.elements.each("log/logentry") do |logentry|
-                paths = []
-                copies = logentry.get_elements('paths/path-copied')
-                logentry.elements.each("paths/path") do |path|
-                  # Detect if the added file is a copy
-                  if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text }
-                    from_path = c.attributes['copyfrom-path']
-                    from_rev = logentry.attributes['revision']
-                  end
-                  paths << {:action => path.attributes['action'],
-                    :path => "/#{CGI.unescape(path.text)}",
-                    :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil,
-                    :from_revision => from_rev ? from_rev : nil
-                  }
-                end
-                paths.sort! { |x,y| x[:path] <=> y[:path] }
-
-                revisions << Revision.new({:identifier => logentry.attributes['revision'],
-                                            :scmid => logentry.attributes['node'],
-                                            :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""),
-                                            :time => Time.parse(logentry.elements['date'].text).localtime,
-                                            :message => logentry.elements['msg'].text,
-                                            :paths => paths
-                                          })
-              end
+              # Mercurial < 1.5 does not support footer template for '</log>'
+              ActiveSupport::XmlMini.parse("#{output}</log>")['log']
             rescue
-              logger.debug($!)
             end
           end
-          return nil if $? && $?.exitstatus != 0
-          revisions
+
+          as_ary(log['logentry']).each do |le|
+            cpalist = as_ary(le['paths']['path-copied']).map do |e|
+              [e['__content__'], e['copyfrom-path']].map { |s| CGI.unescape(s) }
+            end
+            cpmap = Hash[*cpalist.flatten]
+
+            paths = as_ary(le['paths']['path']).map do |e|
+              p = scm_iconv('UTF-8', @path_encoding, CGI.unescape(e['__content__']) )
+              {:action => e['action'], :path => with_leading_slash(p),
+               :from_path => (cpmap.member?(p) ? with_leading_slash(cpmap[p]) : nil),
+               :from_revision => (cpmap.member?(p) ? le['revision'] : nil)}
+            end.sort { |a, b| a[:path] <=> b[:path] }
+
+            yield Revision.new(:revision => le['revision'],
+                               :scmid => le['node'],
+                               :author => (le['author']['__content__'] rescue ''),
+                               :time => Time.parse(le['date']['__content__']).localtime,
+                               :message => le['msg']['__content__'],
+                               :paths => paths)
+          end
+          self
         end
 
         def diff(path, identifier_from, identifier_to=nil)
-          path ||= ''
-          diff_args = ''
+          hg_args = %w|rhdiff|
+          if identifier_to
+            hg_args << '-r' << hgrev(identifier_to) << '-r' << hgrev(identifier_from)
+          else
+            hg_args << '-c' << hgrev(identifier_from)
+          end
+          unless path.blank?
+            p = scm_iconv(@path_encoding, 'UTF-8', path)
+            hg_args << CGI.escape(hgtarget(p))
+          end
           diff = []
-          if identifier_to
-            diff_args = "-r #{hgrev(identifier_to)} -r #{hgrev(identifier_from)}"
-          else
-            if self.class.client_version_above?([1, 2])
-              diff_args = "-c #{hgrev(identifier_from)}"
-            else
-              return []
-            end
-          end
-          cmd = "#{HG_BIN} -R #{target('')} --config diff.git=false diff --nodates #{diff_args}"
-          cmd << " -I #{target(path)}" unless path.empty?
-          shellout(cmd) do |io|
+          hg *hg_args do |io|
             io.each_line do |line|
               diff << line
             end
           end
-          return nil if $? && $?.exitstatus != 0
           diff
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
         def cat(path, identifier=nil)
-          cmd = "#{HG_BIN} -R #{target('')} cat"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " #{target(path)}"
-          cat = nil
-          shellout(cmd) do |io|
+          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
+          hg 'rhcat', '-r', hgrev(identifier), hgtarget(p) do |io|
             io.binmode
-            cat = io.read
+            io.read
           end
-          return nil if $? && $?.exitstatus != 0
-          cat
+        rescue HgCommandAborted
+          nil  # means not found
         end
 
         def annotate(path, identifier=nil)
-          path ||= ''
-          cmd = "#{HG_BIN} -R #{target('')}"
-          cmd << " annotate -ncu"
-          cmd << " -r #{hgrev(identifier)}"
-          cmd << " #{target(path)}"
+          p = CGI.escape(scm_iconv(@path_encoding, 'UTF-8', path))
           blame = Annotate.new
-          shellout(cmd) do |io|
+          hg 'rhannotate', '-ncu', '-r', hgrev(identifier), hgtarget(p) do |io|
             io.each_line do |line|
+              line.force_encoding('ASCII-8BIT') if line.respond_to?(:force_encoding)
               next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$}
               r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3,
                                :identifier => $3)
               blame.add_line($4.rstrip, r)
             end
           end
-          return nil if $? && $?.exitstatus != 0
           blame
+        rescue HgCommandAborted
+          nil  # means not found or cannot be annotated
         end
 
         class Revision < Redmine::Scm::Adapters::Revision
@@ -214,11 +273,40 @@
           end
         end
 
+        # Runs 'hg' command with the given args
+        def hg(*args, &block)
+          repo_path = root_url || url
+          full_args = [HG_BIN, '-R', repo_path, '--encoding', 'utf-8']
+          full_args << '--config' << "extensions.redminehelper=#{HG_HELPER_EXT}"
+          full_args << '--config' << 'diff.git=false'
+          full_args += args
+          ret = shellout(full_args.map { |e| shell_quote e.to_s }.join(' '), &block)
+          if $? && $?.exitstatus != 0
+            raise HgCommandAborted, "hg exited with non-zero status: #{$?.exitstatus}"
+          end
+          ret
+        end
+        private :hg
+
         # Returns correct revision identifier
-        def hgrev(identifier)
-          shell_quote(identifier.blank? ? 'tip' : identifier.to_s)
+        def hgrev(identifier, sq=false)
+          rev = identifier.blank? ? 'tip' : identifier.to_s
+          rev = shell_quote(rev) if sq
+          rev
         end
         private :hgrev
+
+        def hgtarget(path)
+          path ||= ''
+          root_url + '/' + without_leading_slash(path)
+        end
+        private :hgtarget
+
+        def as_ary(o)
+          return [] unless o
+          o.is_a?(Array) ? o : Array[o]
+        end
+        private :as_ary
       end
     end
   end
--- a/lib/redmine/scm/adapters/subversion_adapter.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/scm/adapters/subversion_adapter.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -20,38 +20,54 @@
 
 module Redmine
   module Scm
-    module Adapters    
+    module Adapters
       class SubversionAdapter < AbstractAdapter
-      
+
         # SVN executable name
         SVN_BIN = Redmine::Configuration['scm_subversion_command'] || "svn"
-        
+
         class << self
+          def client_command
+            @@bin    ||= SVN_BIN
+          end
+
+          def sq_bin
+            @@sq_bin ||= shell_quote(SVN_BIN)
+          end
+
           def client_version
             @@client_version ||= (svn_binary_version || [])
           end
-          
+
+          def client_available
+            !client_version.empty?
+          end
+
           def svn_binary_version
-            cmd = "#{SVN_BIN} --version"
-            version = nil
-            shellout(cmd) do |io|
-              # Read svn version in first returned line
-              if m = io.read.to_s.match(%r{\A(.*?)((\d+\.)+\d+)})
-                version = m[2].scan(%r{\d+}).collect(&:to_i)
-              end
+            scm_version = scm_version_from_command_line.dup
+            if scm_version.respond_to?(:force_encoding)
+              scm_version.force_encoding('ASCII-8BIT')
             end
-            return nil if $? && $?.exitstatus != 0
-            version
+            if m = scm_version.match(%r{\A(.*?)((\d+\.)+\d+)})
+              m[2].scan(%r{\d+}).collect(&:to_i)
+            end
+          end
+
+          def scm_version_from_command_line
+            shellout("#{sq_bin} --version") { |io| io.read }.to_s
           end
         end
-        
+
         # Get info about the svn repository
         def info
-          cmd = "#{SVN_BIN} info --xml #{target}"
+          cmd = "#{self.class.sq_bin} info --xml #{target}"
           cmd << credentials_string
           info = nil
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               #root_url = doc.elements["info/entry/repository/root"].text          
@@ -70,17 +86,20 @@
         rescue CommandFailed
           return nil
         end
-        
+
         # Returns an Entries collection
         # or nil if the given path doesn't exist in the repository
         def entries(path=nil, identifier=nil)
           path ||= ''
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
           entries = Entries.new
-          cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} list --xml #{target(path)}@#{identifier}"
           cmd << credentials_string
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['lists']['list'], 'entry') do |entry|
@@ -110,17 +129,20 @@
           logger.debug("Found #{entries.size} entries in the repository for #{target(path)}") if logger && logger.debug?
           entries.sort_by_name
         end
-        
+
         def properties(path, identifier=nil)
           # proplist xml output supported in svn 1.5.0 and higher
           return nil unless self.class.client_version_above?([1, 5, 0])
           
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} proplist --verbose --xml #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} proplist --verbose --xml #{target(path)}@#{identifier}"
           cmd << credentials_string
           properties = {}
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['properties']['target'], 'property') do |property|
@@ -132,19 +154,22 @@
           return nil if $? && $?.exitstatus != 0
           properties
         end
-        
+
         def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
           path ||= ''
           identifier_from = (identifier_from && identifier_from.to_i > 0) ? identifier_from.to_i : "HEAD"
           identifier_to = (identifier_to && identifier_to.to_i > 0) ? identifier_to.to_i : 1
           revisions = Revisions.new
-          cmd = "#{SVN_BIN} log --xml -r #{identifier_from}:#{identifier_to}"
+          cmd = "#{self.class.sq_bin} log --xml -r #{identifier_from}:#{identifier_to}"
           cmd << credentials_string
           cmd << " --verbose " if  options[:with_paths]
           cmd << " --limit #{options[:limit].to_i}" if options[:limit]
           cmd << ' ' + target(path)
           shellout(cmd) do |io|
             output = io.read
+            if output.respond_to?(:force_encoding)
+              output.force_encoding('UTF-8')
+            end
             begin
               doc = ActiveSupport::XmlMini.parse(output)
               each_xml_element(doc['log'], 'logentry') do |logentry|
@@ -171,13 +196,14 @@
           return nil if $? && $?.exitstatus != 0
           revisions
         end
-        
+
         def diff(path, identifier_from, identifier_to=nil, type="inline")
           path ||= ''
           identifier_from = (identifier_from and identifier_from.to_i > 0) ? identifier_from.to_i : ''
+
           identifier_to = (identifier_to and identifier_to.to_i > 0) ? identifier_to.to_i : (identifier_from.to_i - 1)
-          
-          cmd = "#{SVN_BIN} diff -r "
+
+          cmd = "#{self.class.sq_bin} diff -r "
           cmd << "#{identifier_to}:"
           cmd << "#{identifier_from}"
           cmd << " #{target(path)}@#{identifier_from}"
@@ -191,10 +217,10 @@
           return nil if $? && $?.exitstatus != 0
           diff
         end
-        
+
         def cat(path, identifier=nil)
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} cat #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} cat #{target(path)}@#{identifier}"
           cmd << credentials_string
           cat = nil
           shellout(cmd) do |io|
@@ -204,10 +230,10 @@
           return nil if $? && $?.exitstatus != 0
           cat
         end
-        
+
         def annotate(path, identifier=nil)
           identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD"
-          cmd = "#{SVN_BIN} blame #{target(path)}@#{identifier}"
+          cmd = "#{self.class.sq_bin} blame #{target(path)}@#{identifier}"
           cmd << credentials_string
           blame = Annotate.new
           shellout(cmd) do |io|
--- a/lib/redmine/unified_diff.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/unified_diff.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -22,13 +22,21 @@
       options.assert_valid_keys(:type, :max_lines)
       diff = diff.split("\n") if diff.is_a?(String)
       diff_type = options[:type] || 'inline'
-      
       lines = 0
       @truncated = false
       diff_table = DiffTable.new(diff_type)
       diff.each do |line|
+        line_encoding = nil
+        if line.respond_to?(:force_encoding)
+          line_encoding = line.encoding
+          # TODO: UTF-16 and Japanese CP932 which is imcompatible with ASCII
+          #       In Japan, diffrence between file path encoding
+          #       and file contents encoding is popular.
+          line.force_encoding('ASCII-8BIT')
+        end
         unless diff_table.add_line line
-          self << diff_table if diff_table.length > 1
+          line.force_encoding(line_encoding) if line_encoding
+          self << diff_table if diff_table.length > 0
           diff_table = DiffTable.new(diff_type)
         end
         lines += 1
@@ -40,7 +48,7 @@
       self << diff_table unless diff_table.empty?
       self
     end
-    
+
     def truncated?; @truncated; end
   end
 
--- a/lib/redmine/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/views
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/views/builders/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/views/builders/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/views/builders
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/views/my_page/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/views/my_page/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/views/my_page
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/wiki_formatting/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/wiki_formatting/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/wiki_formatting
 http://redmine.rubyforge.org/svn
 
--- a/lib/redmine/wiki_formatting/textile/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/redmine/wiki_formatting/textile/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/redmine/wiki_formatting/textile
 http://redmine.rubyforge.org/svn
 
--- a/lib/tasks/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 34
-/svn/!svn/ver/4765/trunk/lib/tasks
+/svn/!svn/ver/4950/trunk/lib/tasks
 END
 deprecated.rake
 K 25
@@ -27,17 +27,23 @@
 V 48
 /svn/!svn/ver/4167/trunk/lib/tasks/reminder.rake
 END
+metrics.rake
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/!svn/ver/2825/trunk/lib/tasks/metrics.rake
+END
 initializers.rake
 K 25
 svn:wc:ra_dav:version-url
 V 52
 /svn/!svn/ver/4405/trunk/lib/tasks/initializers.rake
 END
-metrics.rake
+ciphering.rake
 K 25
 svn:wc:ra_dav:version-url
-V 47
-/svn/!svn/ver/2825/trunk/lib/tasks/metrics.rake
+V 49
+/svn/!svn/ver/4950/trunk/lib/tasks/ciphering.rake
 END
 permissions.rake
 K 25
@@ -55,7 +61,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 47
-/svn/!svn/ver/4687/trunk/lib/tasks/testing.rake
+/svn/!svn/ver/4806/trunk/lib/tasks/testing.rake
 END
 watchers.rake
 K 25
@@ -63,23 +69,23 @@
 V 48
 /svn/!svn/ver/3167/trunk/lib/tasks/watchers.rake
 END
+plugins.rake
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/!svn/ver/1786/trunk/lib/tasks/plugins.rake
+END
 yardoc.rake
 K 25
 svn:wc:ra_dav:version-url
 V 46
 /svn/!svn/ver/3922/trunk/lib/tasks/yardoc.rake
 END
-plugins.rake
-K 25
-svn:wc:ra_dav:version-url
-V 47
-/svn/!svn/ver/1786/trunk/lib/tasks/plugins.rake
-END
 locales.rake
 K 25
 svn:wc:ra_dav:version-url
 V 47
-/svn/!svn/ver/4254/trunk/lib/tasks/locales.rake
+/svn/!svn/ver/4937/trunk/lib/tasks/locales.rake
 END
 migrate_from_trac.rake
 K 25
--- a/lib/tasks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/lib/tasks
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-28T19:45:09.952949Z
-4765
+2011-02-26T13:09:25.657748Z
+4950
 jplang
 
 
@@ -162,6 +162,40 @@
 
 1606
 
+metrics.rake
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+0254f4ee916dee0a2572e63e947f8a1b
+2009-07-27T00:55:43.057910Z
+2825
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+113
+
 initializers.rake
 file
 
@@ -196,17 +230,18 @@
 
 1343
 
-metrics.rake
+ciphering.rake
 file
 
 
 
 
-2011-03-03T11:05:14.000000Z
-0254f4ee916dee0a2572e63e947f8a1b
-2009-07-27T00:55:43.057910Z
-2825
-edavis10
+2011-03-03T11:40:18.000000Z
+b522c20249b1fad89c3276d10ccaaf6b
+2011-02-26T13:09:25.657748Z
+4950
+jplang
+has-props
 
 
 
@@ -227,8 +262,7 @@
 
 
 
-
-113
+1409
 
 permissions.rake
 file
@@ -304,10 +338,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-62ce14359d5062666d86230adc5ba695
-2011-01-11T08:41:11.973101Z
-4687
+2011-03-03T11:40:18.000000Z
+ca73c8345daa839f0145c671ad94b91f
+2011-02-11T15:30:45.959165Z
+4806
 tmaruyama
 
 
@@ -330,7 +364,7 @@
 
 
 
-3280
+3376
 
 watchers.rake
 file
@@ -366,6 +400,40 @@
 
 180
 
+plugins.rake
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+f27a83cf3f04d7906ac2f3ca40d01a20
+2008-09-05T10:31:06.632668Z
+1786
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1256
+
 yardoc.rake
 file
 
@@ -400,51 +468,17 @@
 
 578
 
-plugins.rake
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-f27a83cf3f04d7906ac2f3ca40d01a20
-2008-09-05T10:31:06.632668Z
-1786
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1256
-
 locales.rake
 file
 
 
 
 
-2011-03-03T11:05:23.000000Z
-8cb19171aae8528b3149b7efa211fc50
-2010-10-15T22:41:47.658318Z
-4254
-edavis10
+2011-03-03T11:40:18.000000Z
+ceb44040708bb290ad5b62b5a366e823
+2011-02-23T18:03:33.945201Z
+4937
+jplang
 has-props
 
 
@@ -466,7 +500,7 @@
 
 
 
-3360
+4250
 
 migrate_from_trac.rake
 file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/tasks/.svn/prop-base/ciphering.rake.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/tasks/.svn/text-base/ciphering.rake.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,35 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+namespace :db do
+  desc 'Encrypts SCM and LDAP passwords in the database.'
+  task :encrypt => :environment do
+    unless (Repository.encrypt_all(:password) && 
+      AuthSource.encrypt_all(:account_password))
+      raise "Some objects could not be saved after encryption, update was rollback'ed."
+    end
+  end
+  
+  desc 'Decrypts SCM and LDAP passwords in the database.'
+  task :decrypt => :environment do
+    unless (Repository.decrypt_all(:password) &&
+      AuthSource.decrypt_all(:account_password))
+      raise "Some objects could not be saved after decryption, update was rollback'ed."
+    end
+  end
+end
--- a/lib/tasks/.svn/text-base/locales.rake.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/.svn/text-base/locales.rake.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -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
   desc 'Updates language files based on en.yml content (only works for new top level keys).'
   task :update do
@@ -28,6 +35,26 @@
       lang.close
     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
 Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
--- a/lib/tasks/.svn/text-base/testing.rake.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/.svn/text-base/testing.rake.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -51,7 +51,8 @@
       (supported_scms - [:subversion, :mercurial]).each do |scm|
         desc "Creates a test #{scm} repository"
         task scm => :create_dir do
-          system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
+          # system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
+          system "tar -xvz -C tmp/test -f test/fixtures/repositories/#{scm}_repository.tar.gz"
         end
       end
       
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/tasks/ciphering.rake	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,35 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+namespace :db do
+  desc 'Encrypts SCM and LDAP passwords in the database.'
+  task :encrypt => :environment do
+    unless (Repository.encrypt_all(:password) && 
+      AuthSource.encrypt_all(:account_password))
+      raise "Some objects could not be saved after encryption, update was rollback'ed."
+    end
+  end
+  
+  desc 'Decrypts SCM and LDAP passwords in the database.'
+  task :decrypt => :environment do
+    unless (Repository.decrypt_all(:password) &&
+      AuthSource.decrypt_all(:account_password))
+      raise "Some objects could not be saved after decryption, update was rollback'ed."
+    end
+  end
+end
--- a/lib/tasks/locales.rake	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/locales.rake	Thu Mar 03 11:42:28 2011 +0000
@@ -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
   desc 'Updates language files based on en.yml content (only works for new top level keys).'
   task :update do
@@ -28,6 +35,26 @@
       lang.close
     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
 Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
--- a/lib/tasks/testing.rake	Thu Mar 03 11:40:10 2011 +0000
+++ b/lib/tasks/testing.rake	Thu Mar 03 11:42:28 2011 +0000
@@ -51,7 +51,8 @@
       (supported_scms - [:subversion, :mercurial]).each do |scm|
         desc "Creates a test #{scm} repository"
         task scm => :create_dir do
-          system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
+          # system "gunzip < test/fixtures/repositories/#{scm}_repository.tar.gz | tar -xv -C tmp/test"
+          system "tar -xvz -C tmp/test -f test/fixtures/repositories/#{scm}_repository.tar.gz"
         end
       end
       
--- a/log/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/log/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/log
 http://redmine.rubyforge.org/svn
 
--- a/public/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 31
-/svn/!svn/ver/4782/trunk/public
+/svn/!svn/ver/4954/trunk/public
 END
 dispatch.fcgi.example
 K 25
--- a/public/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-30T09:09:50.276451Z
-4782
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
--- a/public/help/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/help/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/help
 http://redmine.rubyforge.org/svn
 
--- a/public/images/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/images/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/images
 http://redmine.rubyforge.org/svn
 
@@ -162,6 +162,74 @@
 
 218
 
+milestone_late.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+ecc1979ed435769c700725495428359f
+2010-09-10T03:09:02.311267Z
+4072
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+160
+
+folder_open_add.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+8ae3a2d9ef884ed73a4157cd9c0465b8
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+375
+
 2downarrow.png
 file
 
@@ -196,74 +264,6 @@
 
 282
 
-folder_open_add.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-8ae3a2d9ef884ed73a4157cd9c0465b8
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-375
-
-milestone_late.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-ecc1979ed435769c700725495428359f
-2010-09-10T03:09:02.311267Z
-4072
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-160
-
 warning.png
 file
 
@@ -298,6 +298,74 @@
 
 613
 
+move.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+0a2ceb01cbc3c01186fdcc25ced8eb0d
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+321
+
+fav_off.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+ff96c02d8f18116bb3f005f2c8b86e91
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+211
+
 reload.png
 file
 
@@ -332,74 +400,6 @@
 
 549
 
-fav_off.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-ff96c02d8f18116bb3f005f2c8b86e91
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-211
-
-move.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-0a2ceb01cbc3c01186fdcc25ced8eb0d
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-321
-
 project_marker.png
 file
 
@@ -468,6 +468,40 @@
 
 641
 
+zoom_in.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+91b883d074b727f1a95cd0ce48510a3c
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+461
+
 copy.png
 file
 
@@ -502,40 +536,6 @@
 
 925
 
-zoom_in.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-91b883d074b727f1a95cd0ce48510a3c
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-461
-
 news.png
 file
 
@@ -1083,6 +1083,40 @@
 
 137
 
+bullet_delete.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+fba036d7348ff28f7ab7dacbc52bc32a
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+255
+
 text_list_bullets.png
 file
 
@@ -1117,40 +1151,6 @@
 
 291
 
-bullet_delete.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-fba036d7348ff28f7ab7dacbc52bc32a
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-255
-
 bullet_arrow_left.png
 file
 
@@ -1423,6 +1423,40 @@
 
 403
 
+attachment.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+0a35d4eaddb2292fed7062295ee0dcd8
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+939
+
 textfield.png
 file
 
@@ -1457,40 +1491,6 @@
 
 100
 
-attachment.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-0a35d4eaddb2292fed7062295ee0dcd8
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-939
-
 false.png
 file
 
@@ -1525,6 +1525,40 @@
 
 459
 
+bullet_toggle_plus.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+06cbf5da7daca348a87a6299a4112d71
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+217
+
 unlock.png
 file
 
@@ -1559,40 +1593,6 @@
 
 448
 
-bullet_toggle_plus.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-06cbf5da7daca348a87a6299a4112d71
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-217
-
 group.png
 file
 
@@ -1627,6 +1627,108 @@
 
 700
 
+plugin.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+e019855b07d30f1ce1baf59b9df27125
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+538
+
+loading.gif
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+03ce3dcc84af110e9da8699a841e5200
+2006-12-03T19:55:45.161980Z
+62
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1553
+
+bullet_blue.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+3363f60299360fb5539b769d089e145f
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+241
+
 save.png
 file
 
@@ -1661,108 +1763,6 @@
 
 440
 
-bullet_blue.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-3363f60299360fb5539b769d089e145f
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-241
-
-loading.gif
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-03ce3dcc84af110e9da8699a841e5200
-2006-12-03T19:55:45.161980Z
-62
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1553
-
-plugin.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-e019855b07d30f1ce1baf59b9df27125
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-538
-
 bullet_add.png
 file
 
@@ -1831,6 +1831,40 @@
 
 1885
 
+milestone_done.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+40c58172e0c52eee4deb5227ec37f0cf
+2010-09-10T03:09:02.311267Z
+4072
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+137
+
 exclamation.png
 file
 
@@ -1865,40 +1899,6 @@
 
 648
 
-milestone_done.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-40c58172e0c52eee4deb5227ec37f0cf
-2010-09-10T03:09:02.311267Z
-4072
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-137
-
 ticket_go.png
 file
 
@@ -1933,6 +1933,74 @@
 
 608
 
+folder.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+59f2dc025632f00403490176e7f42bfc
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+970
+
+report.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+8d8ec49f5773997411ff708a82e40568
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1014
+
 zoom_out.png
 file
 
@@ -1967,74 +2035,6 @@
 
 461
 
-report.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-8d8ec49f5773997411ff708a82e40568
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1014
-
-folder.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-59f2dc025632f00403490176e7f42bfc
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-970
-
 fav.png
 file
 
@@ -2069,6 +2069,40 @@
 
 378
 
+bullet_purple.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+c4c76ce450e3e838afd6aa8f34a8d9a8
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+244
+
 document.png
 file
 
@@ -2103,40 +2137,6 @@
 
 333
 
-bullet_purple.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-c4c76ce450e3e838afd6aa8f34a8d9a8
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-244
-
 true.png
 file
 
--- a/public/images/files/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/images/files/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/images/files
 http://redmine.rubyforge.org/svn
 
--- a/public/images/jstoolbar/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/images/jstoolbar/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/images/jstoolbar
 http://redmine.rubyforge.org/svn
 
@@ -94,6 +94,74 @@
 
 252
 
+bt_ol.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+5477ff20be77ab65aa6b75f47778234e
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+248
+
+bt_h3.png
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+cb940b592da5ed0367305cb0514d5684
+2010-02-13T09:08:12.698526Z
+3419
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+261
+
 bt_code.png
 file
 
@@ -128,14 +196,14 @@
 
 927
 
-bt_h3.png
+bt_strong.png
 file
 
 
 
 
 2011-03-03T11:05:14.000000Z
-cb940b592da5ed0367305cb0514d5684
+f9d7446ceaa5142a5030e9430b3a2bb4
 2010-02-13T09:08:12.698526Z
 3419
 jplang
@@ -160,41 +228,7 @@
 
 
 
-261
-
-bt_ol.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-5477ff20be77ab65aa6b75f47778234e
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-248
+244
 
 bt_img.png
 file
@@ -230,40 +264,6 @@
 
 1027
 
-bt_strong.png
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-f9d7446ceaa5142a5030e9430b3a2bb4
-2010-02-13T09:08:12.698526Z
-3419
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-244
-
 bt_bq_remove.png
 file
 
--- a/public/javascripts/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/4648/trunk/public/javascripts
+/svn/!svn/ver/4947/trunk/public/javascripts
 END
 prototype.js
 K 25
@@ -13,7 +13,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4504/trunk/public/javascripts/context_menu.js
+/svn/!svn/ver/4947/trunk/public/javascripts/context_menu.js
 END
 repository_navigation.js
 K 25
@@ -43,7 +43,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/4648/trunk/public/javascripts/application.js
+/svn/!svn/ver/4900/trunk/public/javascripts/application.js
 END
 controls.js
 K 25
--- a/public/javascripts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/javascripts
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-06T21:02:19.982329Z
-4648
+2011-02-24T17:56:17.648907Z
+4947
 jplang
 
 
@@ -69,10 +69,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-d8370dbea2b172789fa1683412c110a5
-2010-12-12T16:26:24.102027Z
-4504
+2011-03-03T11:40:18.000000Z
+3065b1a7ff2aca0c2d6fb394f4fef7fa
+2011-02-24T17:56:17.648907Z
+4947
 jplang
 has-props
 
@@ -95,7 +95,7 @@
 
 
 
-7021
+6852
 
 calendar
 dir
@@ -242,10 +242,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-d9adfbc01d7b99bb5de20d5e9fb145a6
-2011-01-06T21:02:19.982329Z
-4648
+2011-03-03T11:40:18.000000Z
+312c6491eda00cbd741131ab1685a4b9
+2011-02-21T09:53:29.844413Z
+4900
 jplang
 has-props
 
@@ -268,7 +268,7 @@
 
 
 
-7727
+8869
 
 controls.js
 file
--- a/public/javascripts/.svn/text-base/application.js.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/.svn/text-base/application.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -46,6 +46,12 @@
 	Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
 }
 
+function hideFieldset(el) {
+	var fieldset = Element.up(el, 'fieldset');
+	fieldset.toggleClassName('collapsed');
+	fieldset.down('div').hide();
+}
+
 var fileFieldCount = 1;
 
 function addFileField() {
@@ -249,6 +255,49 @@
   Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
 }
 
+/*
+ * Class used to warn user when leaving a page with unsaved textarea
+ * Author: mathias.fischer@berlinonline.de
+*/
+
+var WarnLeavingUnsaved = Class.create({
+	observedForms: false,
+	observedElements: false,
+	changedForms: false,
+	message: null,
+	
+	initialize: function(message){
+		this.observedForms = $$('form');
+		this.observedElements =  $$('textarea');
+		this.message = message;
+		
+		this.observedElements.each(this.observeChange.bind(this));
+		this.observedForms.each(this.submitAction.bind(this));
+		
+		window.onbeforeunload = this.unload.bind(this);
+	},
+	
+	unload: function(){
+		if(this.changedForms)
+      return this.message;
+	},
+	
+	setChanged: function(){
+    this.changedForms = true;
+	},
+	
+	setUnchanged: function(){
+    this.changedForms = false;
+	},
+	
+	observeChange: function(element){
+    element.observe('change',this.setChanged.bindAsEventListener(this));
+	},
+	
+	submitAction: function(element){
+    element.observe('submit',this.setUnchanged.bindAsEventListener(this));
+	}
+});
 
 /* shows and hides ajax indicator */
 Ajax.Responders.register({
--- a/public/javascripts/.svn/text-base/context_menu.js.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/.svn/text-base/context_menu.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -11,7 +11,7 @@
 
 	if (!observingContextMenuClick) {
 		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;
 	}
 	
@@ -23,8 +23,6 @@
 		this.hideMenu();
 		// do not show the context menu on links
 		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');
 		if (tr == document || tr == undefined  || !tr.hasClassName('hascontextmenu')) { return; }
 		Event.stop(e);
@@ -39,7 +37,6 @@
   Click: function(e) {
   	this.hideMenu();
   	if (Event.element(e).tagName == 'A') { return; }
-    if (window.opera && e.altKey) {	return; }
     if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {      
       var tr = Event.findElement(e, 'tr');
       if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) {
--- a/public/javascripts/application.js	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/application.js	Thu Mar 03 11:42:28 2011 +0000
@@ -46,6 +46,12 @@
 	Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
 }
 
+function hideFieldset(el) {
+	var fieldset = Element.up(el, 'fieldset');
+	fieldset.toggleClassName('collapsed');
+	fieldset.down('div').hide();
+}
+
 var fileFieldCount = 1;
 
 function addFileField() {
@@ -249,6 +255,49 @@
   Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
 }
 
+/*
+ * Class used to warn user when leaving a page with unsaved textarea
+ * Author: mathias.fischer@berlinonline.de
+*/
+
+var WarnLeavingUnsaved = Class.create({
+	observedForms: false,
+	observedElements: false,
+	changedForms: false,
+	message: null,
+	
+	initialize: function(message){
+		this.observedForms = $$('form');
+		this.observedElements =  $$('textarea');
+		this.message = message;
+		
+		this.observedElements.each(this.observeChange.bind(this));
+		this.observedForms.each(this.submitAction.bind(this));
+		
+		window.onbeforeunload = this.unload.bind(this);
+	},
+	
+	unload: function(){
+		if(this.changedForms)
+      return this.message;
+	},
+	
+	setChanged: function(){
+    this.changedForms = true;
+	},
+	
+	setUnchanged: function(){
+    this.changedForms = false;
+	},
+	
+	observeChange: function(element){
+    element.observe('change',this.setChanged.bindAsEventListener(this));
+	},
+	
+	submitAction: function(element){
+    element.observe('submit',this.setUnchanged.bindAsEventListener(this));
+	}
+});
 
 /* shows and hides ajax indicator */
 Ajax.Responders.register({
--- a/public/javascripts/calendar/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/calendar/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 52
-/svn/!svn/ver/4060/trunk/public/javascripts/calendar
+/svn/!svn/ver/4903/trunk/public/javascripts/calendar
 END
 calendar-setup.js
 K 25
--- a/public/javascripts/calendar/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/calendar/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/javascripts/calendar
 http://redmine.rubyforge.org/svn
 
 
 
-2010-09-05T11:33:08.614151Z
-4060
-winterheart
+2011-02-21T10:08:59.720731Z
+4903
+jplang
 
 
 
--- a/public/javascripts/calendar/lang/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/calendar/lang/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 57
-/svn/!svn/ver/4060/trunk/public/javascripts/calendar/lang
+/svn/!svn/ver/4903/trunk/public/javascripts/calendar/lang
 END
 calendar-fi.js
 K 25
@@ -99,29 +99,29 @@
 V 72
 /svn/!svn/ver/3227/trunk/public/javascripts/calendar/lang/calendar-id.js
 END
+calendar-en.js
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/419/trunk/public/javascripts/calendar/lang/calendar-en.js
+END
 calendar-gl.js
 K 25
 svn:wc:ra_dav:version-url
 V 72
 /svn/!svn/ver/2296/trunk/public/javascripts/calendar/lang/calendar-gl.js
 END
-calendar-en.js
-K 25
-svn:wc:ra_dav:version-url
-V 71
-/svn/!svn/ver/419/trunk/public/javascripts/calendar/lang/calendar-en.js
-END
 calendar-fr.js
 K 25
 svn:wc:ra_dav:version-url
 V 71
 /svn/!svn/ver/748/trunk/public/javascripts/calendar/lang/calendar-fr.js
 END
-calendar-zh-tw.js
+calendar-nl.js
 K 25
 svn:wc:ra_dav:version-url
-V 75
-/svn/!svn/ver/1498/trunk/public/javascripts/calendar/lang/calendar-zh-tw.js
+V 71
+/svn/!svn/ver/539/trunk/public/javascripts/calendar/lang/calendar-nl.js
 END
 calendar-hr.js
 K 25
@@ -129,11 +129,11 @@
 V 72
 /svn/!svn/ver/3320/trunk/public/javascripts/calendar/lang/calendar-hr.js
 END
-calendar-nl.js
+calendar-zh-tw.js
 K 25
 svn:wc:ra_dav:version-url
-V 71
-/svn/!svn/ver/539/trunk/public/javascripts/calendar/lang/calendar-nl.js
+V 75
+/svn/!svn/ver/1498/trunk/public/javascripts/calendar/lang/calendar-zh-tw.js
 END
 calendar-mn.js
 K 25
@@ -141,18 +141,18 @@
 V 72
 /svn/!svn/ver/3626/trunk/public/javascripts/calendar/lang/calendar-mn.js
 END
+calendar-pl.js
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/749/trunk/public/javascripts/calendar/lang/calendar-pl.js
+END
 calendar-th.js
 K 25
 svn:wc:ra_dav:version-url
 V 72
 /svn/!svn/ver/1383/trunk/public/javascripts/calendar/lang/calendar-th.js
 END
-calendar-pl.js
-K 25
-svn:wc:ra_dav:version-url
-V 71
-/svn/!svn/ver/749/trunk/public/javascripts/calendar/lang/calendar-pl.js
-END
 calendar-it.js
 K 25
 svn:wc:ra_dav:version-url
@@ -171,18 +171,18 @@
 V 72
 /svn/!svn/ver/1149/trunk/public/javascripts/calendar/lang/calendar-lt.js
 END
+calendar-lv.js
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/3737/trunk/public/javascripts/calendar/lang/calendar-lv.js
+END
 calendar-zh.js
 K 25
 svn:wc:ra_dav:version-url
 V 72
 /svn/!svn/ver/1498/trunk/public/javascripts/calendar/lang/calendar-zh.js
 END
-calendar-lv.js
-K 25
-svn:wc:ra_dav:version-url
-V 72
-/svn/!svn/ver/3737/trunk/public/javascripts/calendar/lang/calendar-lv.js
-END
 calendar-pt.js
 K 25
 svn:wc:ra_dav:version-url
@@ -219,6 +219,12 @@
 V 72
 /svn/!svn/ver/1817/trunk/public/javascripts/calendar/lang/calendar-tr.js
 END
+calendar-fa.js
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/4903/trunk/public/javascripts/calendar/lang/calendar-fa.js
+END
 calendar-bg.js
 K 25
 svn:wc:ra_dav:version-url
--- a/public/javascripts/calendar/lang/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/calendar/lang/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/javascripts/calendar/lang
 http://redmine.rubyforge.org/svn
 
 
 
-2010-09-05T11:33:08.614151Z
-4060
-winterheart
+2011-02-21T10:08:59.720731Z
+4903
+jplang
 
 
 
@@ -570,40 +570,6 @@
 
 3845
 
-calendar-gl.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-c4f74e36f6a3debcf8ec065bc6886f04
-2009-01-23T15:37:59.406714Z
-2296
-winterheart
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3855
-
 calendar-en.js
 file
 
@@ -638,6 +604,40 @@
 
 3600
 
+calendar-gl.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+c4f74e36f6a3debcf8ec065bc6886f04
+2009-01-23T15:37:59.406714Z
+2296
+winterheart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3855
+
 calendar-fr.js
 file
 
@@ -672,6 +672,74 @@
 
 3870
 
+calendar-nl.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+c029bd9c4867bb39e86d1d6efada6d58
+2007-05-24T17:29:11.682821Z
+539
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3701
+
+calendar-hr.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+f8d0daa275cf612206c43d4c9be95d08
+2010-01-17T10:33:30.937961Z
+3320
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3646
+
 calendar-zh-tw.js
 file
 
@@ -706,74 +774,6 @@
 
 3841
 
-calendar-hr.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-f8d0daa275cf612206c43d4c9be95d08
-2010-01-17T10:33:30.937961Z
-3320
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3646
-
-calendar-nl.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-c029bd9c4867bb39e86d1d6efada6d58
-2007-05-24T17:29:11.682821Z
-539
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3701
-
 calendar-mn.js
 file
 
@@ -808,6 +808,40 @@
 
 3904
 
+calendar-pl.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+eabf711c28d30bb9474f3f505766f286
+2007-09-22T14:56:09.057923Z
+749
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3974
+
 calendar-th.js
 file
 
@@ -842,40 +876,6 @@
 
 4417
 
-calendar-pl.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-eabf711c28d30bb9474f3f505766f286
-2007-09-22T14:56:09.057923Z
-749
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3974
-
 calendar-it.js
 file
 
@@ -978,6 +978,40 @@
 
 3909
 
+calendar-lv.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+b260d88c13c01ebf4e7c94b9cb022930
+2010-05-14T18:15:41.754813Z
+3737
+winterheart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3803
+
 calendar-zh.js
 file
 
@@ -1012,40 +1046,6 @@
 
 3600
 
-calendar-lv.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-b260d88c13c01ebf4e7c94b9cb022930
-2010-05-14T18:15:41.754813Z
-3737
-winterheart
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3803
-
 calendar-ca.js
 file
 
@@ -1250,6 +1250,40 @@
 
 3776
 
+calendar-fa.js
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+79e745b797f9148ac63de8ce583e2282
+2011-02-21T10:08:59.720731Z
+4903
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3977
+
 calendar-bg.js
 file
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/calendar/lang/.svn/prop-base/calendar-fa.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/calendar/lang/.svn/text-base/calendar-fa.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar FA language
+// Author: Behrang Noroozinia, behrangn at g mail
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("یک‌شنبه",
+ "دوشنبه",
+ "سه‌شنبه",
+ "چهارشنبه",
+ "پنج‌شنبه",
+ "آدینه",
+ "شنبه",
+ "یک‌شنبه");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("یک",
+ "دو",
+ "سه",
+ "چهار",
+ "پنج",
+ "آدینه",
+ "شنبه",
+ "یک");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("ژانویه",
+ "فوریه",
+ "مارس",
+ "آوریل",
+ "مه",
+ "ژوئن",
+ "ژوئیه",
+ "اوت",
+ "سپتامبر",
+ "اکتبر",
+ "نوامبر",
+ "دسامبر");
+
+// short month names
+Calendar._SMN = new Array
+("ژان",
+ "فور",
+ "مار",
+ "آور",
+ "مه",
+ "ژوئن",
+ "ژوئیه",
+ "اوت",
+ "سپت",
+ "اکت",
+ "نوا",
+ "دسا");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "درباره گاهشمار";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "سال پیشین (برای فهرست نگه دارید)";
+Calendar._TT["PREV_MONTH"] = "ماه پیشین ( برای فهرست نگه دارید)";
+Calendar._TT["GO_TODAY"] = "برو به امروز";
+Calendar._TT["NEXT_MONTH"] = "ماه پسین (برای فهرست نگه دارید)";
+Calendar._TT["NEXT_YEAR"] = "سال پسین (برای فهرست نگه دارید)";
+Calendar._TT["SEL_DATE"] = "گزینش";
+Calendar._TT["DRAG_TO_MOVE"] = "برای جابجایی بکشید";
+Calendar._TT["PART_TODAY"] = " (امروز)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "آغاز هفته از %s";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "4,5";
+
+Calendar._TT["CLOSE"] = "بسته";
+Calendar._TT["TODAY"] = "امروز";
+Calendar._TT["TIME_PART"] = "زدن (با Shift) یا کشیدن برای ویرایش";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "هفته";
+Calendar._TT["TIME"] = "زمان:";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/calendar/lang/calendar-fa.js	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar FA language
+// Author: Behrang Noroozinia, behrangn at g mail
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible.  We strongly believe that
+// Unicode is the answer to a real internationalized world.  Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("یک‌شنبه",
+ "دوشنبه",
+ "سه‌شنبه",
+ "چهارشنبه",
+ "پنج‌شنبه",
+ "آدینه",
+ "شنبه",
+ "یک‌شنبه");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary.  We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+//   Calendar._SDN_len = N; // short day name length
+//   Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("یک",
+ "دو",
+ "سه",
+ "چهار",
+ "پنج",
+ "آدینه",
+ "شنبه",
+ "یک");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("ژانویه",
+ "فوریه",
+ "مارس",
+ "آوریل",
+ "مه",
+ "ژوئن",
+ "ژوئیه",
+ "اوت",
+ "سپتامبر",
+ "اکتبر",
+ "نوامبر",
+ "دسامبر");
+
+// short month names
+Calendar._SMN = new Array
+("ژان",
+ "فور",
+ "مار",
+ "آور",
+ "مه",
+ "ژوئن",
+ "ژوئیه",
+ "اوت",
+ "سپت",
+ "اکت",
+ "نوا",
+ "دسا");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "درباره گاهشمار";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL.  See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "سال پیشین (برای فهرست نگه دارید)";
+Calendar._TT["PREV_MONTH"] = "ماه پیشین ( برای فهرست نگه دارید)";
+Calendar._TT["GO_TODAY"] = "برو به امروز";
+Calendar._TT["NEXT_MONTH"] = "ماه پسین (برای فهرست نگه دارید)";
+Calendar._TT["NEXT_YEAR"] = "سال پسین (برای فهرست نگه دارید)";
+Calendar._TT["SEL_DATE"] = "گزینش";
+Calendar._TT["DRAG_TO_MOVE"] = "برای جابجایی بکشید";
+Calendar._TT["PART_TODAY"] = " (امروز)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "آغاز هفته از %s";
+
+// This may be locale-dependent.  It specifies the week-end days, as an array
+// of comma-separated numbers.  The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "4,5";
+
+Calendar._TT["CLOSE"] = "بسته";
+Calendar._TT["TODAY"] = "امروز";
+Calendar._TT["TIME_PART"] = "زدن (با Shift) یا کشیدن برای ویرایش";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "هفته";
+Calendar._TT["TIME"] = "زمان:";
--- a/public/javascripts/context_menu.js	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/context_menu.js	Thu Mar 03 11:42:28 2011 +0000
@@ -11,7 +11,7 @@
 
 	if (!observingContextMenuClick) {
 		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;
 	}
 	
@@ -23,8 +23,6 @@
 		this.hideMenu();
 		// do not show the context menu on links
 		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');
 		if (tr == document || tr == undefined  || !tr.hasClassName('hascontextmenu')) { return; }
 		Event.stop(e);
@@ -39,7 +37,6 @@
   Click: function(e) {
   	this.hideMenu();
   	if (Event.element(e).tagName == 'A') { return; }
-    if (window.opera && e.altKey) {	return; }
     if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) {      
       var tr = Event.findElement(e, 'tr');
       if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) {
--- a/public/javascripts/jstoolbar/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/jstoolbar/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 53
-/svn/!svn/ver/4049/trunk/public/javascripts/jstoolbar
+/svn/!svn/ver/4903/trunk/public/javascripts/jstoolbar
 END
 textile.js
 K 25
--- a/public/javascripts/jstoolbar/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/jstoolbar/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/javascripts/jstoolbar
 http://redmine.rubyforge.org/svn
 
 
 
-2010-08-29T12:54:04.302020Z
-4049
-winterheart
+2011-02-21T10:08:59.720731Z
+4903
+jplang
 
 
 
--- a/public/javascripts/jstoolbar/lang/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/jstoolbar/lang/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/4049/trunk/public/javascripts/jstoolbar/lang
+/svn/!svn/ver/4903/trunk/public/javascripts/jstoolbar/lang
 END
 jstoolbar-mk.js
 K 25
@@ -99,11 +99,11 @@
 V 74
 /svn/!svn/ver/1479/trunk/public/javascripts/jstoolbar/lang/jstoolbar-fr.js
 END
-jstoolbar-zh-tw.js
+jstoolbar-nl.js
 K 25
 svn:wc:ra_dav:version-url
-V 77
-/svn/!svn/ver/1498/trunk/public/javascripts/jstoolbar/lang/jstoolbar-zh-tw.js
+V 74
+/svn/!svn/ver/2291/trunk/public/javascripts/jstoolbar/lang/jstoolbar-nl.js
 END
 jstoolbar-hr.js
 K 25
@@ -111,11 +111,11 @@
 V 74
 /svn/!svn/ver/3320/trunk/public/javascripts/jstoolbar/lang/jstoolbar-hr.js
 END
-jstoolbar-nl.js
+jstoolbar-zh-tw.js
 K 25
 svn:wc:ra_dav:version-url
-V 74
-/svn/!svn/ver/2291/trunk/public/javascripts/jstoolbar/lang/jstoolbar-nl.js
+V 77
+/svn/!svn/ver/1498/trunk/public/javascripts/jstoolbar/lang/jstoolbar-zh-tw.js
 END
 jstoolbar-mn.js
 K 25
@@ -123,18 +123,18 @@
 V 74
 /svn/!svn/ver/3626/trunk/public/javascripts/jstoolbar/lang/jstoolbar-mn.js
 END
+jstoolbar-pl.js
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/!svn/ver/1928/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pl.js
+END
 jstoolbar-th.js
 K 25
 svn:wc:ra_dav:version-url
 V 74
 /svn/!svn/ver/1479/trunk/public/javascripts/jstoolbar/lang/jstoolbar-th.js
 END
-jstoolbar-pl.js
-K 25
-svn:wc:ra_dav:version-url
-V 74
-/svn/!svn/ver/1928/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pl.js
-END
 jstoolbar-it.js
 K 25
 svn:wc:ra_dav:version-url
@@ -153,17 +153,23 @@
 V 74
 /svn/!svn/ver/1479/trunk/public/javascripts/jstoolbar/lang/jstoolbar-lt.js
 END
+jstoolbar-lv.js
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/!svn/ver/3737/trunk/public/javascripts/jstoolbar/lang/jstoolbar-lv.js
+END
 jstoolbar-zh.js
 K 25
 svn:wc:ra_dav:version-url
 V 74
 /svn/!svn/ver/1498/trunk/public/javascripts/jstoolbar/lang/jstoolbar-zh.js
 END
-jstoolbar-lv.js
+jstoolbar-pt.js
 K 25
 svn:wc:ra_dav:version-url
 V 74
-/svn/!svn/ver/3737/trunk/public/javascripts/jstoolbar/lang/jstoolbar-lv.js
+/svn/!svn/ver/1927/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pt.js
 END
 jstoolbar-ca.js
 K 25
@@ -171,11 +177,11 @@
 V 74
 /svn/!svn/ver/1865/trunk/public/javascripts/jstoolbar/lang/jstoolbar-ca.js
 END
-jstoolbar-pt.js
+jstoolbar-pt-br.js
 K 25
 svn:wc:ra_dav:version-url
-V 74
-/svn/!svn/ver/1927/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pt.js
+V 77
+/svn/!svn/ver/1479/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pt-br.js
 END
 jstoolbar-da.js
 K 25
@@ -183,12 +189,6 @@
 V 74
 /svn/!svn/ver/2921/trunk/public/javascripts/jstoolbar/lang/jstoolbar-da.js
 END
-jstoolbar-pt-br.js
-K 25
-svn:wc:ra_dav:version-url
-V 77
-/svn/!svn/ver/1479/trunk/public/javascripts/jstoolbar/lang/jstoolbar-pt-br.js
-END
 jstoolbar-sr.js
 K 25
 svn:wc:ra_dav:version-url
@@ -201,6 +201,12 @@
 V 74
 /svn/!svn/ver/1817/trunk/public/javascripts/jstoolbar/lang/jstoolbar-tr.js
 END
+jstoolbar-fa.js
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/!svn/ver/4903/trunk/public/javascripts/jstoolbar/lang/jstoolbar-fa.js
+END
 jstoolbar-bg.js
 K 25
 svn:wc:ra_dav:version-url
--- a/public/javascripts/jstoolbar/lang/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/javascripts/jstoolbar/lang/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/javascripts/jstoolbar/lang
 http://redmine.rubyforge.org/svn
 
 
 
-2010-08-29T12:54:04.302020Z
-4049
-winterheart
+2011-02-21T10:08:59.720731Z
+4903
+jplang
 
 
 
@@ -570,6 +570,74 @@
 
 753
 
+jstoolbar-nl.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+b1bc7a04b7b466073845dd2c81bbbf23
+2009-01-20T15:53:09.750096Z
+2291
+winterheart
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+753
+
+jstoolbar-hr.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+f13f0553753c4b53bd96c294ca6ce15e
+2010-01-17T10:33:30.937961Z
+3320
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+721
+
 jstoolbar-zh-tw.js
 file
 
@@ -604,74 +672,6 @@
 
 716
 
-jstoolbar-hr.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-f13f0553753c4b53bd96c294ca6ce15e
-2010-01-17T10:33:30.937961Z
-3320
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-721
-
-jstoolbar-nl.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-b1bc7a04b7b466073845dd2c81bbbf23
-2009-01-20T15:53:09.750096Z
-2291
-winterheart
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-753
-
 jstoolbar-mn.js
 file
 
@@ -706,6 +706,40 @@
 
 916
 
+jstoolbar-pl.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+1d2b7d7c66953806ca428f91a95d2eaa
+2008-10-07T17:41:16.515762Z
+1928
+winterheart
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+851
+
 jstoolbar-th.js
 file
 
@@ -740,40 +774,6 @@
 
 931
 
-jstoolbar-pl.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-1d2b7d7c66953806ca428f91a95d2eaa
-2008-10-07T17:41:16.515762Z
-1928
-winterheart
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-851
-
 jstoolbar-it.js
 file
 
@@ -876,6 +876,40 @@
 
 754
 
+jstoolbar-lv.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+5a44b7a9bd5b7db86d0a7398ee5bc779
+2010-05-14T18:15:41.754813Z
+3737
+winterheart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+836
+
 jstoolbar-zh.js
 file
 
@@ -910,74 +944,6 @@
 
 722
 
-jstoolbar-lv.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-5a44b7a9bd5b7db86d0a7398ee5bc779
-2010-05-14T18:15:41.754813Z
-3737
-winterheart
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-836
-
-jstoolbar-ca.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-6aacb53ed49e6e14831baf8c38096662
-2008-09-15T16:07:30.857601Z
-1865
-winterheart
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-763
-
 jstoolbar-pt.js
 file
 
@@ -1012,6 +978,74 @@
 
 823
 
+jstoolbar-ca.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+6aacb53ed49e6e14831baf8c38096662
+2008-09-15T16:07:30.857601Z
+1865
+winterheart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+763
+
+jstoolbar-da.js
+file
+
+
+
+
+2011-03-03T11:05:14.000000Z
+4061b38de5e085dac922f77f94bd254a
+2009-10-11T09:24:45.635758Z
+2921
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+746
+
 jstoolbar-sr.js
 file
 
@@ -1046,40 +1080,6 @@
 
 912
 
-jstoolbar-da.js
-file
-
-
-
-
-2011-03-03T11:05:14.000000Z
-4061b38de5e085dac922f77f94bd254a
-2009-10-11T09:24:45.635758Z
-2921
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-746
-
 jstoolbar-pt-br.js
 file
 
@@ -1148,6 +1148,40 @@
 
 662
 
+jstoolbar-fa.js
+file
+
+
+
+
+2011-03-03T11:40:18.000000Z
+5fde8ac79f7084911ce37f5cdad2052e
+2011-02-21T10:08:59.720731Z
+4903
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+838
+
 jstoolbar-bg.js
 file
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/jstoolbar/lang/.svn/prop-base/jstoolbar-fa.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/jstoolbar/lang/.svn/text-base/jstoolbar-fa.js.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,16 @@
+jsToolBar.strings = {};
+jsToolBar.strings['Strong'] = 'پررنگ';
+jsToolBar.strings['Italic'] = 'کج';
+jsToolBar.strings['Underline'] = 'زیرخط';
+jsToolBar.strings['Deleted'] = 'برداشته شده';
+jsToolBar.strings['Code'] = 'کد درون خطی';
+jsToolBar.strings['Heading 1'] = 'سربرگ ۱';
+jsToolBar.strings['Heading 2'] = 'سربرگ ۲';
+jsToolBar.strings['Heading 3'] = 'سربرگ ۳';
+jsToolBar.strings['Unordered list'] = 'فهرست بدون شماره';
+jsToolBar.strings['Ordered list'] = 'فهرست با شماره';
+jsToolBar.strings['Quote'] = 'تو بردن';
+jsToolBar.strings['Unquote'] = 'بیرون آوردن';
+jsToolBar.strings['Preformatted text'] = 'نوشته قالب بندی شده';
+jsToolBar.strings['Wiki link'] = 'پیوند به برگ ویکی';
+jsToolBar.strings['Image'] = 'عکس';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/jstoolbar/lang/jstoolbar-fa.js	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,16 @@
+jsToolBar.strings = {};
+jsToolBar.strings['Strong'] = 'پررنگ';
+jsToolBar.strings['Italic'] = 'کج';
+jsToolBar.strings['Underline'] = 'زیرخط';
+jsToolBar.strings['Deleted'] = 'برداشته شده';
+jsToolBar.strings['Code'] = 'کد درون خطی';
+jsToolBar.strings['Heading 1'] = 'سربرگ ۱';
+jsToolBar.strings['Heading 2'] = 'سربرگ ۲';
+jsToolBar.strings['Heading 3'] = 'سربرگ ۳';
+jsToolBar.strings['Unordered list'] = 'فهرست بدون شماره';
+jsToolBar.strings['Ordered list'] = 'فهرست با شماره';
+jsToolBar.strings['Quote'] = 'تو بردن';
+jsToolBar.strings['Unquote'] = 'بیرون آوردن';
+jsToolBar.strings['Preformatted text'] = 'نوشته قالب بندی شده';
+jsToolBar.strings['Wiki link'] = 'پیوند به برگ ویکی';
+jsToolBar.strings['Image'] = 'عکس';
--- a/public/stylesheets/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/stylesheets/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 43
-/svn/!svn/ver/4782/trunk/public/stylesheets
+/svn/!svn/ver/4954/trunk/public/stylesheets
 END
 context_menu.css
 K 25
@@ -49,5 +49,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4782/trunk/public/stylesheets/application.css
+/svn/!svn/ver/4954/trunk/public/stylesheets/application.css
 END
--- a/public/stylesheets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/stylesheets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/stylesheets
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-30T09:09:50.276451Z
-4782
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 
 
@@ -270,10 +270,10 @@
 
 
 
-2011-03-03T11:05:23.000000Z
-b268a66dce14ef4250f269776b4ddcde
-2011-01-30T09:09:50.276451Z
-4782
+2011-03-03T11:40:18.000000Z
+1c8f6eb0fe9e3708adf095c11bc824bf
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -296,5 +296,5 @@
 
 
 
-35685
+35897
 
--- a/public/stylesheets/.svn/text-base/application.css.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/stylesheets/.svn/text-base/application.css.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -672,6 +672,13 @@
 .diff_out { background: #fcc; }
 .diff_in { background: #cfc; }
 
+.text-diff {
+padding: 1em;
+background-color:#f6f6f6;
+color:#505050;
+border: 1px solid #e4e4e4;
+}
+
 /***** Wiki *****/
 div.wiki table {
     border: 1px solid #505050;
@@ -783,6 +790,7 @@
 }
 
 .gantt_subjects { font-size: 0.8em; }
+.gantt_subjects div { line-height:1.2em;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
 
 .task {
   position: absolute;
--- a/public/stylesheets/application.css	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/stylesheets/application.css	Thu Mar 03 11:42:28 2011 +0000
@@ -672,6 +672,13 @@
 .diff_out { background: #fcc; }
 .diff_in { background: #cfc; }
 
+.text-diff {
+padding: 1em;
+background-color:#f6f6f6;
+color:#505050;
+border: 1px solid #e4e4e4;
+}
+
 /***** Wiki *****/
 div.wiki table {
     border: 1px solid #505050;
@@ -783,6 +790,7 @@
 }
 
 .gantt_subjects { font-size: 0.8em; }
+.gantt_subjects div { line-height:1.2em;height:16px;overflow:hidden;white-space:nowrap;text-overflow: ellipsis; }
 
 .task {
   position: absolute;
--- a/public/themes/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes
 http://redmine.rubyforge.org/svn
 
--- a/public/themes/alternate/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/alternate/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes/alternate
 http://redmine.rubyforge.org/svn
 
--- a/public/themes/alternate/stylesheets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/alternate/stylesheets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes/alternate/stylesheets
 http://redmine.rubyforge.org/svn
 
--- a/public/themes/classic/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/classic/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes/classic
 http://redmine.rubyforge.org/svn
 
--- a/public/themes/classic/images/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/classic/images/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes/classic/images
 http://redmine.rubyforge.org/svn
 
--- a/public/themes/classic/stylesheets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/public/themes/classic/stylesheets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/public/themes/classic/stylesheets
 http://redmine.rubyforge.org/svn
 
--- a/script/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/script/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/script
 http://redmine.rubyforge.org/svn
 
--- a/script/performance/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/script/performance/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/script/performance
 http://redmine.rubyforge.org/svn
 
--- a/script/process/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/script/process/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/script/process
 http://redmine.rubyforge.org/svn
 
--- a/test/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 29
-/svn/!svn/ver/4802/trunk/test
+/svn/!svn/ver/4991/trunk/test
 END
 object_daddy_helpers.rb
 K 25
--- a/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T03:35:13.139305Z
+4991
 tmaruyama
 
 
--- a/test/exemplars/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/exemplars/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/exemplars
 http://redmine.rubyforge.org/svn
 
@@ -774,6 +774,40 @@
 
 481
 
+member_role_exemplar.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+d1bdf1810c216ecde56d0750f78bea10
+2010-01-27T18:29:03.119133Z
+3340
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+250
+
 issue_exemplar.rb
 file
 
@@ -808,16 +842,16 @@
 
 449
 
-member_role_exemplar.rb
+tracker_exemplar.rb
 file
 
 
 
 
 2011-03-03T11:05:08.000000Z
-d1bdf1810c216ecde56d0750f78bea10
-2010-01-27T18:29:03.119133Z
-3340
+94aed9cd40bd95ab8d8c2f51bfc097cf
+2009-10-18T22:25:00.956502Z
+2930
 edavis10
 
 
@@ -840,7 +874,7 @@
 
 
 
-250
+179
 
 issue_status_exemplar.rb
 file
@@ -876,14 +910,14 @@
 
 182
 
-tracker_exemplar.rb
+time_entry_activity.rb
 file
 
 
 
 
 2011-03-03T11:05:08.000000Z
-94aed9cd40bd95ab8d8c2f51bfc097cf
+74f5207a054732dd9be1b3184340ca77
 2009-10-18T22:25:00.956502Z
 2930
 edavis10
@@ -908,7 +942,7 @@
 
 
 
-179
+236
 
 subversion_repository_exemplar.rb
 file
@@ -944,14 +978,14 @@
 
 235
 
-time_entry_activity.rb
+role_exemplar.rb
 file
 
 
 
 
 2011-03-03T11:05:08.000000Z
-74f5207a054732dd9be1b3184340ca77
+9c97ca570fa9b00ab1ecebd226f52f66
 2009-10-18T22:25:00.956502Z
 2930
 edavis10
@@ -976,7 +1010,7 @@
 
 
 
-236
+157
 
 changeset_exemplar.rb
 file
@@ -1012,40 +1046,6 @@
 
 377
 
-role_exemplar.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-9c97ca570fa9b00ab1ecebd226f52f66
-2009-10-18T22:25:00.956502Z
-2930
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-157
-
 comment_exemplar.rb
 file
 
--- a/test/fixtures/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,19 +1,19 @@
 K 25
 svn:wc:ra_dav:version-url
 V 38
-/svn/!svn/ver/4752/trunk/test/fixtures
+/svn/!svn/ver/4964/trunk/test/fixtures
 END
 journal_details.yml
 K 25
 svn:wc:ra_dav:version-url
 V 58
-/svn/!svn/ver/3123/trunk/test/fixtures/journal_details.yml
+/svn/!svn/ver/4954/trunk/test/fixtures/journal_details.yml
 END
 issue_statuses.yml
 K 25
 svn:wc:ra_dav:version-url
 V 57
-/svn/!svn/ver/2895/trunk/test/fixtures/issue_statuses.yml
+/svn/!svn/ver/4895/trunk/test/fixtures/issue_statuses.yml
 END
 changesets.yml
 K 25
@@ -105,17 +105,23 @@
 V 50
 /svn/!svn/ver/2895/trunk/test/fixtures/changes.yml
 END
+custom_fields_projects.yml
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/!svn/ver/3278/trunk/test/fixtures/custom_fields_projects.yml
+END
 enumerations.yml
 K 25
 svn:wc:ra_dav:version-url
 V 55
 /svn/!svn/ver/3573/trunk/test/fixtures/enumerations.yml
 END
-custom_fields_projects.yml
+member_roles.yml
 K 25
 svn:wc:ra_dav:version-url
-V 65
-/svn/!svn/ver/3278/trunk/test/fixtures/custom_fields_projects.yml
+V 55
+/svn/!svn/ver/3250/trunk/test/fixtures/member_roles.yml
 END
 issues.yml
 K 25
@@ -123,29 +129,29 @@
 V 49
 /svn/!svn/ver/4482/trunk/test/fixtures/issues.yml
 END
-member_roles.yml
-K 25
-svn:wc:ra_dav:version-url
-V 55
-/svn/!svn/ver/3250/trunk/test/fixtures/member_roles.yml
-END
 queries.yml
 K 25
 svn:wc:ra_dav:version-url
 V 50
 /svn/!svn/ver/3071/trunk/test/fixtures/queries.yml
 END
+watchers.yml
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/!svn/ver/2456/trunk/test/fixtures/watchers.yml
+END
 wiki_contents.yml
 K 25
 svn:wc:ra_dav:version-url
 V 56
 /svn/!svn/ver/4681/trunk/test/fixtures/wiki_contents.yml
 END
-watchers.yml
+enabled_modules.yml
 K 25
 svn:wc:ra_dav:version-url
-V 51
-/svn/!svn/ver/2456/trunk/test/fixtures/watchers.yml
+V 58
+/svn/!svn/ver/4505/trunk/test/fixtures/enabled_modules.yml
 END
 wiki_pages.yml
 K 25
@@ -153,11 +159,11 @@
 V 53
 /svn/!svn/ver/4680/trunk/test/fixtures/wiki_pages.yml
 END
-enabled_modules.yml
+wiki_content_versions.yml
 K 25
 svn:wc:ra_dav:version-url
-V 58
-/svn/!svn/ver/4505/trunk/test/fixtures/enabled_modules.yml
+V 64
+/svn/!svn/ver/2895/trunk/test/fixtures/wiki_content_versions.yml
 END
 comments.yml
 K 25
@@ -165,30 +171,24 @@
 V 51
 /svn/!svn/ver/2895/trunk/test/fixtures/comments.yml
 END
-wiki_content_versions.yml
-K 25
-svn:wc:ra_dav:version-url
-V 64
-/svn/!svn/ver/2895/trunk/test/fixtures/wiki_content_versions.yml
-END
 members.yml
 K 25
 svn:wc:ra_dav:version-url
 V 50
 /svn/!svn/ver/3250/trunk/test/fixtures/members.yml
 END
+workflows.yml
+K 25
+svn:wc:ra_dav:version-url
+V 52
+/svn/!svn/ver/2895/trunk/test/fixtures/workflows.yml
+END
 journals.yml
 K 25
 svn:wc:ra_dav:version-url
 V 51
 /svn/!svn/ver/3123/trunk/test/fixtures/journals.yml
 END
-workflows.yml
-K 25
-svn:wc:ra_dav:version-url
-V 52
-/svn/!svn/ver/2895/trunk/test/fixtures/workflows.yml
-END
 custom_fields.yml
 K 25
 svn:wc:ra_dav:version-url
@@ -199,7 +199,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 48
-/svn/!svn/ver/4216/trunk/test/fixtures/users.yml
+/svn/!svn/ver/4936/trunk/test/fixtures/users.yml
 END
 auth_sources.yml
 K 25
--- a/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-23T10:22:00.456857Z
-4752
-jplang
+2011-02-28T14:12:47.115180Z
+4964
+tmaruyama
 
 
 
@@ -35,10 +35,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-7f7308fa24fe8015418b4bf81a265389
-2009-12-06T10:28:20.099964Z
-3123
+2011-03-03T11:40:18.000000Z
+c85ec633618360a62da10b17100bbf56
+2011-02-27T13:34:41.060565Z
+4954
 jplang
 has-props
 
@@ -61,7 +61,7 @@
 
 
 
-359
+547
 
 ldap
 dir
@@ -72,10 +72,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-940bc0bea76bc76ba8ef1b224d744eee
-2009-09-20T14:06:57.257282Z
-2895
+2011-03-03T11:40:18.000000Z
+2d31c6b69ca13da5466d1600bae9a2fd
+2011-02-20T15:38:07.840581Z
+4895
 jplang
 has-props
 
@@ -98,7 +98,7 @@
 
 
 
-505
+589
 
 changesets.yml
 file
@@ -619,8 +619,39 @@
 
 377
 
-mailer
-dir
+custom_fields_projects.yml
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+c6789a99aba9f28cf1d31a36b36224c8
+2010-01-03T11:18:09.741250Z
+3278
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+71
 
 enumerations.yml
 file
@@ -656,16 +687,19 @@
 
 1391
 
-custom_fields_projects.yml
+mailer
+dir
+
+member_roles.yml
 file
 
 
 
 
 2011-03-03T11:05:09.000000Z
-c6789a99aba9f28cf1d31a36b36224c8
-2010-01-03T11:18:09.741250Z
-3278
+86387d627355e1debc04c364c29efe81
+2009-12-26T16:14:55.591181Z
+3250
 jplang
 has-props
 
@@ -688,7 +722,7 @@
 
 
 
-71
+692
 
 issues.yml
 file
@@ -724,40 +758,6 @@
 
 5656
 
-member_roles.yml
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-86387d627355e1debc04c364c29efe81
-2009-12-26T16:14:55.591181Z
-3250
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-692
-
 queries.yml
 file
 
@@ -792,6 +792,40 @@
 
 2345
 
+wiki_contents.yml
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+595d0f0964e3c3f8ce7edb4b07941ffa
+2011-01-10T19:45:20.108166Z
+4681
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1953
+
 watchers.yml
 file
 
@@ -826,40 +860,6 @@
 
 219
 
-wiki_contents.yml
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-595d0f0964e3c3f8ce7edb4b07941ffa
-2011-01-10T19:45:20.108166Z
-4681
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1953
-
 wiki_pages.yml
 file
 
@@ -1144,11 +1144,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-f590d477ec468a76d8d31d5ed99de0e6
-2010-09-28T18:22:00.231301Z
-4216
-edavis10
+2011-03-03T11:40:18.000000Z
+4bc8168f868eb01690365ddcb82e8841
+2011-02-23T17:27:31.762248Z
+4936
+jplang
 has-props
 
 
@@ -1170,7 +1170,7 @@
 
 
 
-3294
+3500
 
 auth_sources.yml
 file
--- a/test/fixtures/.svn/text-base/issue_statuses.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/.svn/text-base/issue_statuses.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,31 +1,37 @@
 --- 
+issue_statuses_001: 
+  id: 1
+  name: New
+  is_default: true
+  is_closed: false
+  position: 1
+issue_statuses_002: 
+  id: 2
+  name: Assigned
+  is_default: false
+  is_closed: false
+  position: 2
+issue_statuses_003: 
+  id: 3
+  name: Resolved
+  is_default: false
+  is_closed: false
+  position: 3
+issue_statuses_004: 
+  name: Feedback
+  id: 4
+  is_default: false
+  is_closed: false
+  position: 4
+issue_statuses_005: 
+  id: 5
+  name: Closed
+  is_default: false
+  is_closed: true
+  position: 5
 issue_statuses_006: 
+  id: 6
   name: Rejected
   is_default: false
   is_closed: true
-  id: 6
-issue_statuses_001: 
-  name: New
-  is_default: true
-  is_closed: false
-  id: 1
-issue_statuses_002: 
-  name: Assigned
-  is_default: false
-  is_closed: false
-  id: 2
-issue_statuses_003: 
-  name: Resolved
-  is_default: false
-  is_closed: false
-  id: 3
-issue_statuses_004: 
-  name: Feedback
-  is_default: false
-  is_closed: false
-  id: 4
-issue_statuses_005: 
-  name: Closed
-  is_default: false
-  is_closed: true
-  id: 5
+  position: 6
--- a/test/fixtures/.svn/text-base/journal_details.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/.svn/text-base/journal_details.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -20,3 +20,10 @@
   value: "6"
   prop_key: fixed_version_id
   journal_id: 4
+journal_details_004:
+  old_value: "This word was removed and an other was"
+  property: attr
+  id: 4
+  value: "This word was and an other was added"
+  prop_key: description
+  journal_id: 3
--- a/test/fixtures/.svn/text-base/users.yml.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/.svn/text-base/users.yml.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -4,7 +4,9 @@
   status: 1
   last_login_on: 
   language: en
-  hashed_password: 4e4aeb7baaf0706bd670263fef42dad15763b608
+  # password = foo
+  salt: 3126f764c3c5ac61cbfc103f25f934cf
+  hashed_password: 9e4dd7eeb172c12a0691a6d9d3a269f7e9fe671b
   updated_on: 2006-07-19 19:34:07 +02:00
   admin: false
   mail: rhill@somenet.foo
@@ -20,7 +22,9 @@
   status: 1
   last_login_on: 2006-07-19 22:57:52 +02:00
   language: en
-  hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
+  # password = admin
+  salt: 82090c953c4a0000a7db253b0691a6b4
+  hashed_password: b5b6ff9543bf1387374cdfa27a54c96d236a7150
   updated_on: 2006-07-19 22:57:52 +02:00
   admin: true
   mail: admin@somenet.foo
@@ -36,7 +40,9 @@
   status: 1
   last_login_on: 2006-07-19 22:42:15 +02:00
   language: en
-  hashed_password: a9a653d4151fa2c081ba1ffc2c2726f3b80b7d7d
+  # password = jsmith
+  salt: 67eb4732624d5a7753dcea7ce0bb7d7d
+  hashed_password: bfbe06043353a677d0215b26a5800d128d5413bc
   updated_on: 2006-07-19 22:42:15 +02:00
   admin: false
   mail: jsmith@somenet.foo
@@ -52,7 +58,9 @@
   status: 1
   last_login_on: 
   language: en
-  hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
+  # password = foo
+  salt: 7599f9963ec07b5a3b55b354407120c0
+  hashed_password: 8f659c8d7c072f189374edacfa90d6abbc26d8ed
   updated_on: 2006-07-19 19:33:19 +02:00
   admin: false
   mail: dlopper@somenet.foo
@@ -70,7 +78,7 @@
   status: 3
   last_login_on: 
   language: en
-  hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
+  hashed_password: 1
   updated_on: 2006-07-19 19:33:19 +02:00
   admin: false
   mail: dlopper2@somenet.foo
--- a/test/fixtures/configuration/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/configuration/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/configuration
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/diffs/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/diffs/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/diffs
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/encoding/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/encoding/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/encoding
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/files/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/files/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/files
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/issue_statuses.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/issue_statuses.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -1,31 +1,37 @@
 --- 
+issue_statuses_001: 
+  id: 1
+  name: New
+  is_default: true
+  is_closed: false
+  position: 1
+issue_statuses_002: 
+  id: 2
+  name: Assigned
+  is_default: false
+  is_closed: false
+  position: 2
+issue_statuses_003: 
+  id: 3
+  name: Resolved
+  is_default: false
+  is_closed: false
+  position: 3
+issue_statuses_004: 
+  name: Feedback
+  id: 4
+  is_default: false
+  is_closed: false
+  position: 4
+issue_statuses_005: 
+  id: 5
+  name: Closed
+  is_default: false
+  is_closed: true
+  position: 5
 issue_statuses_006: 
+  id: 6
   name: Rejected
   is_default: false
   is_closed: true
-  id: 6
-issue_statuses_001: 
-  name: New
-  is_default: true
-  is_closed: false
-  id: 1
-issue_statuses_002: 
-  name: Assigned
-  is_default: false
-  is_closed: false
-  id: 2
-issue_statuses_003: 
-  name: Resolved
-  is_default: false
-  is_closed: false
-  id: 3
-issue_statuses_004: 
-  name: Feedback
-  is_default: false
-  is_closed: false
-  id: 4
-issue_statuses_005: 
-  name: Closed
-  is_default: false
-  is_closed: true
-  id: 5
+  position: 6
--- a/test/fixtures/journal_details.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/journal_details.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -20,3 +20,10 @@
   value: "6"
   prop_key: fixed_version_id
   journal_id: 4
+journal_details_004:
+  old_value: "This word was removed and an other was"
+  property: attr
+  id: 4
+  value: "This word was and an other was added"
+  prop_key: description
+  journal_id: 3
--- a/test/fixtures/ldap/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/ldap/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/ldap
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/mail_handler/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/mail_handler/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/mail_handler
 http://redmine.rubyforge.org/svn
 
@@ -26,17 +26,18 @@
 
 e93f8b46-1217-0410-a6f0-8f06a7374b81
 
-issue_update_with_multiple_quoted_reply_above.eml
+ticket_html_only.eml
 file
 
 
 
 
 2011-03-03T11:05:09.000000Z
-ef4c0db9f76d81792292785d2ae9cb6a
-2010-11-02T19:00:31.177706Z
-4361
-edavis10
+5e24af78a4534798611158a3d81efb34
+2008-12-14T17:10:16.292262Z
+2136
+jplang
+has-props
 
 
 
@@ -57,8 +58,7 @@
 
 
 
-
-2018
+691
 
 message_reply_by_subject.eml
 file
@@ -94,18 +94,51 @@
 
 410
 
-ticket_html_only.eml
+issue_update_with_multiple_quoted_reply_above.eml
 file
 
 
 
 
 2011-03-03T11:05:09.000000Z
-5e24af78a4534798611158a3d81efb34
-2008-12-14T17:10:16.292262Z
-2136
+ef4c0db9f76d81792292785d2ae9cb6a
+2010-11-02T19:00:31.177706Z
+4361
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2018
+
+ticket_with_localized_attributes.eml
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+8ac895d880e6f19fc21333c4003babaf
+2010-11-12T12:29:35.878777Z
+4395
 jplang
-has-props
 
 
 
@@ -126,7 +159,8 @@
 
 
 
-691
+
+1944
 
 ticket_with_spaces_between_attribute_and_separator.eml
 file
@@ -162,40 +196,6 @@
 
 1903
 
-ticket_with_localized_attributes.eml
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-8ac895d880e6f19fc21333c4003babaf
-2010-11-12T12:29:35.878777Z
-4395
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1944
-
 ticket_with_long_subject.eml
 file
 
@@ -434,6 +434,40 @@
 
 485
 
+ticket_by_unknown_user.eml
+file
+
+
+
+
+2011-03-03T11:05:09.000000Z
+0979c01baf02b924bd8a6db3980c59c9
+2009-06-14T14:48:34.287541Z
+2789
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+526
+
 ticket_with_invalid_attributes.eml
 file
 
@@ -468,40 +502,6 @@
 
 2028
 
-ticket_by_unknown_user.eml
-file
-
-
-
-
-2011-03-03T11:05:09.000000Z
-0979c01baf02b924bd8a6db3980c59c9
-2009-06-14T14:48:34.287541Z
-2789
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-526
-
 ticket_reply_with_status.eml
 file
 
--- a/test/fixtures/mailer/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/mailer/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/mailer
 http://redmine.rubyforge.org/svn
 
--- a/test/fixtures/repositories/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/repositories/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 51
-/svn/!svn/ver/4676/trunk/test/fixtures/repositories
+/svn/!svn/ver/4964/trunk/test/fixtures/repositories
 END
 darcs_repository.tar.gz
 K 25
@@ -31,7 +31,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 73
-/svn/!svn/ver/4310/trunk/test/fixtures/repositories/git_repository.tar.gz
+/svn/!svn/ver/4964/trunk/test/fixtures/repositories/git_repository.tar.gz
 END
 filesystem_repository.tar.gz
 K 25
--- a/test/fixtures/repositories/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/repositories/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/fixtures/repositories
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-10T17:43:01.353336Z
-4676
-jplang
+2011-02-28T14:12:47.115180Z
+4964
+tmaruyama
 
 
 
@@ -168,11 +168,11 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-300e21b10239e2fa28df3111924b8328
-2010-10-29T23:21:57.240368Z
-4310
-jbbarth
+2011-03-03T11:40:18.000000Z
+a520f027eaf4a4548dfbc85e8d7e71c5
+2011-02-28T14:12:47.115180Z
+4964
+tmaruyama
 has-props
 
 
@@ -194,7 +194,7 @@
 
 
 
-20730
+15432
 
 filesystem_repository.tar.gz
 file
Binary file test/fixtures/repositories/.svn/text-base/git_repository.tar.gz.svn-base has changed
Binary file test/fixtures/repositories/git_repository.tar.gz has changed
--- a/test/fixtures/users.yml	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/fixtures/users.yml	Thu Mar 03 11:42:28 2011 +0000
@@ -4,7 +4,9 @@
   status: 1
   last_login_on: 
   language: en
-  hashed_password: 4e4aeb7baaf0706bd670263fef42dad15763b608
+  # password = foo
+  salt: 3126f764c3c5ac61cbfc103f25f934cf
+  hashed_password: 9e4dd7eeb172c12a0691a6d9d3a269f7e9fe671b
   updated_on: 2006-07-19 19:34:07 +02:00
   admin: false
   mail: rhill@somenet.foo
@@ -20,7 +22,9 @@
   status: 1
   last_login_on: 2006-07-19 22:57:52 +02:00
   language: en
-  hashed_password: d033e22ae348aeb5660fc2140aec35850c4da997
+  # password = admin
+  salt: 82090c953c4a0000a7db253b0691a6b4
+  hashed_password: b5b6ff9543bf1387374cdfa27a54c96d236a7150
   updated_on: 2006-07-19 22:57:52 +02:00
   admin: true
   mail: admin@somenet.foo
@@ -36,7 +40,9 @@
   status: 1
   last_login_on: 2006-07-19 22:42:15 +02:00
   language: en
-  hashed_password: a9a653d4151fa2c081ba1ffc2c2726f3b80b7d7d
+  # password = jsmith
+  salt: 67eb4732624d5a7753dcea7ce0bb7d7d
+  hashed_password: bfbe06043353a677d0215b26a5800d128d5413bc
   updated_on: 2006-07-19 22:42:15 +02:00
   admin: false
   mail: jsmith@somenet.foo
@@ -52,7 +58,9 @@
   status: 1
   last_login_on: 
   language: en
-  hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
+  # password = foo
+  salt: 7599f9963ec07b5a3b55b354407120c0
+  hashed_password: 8f659c8d7c072f189374edacfa90d6abbc26d8ed
   updated_on: 2006-07-19 19:33:19 +02:00
   admin: false
   mail: dlopper@somenet.foo
@@ -70,7 +78,7 @@
   status: 3
   last_login_on: 
   language: en
-  hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
+  hashed_password: 1
   updated_on: 2006-07-19 19:33:19 +02:00
   admin: false
   mail: dlopper2@somenet.foo
--- a/test/functional/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 40
-/svn/!svn/ver/4789/trunk/test/functional
+/svn/!svn/ver/4982/trunk/test/functional
 END
 issues_controller_test.rb
 K 25
@@ -79,7 +79,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 67
-/svn/!svn/ver/4509/trunk/test/functional/welcome_controller_test.rb
+/svn/!svn/ver/4900/trunk/test/functional/welcome_controller_test.rb
 END
 account_controller_test.rb
 K 25
@@ -93,11 +93,11 @@
 V 69
 /svn/!svn/ver/4509/trunk/test/functional/calendars_controller_test.rb
 END
-workflows_controller_test.rb
+journals_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 69
-/svn/!svn/ver/4509/trunk/test/functional/workflows_controller_test.rb
+V 68
+/svn/!svn/ver/4954/trunk/test/functional/journals_controller_test.rb
 END
 time_entry_reports_controller_test.rb
 K 25
@@ -105,11 +105,11 @@
 V 78
 /svn/!svn/ver/4509/trunk/test/functional/time_entry_reports_controller_test.rb
 END
-journals_controller_test.rb
+workflows_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/4535/trunk/test/functional/journals_controller_test.rb
+V 69
+/svn/!svn/ver/4895/trunk/test/functional/workflows_controller_test.rb
 END
 project_enumerations_controller_test.rb
 K 25
@@ -123,23 +123,23 @@
 V 66
 /svn/!svn/ver/4509/trunk/test/functional/gantts_controller_test.rb
 END
+issue_moves_controller_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/!svn/ver/4509/trunk/test/functional/issue_moves_controller_test.rb
+END
 users_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 65
 /svn/!svn/ver/4729/trunk/test/functional/users_controller_test.rb
 END
-issue_moves_controller_test.rb
-K 25
-svn:wc:ra_dav:version-url
-V 71
-/svn/!svn/ver/4509/trunk/test/functional/issue_moves_controller_test.rb
-END
 repositories_cvs_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 76
-/svn/!svn/ver/4789/trunk/test/functional/repositories_cvs_controller_test.rb
+/svn/!svn/ver/4982/trunk/test/functional/repositories_cvs_controller_test.rb
 END
 application_controller_test.rb
 K 25
@@ -153,29 +153,29 @@
 V 70
 /svn/!svn/ver/4509/trunk/test/functional/activities_controller_test.rb
 END
+ldap_auth_sources_controller.rb
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/!svn/ver/3744/trunk/test/functional/ldap_auth_sources_controller.rb
+END
 search_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 66
 /svn/!svn/ver/4509/trunk/test/functional/search_controller_test.rb
 END
-ldap_auth_sources_controller.rb
+messages_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 72
-/svn/!svn/ver/3744/trunk/test/functional/ldap_auth_sources_controller.rb
+V 68
+/svn/!svn/ver/4509/trunk/test/functional/messages_controller_test.rb
 END
 repositories_bazaar_controller_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 79
-/svn/!svn/ver/4509/trunk/test/functional/repositories_bazaar_controller_test.rb
-END
-messages_controller_test.rb
-K 25
-svn:wc:ra_dav:version-url
-V 68
-/svn/!svn/ver/4509/trunk/test/functional/messages_controller_test.rb
+/svn/!svn/ver/4982/trunk/test/functional/repositories_bazaar_controller_test.rb
 END
 attachments_controller_test.rb
 K 25
@@ -241,7 +241,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 82
-/svn/!svn/ver/4734/trunk/test/functional/repositories_mercurial_controller_test.rb
+/svn/!svn/ver/4855/trunk/test/functional/repositories_mercurial_controller_test.rb
 END
 issue_categories_controller_test.rb
 K 25
@@ -289,7 +289,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 78
-/svn/!svn/ver/4509/trunk/test/functional/repositories_darcs_controller_test.rb
+/svn/!svn/ver/4982/trunk/test/functional/repositories_darcs_controller_test.rb
 END
 wiki_controller_test.rb
 K 25
@@ -313,7 +313,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 83
-/svn/!svn/ver/4734/trunk/test/functional/repositories_subversion_controller_test.rb
+/svn/!svn/ver/4896/trunk/test/functional/repositories_subversion_controller_test.rb
 END
 issue_relations_controller_test.rb
 K 25
--- a/test/functional/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/functional
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-02T04:00:59.430633Z
-4789
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 
 
@@ -440,11 +440,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-bf75948e1edceb4241e67a84731477f6
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+99cada623881a6be69cdf13119cc1de7
+2011-02-21T09:53:29.844413Z
+4900
+jplang
 has-props
 
 
@@ -466,7 +466,7 @@
 
 
 
-2379
+3015
 
 account_controller_test.rb
 file
@@ -536,17 +536,17 @@
 
 2390
 
-workflows_controller_test.rb
+journals_controller_test.rb
 file
 
 
 
 
-2011-03-03T11:05:21.000000Z
-e99e1deab48be8515101e664af4d55da
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+aa7254e0715b3701554945deb5d98998
+2011-02-27T13:34:41.060565Z
+4954
+jplang
 has-props
 
 
@@ -568,7 +568,7 @@
 
 
 
-6673
+3099
 
 time_entry_reports_controller_test.rb
 file
@@ -604,16 +604,16 @@
 
 5424
 
-journals_controller_test.rb
+workflows_controller_test.rb
 file
 
 
 
 
-2011-03-03T11:05:21.000000Z
-04e54620db6899c02b7e7a9e2645d0a6
-2010-12-18T17:11:41.680297Z
-4535
+2011-03-03T11:40:17.000000Z
+843e1eb3b5d05f3cb16580fe88d1baf5
+2011-02-20T15:38:07.840581Z
+4895
 jplang
 has-props
 
@@ -636,7 +636,7 @@
 
 
 
-2783
+7860
 
 project_enumerations_controller_test.rb
 file
@@ -706,6 +706,40 @@
 
 2663
 
+issue_moves_controller_test.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+539d0852190ec556b2284bfe678e8523
+2010-12-12T23:24:34.194336Z
+4509
+jbbarth
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5131
+
 users_controller_test.rb
 file
 
@@ -740,50 +774,16 @@
 
 9068
 
-issue_moves_controller_test.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-539d0852190ec556b2284bfe678e8523
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-5131
-
 repositories_cvs_controller_test.rb
 file
 
 
 
 
-2011-03-03T11:05:21.000000Z
-26f60b5f3d2e68d920232c353f12b65a
-2011-02-02T04:00:59.430633Z
-4789
+2011-03-03T11:40:17.000000Z
+1802113ecf354a24583d7c5a8db750b6
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -806,7 +806,7 @@
 
 
 
-7278
+8336
 
 application_controller_test.rb
 file
@@ -876,6 +876,40 @@
 
 2700
 
+ldap_auth_sources_controller.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+d6759c42ae866d7210c7006911e82a42
+2010-05-23T03:16:31.304135Z
+3744
+edavis10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+491
+
 search_controller_test.rb
 file
 
@@ -910,74 +944,6 @@
 
 4680
 
-ldap_auth_sources_controller.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-d6759c42ae866d7210c7006911e82a42
-2010-05-23T03:16:31.304135Z
-3744
-edavis10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-491
-
-repositories_bazaar_controller_test.rb
-file
-
-
-
-
-2011-03-03T11:05:21.000000Z
-c7a720bd5851fd9afe177432179cd921
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-5059
-
 messages_controller_test.rb
 file
 
@@ -1012,6 +978,40 @@
 
 5047
 
+repositories_bazaar_controller_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+138b8dc8d1e30b2a8f5eda76b0f905b6
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5177
+
 attachments_controller_test.rb
 file
 
@@ -1358,10 +1358,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-1d9186fe92df47aa23044dfd4c3918fe
-2011-01-21T13:22:28.782688Z
-4734
+2011-03-03T11:40:17.000000Z
+c737d31340fe167746054c6975d86b18
+2011-02-16T11:18:18.909794Z
+4855
 tmaruyama
 has-props
 
@@ -1384,7 +1384,7 @@
 
 
 
-7928
+7919
 
 issue_categories_controller_test.rb
 file
@@ -1630,11 +1630,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-ac4fd4943d72406872230aa7bad0213c
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+a05a557c98b400ffe59662be78e31270
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
 has-props
 
 
@@ -1656,7 +1656,7 @@
 
 
 
-3844
+4268
 
 wiki_controller_test.rb
 file
@@ -1766,10 +1766,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-02daab0293ddc35afa4322963b564ce4
-2011-01-21T13:22:28.782688Z
-4734
+2011-03-03T11:40:17.000000Z
+d6a450e274753a0903a76b51c16eae7b
+2011-02-21T03:59:30.193463Z
+4896
 tmaruyama
 has-props
 
@@ -1792,7 +1792,7 @@
 
 
 
-9525
+11247
 
 issue_relations_controller_test.rb
 file
--- a/test/functional/.svn/text-base/journals_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/journals_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -38,6 +38,19 @@
     assert_equal 'application/atom+xml', @response.content_type
   end
   
+  def test_diff
+    get :diff, :id => 3, :detail_id => 4
+    assert_response :success
+    assert_template 'diff'
+    
+    assert_tag 'span',
+      :attributes => {:class => 'diff_out'},
+      :content => /removed/
+    assert_tag 'span',
+      :attributes => {:class => 'diff_in'},
+      :content => /added/
+  end
+  
   def test_reply_to_issue
     @request.session[:user_id] = 2
     get :new, :id => 6
--- a/test/functional/.svn/text-base/repositories_bazaar_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/repositories_bazaar_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -32,9 +32,13 @@
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     User.current = nil
-    Repository::Bazaar.create(:project => Project.find(3), :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Bazaar.create(
+                    :project => @project, :url => REPOSITORY_PATH,
+                    :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)
     def test_show
       get :show, :id => 3
@@ -43,7 +47,7 @@
       assert_not_nil assigns(:entries)
       assert_not_nil assigns(:changesets)
     end
-    
+
     def test_browse_root
       get :show, :id => 3
       assert_response :success
@@ -53,7 +57,7 @@
       assert assigns(:entries).detect {|e| e.name == 'directory' && e.kind == 'dir'}
       assert assigns(:entries).detect {|e| e.name == 'doc-mkdir.txt' && e.kind == 'file'}
     end
-    
+
     def test_browse_directory
       get :show, :id => 3, :path => ['directory']
       assert_response :success
--- a/test/functional/.svn/text-base/repositories_cvs_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/repositories_cvs_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -41,7 +41,8 @@
     @project = Project.find(PRJ_ID)
     @repository  = Repository::Cvs.create(:project => Project.find(PRJ_ID),
                                           :root_url => REPOSITORY_PATH,
-                                          :url => MODULE_NAME)
+                                          :url => MODULE_NAME,
+                                          :log_encoding => 'UTF-8')
     assert @repository
   end
   
@@ -154,6 +155,24 @@
       assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' },
                                :content => /watched.remove_all_watcher/
     end
+                               
+    def test_diff_new_files
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 1, :type => 'inline'
+      assert_response :success
+      assert_template 'diff'
+      assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' },
+                               :content => /watched.remove_watcher/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/README/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/images\/delete.png	/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/images\/edit.png/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/sources\/watchers_controller.rb/                        
+    end
 
     def test_annotate
       @repository.fetch_changesets
--- a/test/functional/.svn/text-base/repositories_darcs_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/repositories_darcs_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -26,26 +26,35 @@
 
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
+  PRJ_ID = 3
 
   def setup
     @controller = RepositoriesController.new
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     User.current = nil
-    Repository::Darcs.create(:project => Project.find(3), :url => REPOSITORY_PATH)
+    @project = Project.find(PRJ_ID)
+    @repository = Repository::Darcs.create(
+                        :project => @project, :url => REPOSITORY_PATH,
+                        :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)
     def test_show
-      get :show, :id => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
       assert_not_nil assigns(:changesets)
     end
-    
+
     def test_browse_root
-      get :show, :id => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -54,9 +63,11 @@
       assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
       assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
     end
-    
+
     def test_browse_directory
-      get :show, :id => 3, :path => ['images']
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['images']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -66,27 +77,31 @@
       assert_equal 'file', entry.kind
       assert_equal 'images/edit.png', entry.path
     end
-    
+
     def test_browse_at_given_revision
-      Project.find(3).repository.fetch_changesets
-      get :show, :id => 3, :path => ['images'], :rev => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['images'], :rev => 1
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
       assert_equal ['delete.png'], assigns(:entries).collect(&:name)
     end
-    
+
     def test_changes
-      get :changes, :id => 3, :path => ['images', 'edit.png']
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['images', 'edit.png']
       assert_response :success
       assert_template 'changes'
       assert_tag :tag => 'h2', :content => 'edit.png'
     end
-  
+
     def test_diff
-      Project.find(3).repository.fetch_changesets
+      @repository.fetch_changesets
+      @repository.reload
       # Full diff of changeset 5
-      get :diff, :id => 3, :rev => 5
+      get :diff, :id => PRJ_ID, :rev => 5
       assert_response :success
       assert_template 'diff'
       # Line 22 removed
--- a/test/functional/.svn/text-base/repositories_mercurial_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/repositories_mercurial_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -34,6 +34,7 @@
     User.current = nil
     @repository = Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH)
     assert @repository
+    @diff_c_support = true
   end
 
   if File.directory?(REPOSITORY_PATH)
@@ -137,7 +138,7 @@
         assert_response :success
         assert_template 'diff'
 
-        if @repository.scm.class.client_version_above?([1, 2])
+        if @diff_c_support
           # Line 22 removed
           assert_tag :tag => 'th',
                      :content => '22',
--- a/test/functional/.svn/text-base/repositories_subversion_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/repositories_subversion_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -26,17 +26,26 @@
            :repositories, :issues, :issue_statuses, :changesets, :changes,
            :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
 
+  PRJ_ID = 3
+
   def setup
     @controller = RepositoriesController.new
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     Setting.default_language = 'en'
     User.current = nil
+
+    @project = Project.find(PRJ_ID)
+    @repository = Repository::Subversion.create(:project => @project,
+               :url => "file://#{self.class.repository_path('subversion')}")
+    assert @repository
   end
 
   if repository_configured?('subversion')
     def test_show
-      get :show, :id => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -44,7 +53,9 @@
     end
     
     def test_browse_root
-      get :show, :id => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -53,7 +64,9 @@
     end
     
     def test_browse_directory
-      get :show, :id => 1, :path => ['subversion_test']
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['subversion_test']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -65,7 +78,9 @@
     end
 
     def test_browse_at_given_revision
-      get :show, :id => 1, :path => ['subversion_test'], :rev => 4
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['subversion_test'], :rev => 4
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -73,7 +88,9 @@
     end
     
     def test_file_changes
-      get :changes, :id => 1, :path => ['subversion_test', 'folder', 'helloworld.rb' ]
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder', 'helloworld.rb' ]
       assert_response :success
       assert_template 'changes'
       
@@ -93,7 +110,9 @@
     end
 
     def test_directory_changes
-      get :changes, :id => 1, :path => ['subversion_test', 'folder' ]
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder' ]
       assert_response :success
       assert_template 'changes'
       
@@ -103,15 +122,19 @@
     end
       
     def test_entry
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'entry'
     end
       
     def test_entry_should_send_if_too_big
+      @repository.fetch_changesets
+      @repository.reload
       # no files in the test repo is larger than 1KB...
       with_settings :file_max_size_displayed => 0 do
-        get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c']
+        get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
         assert_response :success
         assert_template ''
         assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition']
@@ -119,7 +142,9 @@
     end
     
     def test_entry_at_given_revision
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.rb'], :rev => 2
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.rb'], :rev => 2
       assert_response :success
       assert_template 'entry'
       # this line was removed in r3 and file was moved in r6
@@ -128,27 +153,36 @@
     end
     
     def test_entry_not_found
-      get :entry, :id => 1, :path => ['subversion_test', 'zzz.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'zzz.c']
       assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
                                 :content => /The entry or revision was not found in the repository/
     end
   
     def test_entry_download
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c'], :format => 'raw'
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c'], :format => 'raw'
       assert_response :success
       assert_template ''
       assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition']
     end
     
     def test_directory_entry
-      get :entry, :id => 1, :path => ['subversion_test', 'folder']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'folder']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entry)
       assert_equal 'folder', assigns(:entry).name
     end
     
+    # TODO: this test needs fixtures.
     def test_revision
+      @repository.fetch_changesets
+      @repository.reload
       get :revision, :id => 1, :rev => 2
       assert_response :success
       assert_template 'revision'
@@ -167,19 +201,30 @@
     end
     
     def test_invalid_revision
-      get :revision, :id => 1, :rev => 'something_weird'
+      @repository.fetch_changesets
+      @repository.reload
+      get :revision, :id => PRJ_ID, :rev => 'something_weird'
+      assert_response 404
+      assert_error_tag :content => /was not found/
+    end
+
+    def test_invalid_revision_diff
+      get :diff, :id => PRJ_ID, :rev => '1', :rev_to => 'something_weird'
       assert_response 404
       assert_error_tag :content => /was not found/
     end
 
     def test_empty_revision
+      @repository.fetch_changesets
+      @repository.reload
       ['', ' ', nil].each do |r|
-        get :revision, :id => 1, :rev => r
+        get :revision, :id => PRJ_ID, :rev => r
         assert_response 404
         assert_error_tag :content => /was not found/
       end
     end
 
+    # TODO: this test needs fixtures.
     def test_revision_with_repository_pointing_to_a_subdirectory
       r = Project.find(1).repository
       # Changes repository url to a subdirectory
@@ -203,7 +248,9 @@
     end
     
     def test_revision_diff
-      get :diff, :id => 1, :rev => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 3
       assert_response :success
       assert_template 'diff'
 
@@ -211,7 +258,9 @@
     end
 
     def test_directory_diff
-      get :diff, :id => 1, :rev => 6, :rev_to => 2, :path => ['subversion_test', 'folder']
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 6, :rev_to => 2, :path => ['subversion_test', 'folder']
       assert_response :success
       assert_template 'diff'
       
@@ -224,13 +273,17 @@
     end
     
     def test_annotate
-      get :annotate, :id => 1, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :annotate, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'annotate'
     end
 
     def test_annotate_at_given_revision
-      get :annotate, :id => 1, :rev => 8, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :annotate, :id => PRJ_ID, :rev => 8, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'annotate'
       assert_tag :tag => 'h2', :content => /@ 8/
--- a/test/functional/.svn/text-base/welcome_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/welcome_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -67,4 +67,28 @@
     assert_equal 'text/plain', @response.content_type
     assert @response.body.match(%r{^Disallow: /projects/ecookbook/issues\r?$})
   end
+  
+  def test_warn_on_leaving_unsaved_turn_on
+    user = User.find(2)
+    user.pref.warn_on_leaving_unsaved = '1'
+    user.pref.save!
+    @request.session[:user_id] = 2
+    
+    get :index
+    assert_tag 'script',
+      :attributes => {:type => "text/javascript"},
+      :content => %r{new WarnLeavingUnsaved}
+  end
+  
+  def test_warn_on_leaving_unsaved_turn_off
+    user = User.find(2)
+    user.pref.warn_on_leaving_unsaved = '0'
+    user.pref.save!
+    @request.session[:user_id] = 2
+    
+    get :index
+    assert_no_tag 'script',
+      :attributes => {:type => "text/javascript"},
+      :content => %r{new WarnLeavingUnsaved}
+  end
 end
--- a/test/functional/.svn/text-base/workflows_controller_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/.svn/text-base/workflows_controller_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -65,17 +65,17 @@
     
     # allowed transitions
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[3][]',
-                                                 :value => '5',
+                                                 :name => 'issue_status[3][5][]',
+                                                 :value => 'always',
                                                  :checked => 'checked' }
     # not allowed
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[3][]',
-                                                 :value => '2',
+                                                 :name => 'issue_status[3][2][]',
+                                                 :value => 'always',
                                                  :checked => nil }
     # unused
     assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                    :name => 'issue_status[4][]' }
+                                                    :name => 'issue_status[1][1][]' }
   end
   
   def test_get_edit_with_role_and_tracker_and_all_statuses
@@ -89,13 +89,17 @@
     assert_equal IssueStatus.count, assigns(:statuses).size
     
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[1][]',
-                                                 :value => '1',
+                                                 :name => 'issue_status[1][1][]',
+                                                 :value => 'always',
                                                  :checked => nil }
   end
   
   def test_post_edit
-    post :edit, :role_id => 2, :tracker_id => 1, :issue_status => {'4' => ['5'], '3' => ['1', '2']}
+    post :edit, :role_id => 2, :tracker_id => 1,
+      :issue_status => {
+        '4' => {'5' => ['always']},
+        '3' => {'1' => ['always'], '2' => ['always']}
+      }
     assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1'
     
     assert_equal 3, Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2})
@@ -103,6 +107,30 @@
     assert_nil      Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4})
   end
   
+  def test_post_edit_with_additional_transitions
+    post :edit, :role_id => 2, :tracker_id => 1,
+      :issue_status => {
+        '4' => {'5' => ['always']},
+        '3' => {'1' => ['author'], '2' => ['assignee'], '4' => ['author', 'assignee']}
+      }
+    assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1'
+    
+    assert_equal 4, Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2})
+    
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 4, :new_status_id => 5})
+    assert ! w.author
+    assert ! w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 1})
+    assert w.author
+    assert ! w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2})
+    assert ! w.author
+    assert w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 4})
+    assert w.author
+    assert w.assignee
+  end
+  
   def test_clear_workflow
     assert Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2}) > 0
 
--- a/test/functional/journals_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/journals_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -38,6 +38,19 @@
     assert_equal 'application/atom+xml', @response.content_type
   end
   
+  def test_diff
+    get :diff, :id => 3, :detail_id => 4
+    assert_response :success
+    assert_template 'diff'
+    
+    assert_tag 'span',
+      :attributes => {:class => 'diff_out'},
+      :content => /removed/
+    assert_tag 'span',
+      :attributes => {:class => 'diff_in'},
+      :content => /added/
+  end
+  
   def test_reply_to_issue
     @request.session[:user_id] = 2
     get :new, :id => 6
--- a/test/functional/repositories_bazaar_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/repositories_bazaar_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -32,9 +32,13 @@
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     User.current = nil
-    Repository::Bazaar.create(:project => Project.find(3), :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Bazaar.create(
+                    :project => @project, :url => REPOSITORY_PATH,
+                    :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)
     def test_show
       get :show, :id => 3
@@ -43,7 +47,7 @@
       assert_not_nil assigns(:entries)
       assert_not_nil assigns(:changesets)
     end
-    
+
     def test_browse_root
       get :show, :id => 3
       assert_response :success
@@ -53,7 +57,7 @@
       assert assigns(:entries).detect {|e| e.name == 'directory' && e.kind == 'dir'}
       assert assigns(:entries).detect {|e| e.name == 'doc-mkdir.txt' && e.kind == 'file'}
     end
-    
+
     def test_browse_directory
       get :show, :id => 3, :path => ['directory']
       assert_response :success
--- a/test/functional/repositories_cvs_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/repositories_cvs_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -41,7 +41,8 @@
     @project = Project.find(PRJ_ID)
     @repository  = Repository::Cvs.create(:project => Project.find(PRJ_ID),
                                           :root_url => REPOSITORY_PATH,
-                                          :url => MODULE_NAME)
+                                          :url => MODULE_NAME,
+                                          :log_encoding => 'UTF-8')
     assert @repository
   end
   
@@ -154,6 +155,24 @@
       assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' },
                                :content => /watched.remove_all_watcher/
     end
+                               
+    def test_diff_new_files
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 1, :type => 'inline'
+      assert_response :success
+      assert_template 'diff'
+      assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' },
+                               :content => /watched.remove_watcher/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/README/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/images\/delete.png	/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/images\/edit.png/
+      assert_tag :tag => 'th', :attributes => { :class => 'filename' },
+                               :content => /test\/sources\/watchers_controller.rb/                        
+    end
 
     def test_annotate
       @repository.fetch_changesets
--- a/test/functional/repositories_darcs_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/repositories_darcs_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -26,26 +26,35 @@
 
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
+  PRJ_ID = 3
 
   def setup
     @controller = RepositoriesController.new
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     User.current = nil
-    Repository::Darcs.create(:project => Project.find(3), :url => REPOSITORY_PATH)
+    @project = Project.find(PRJ_ID)
+    @repository = Repository::Darcs.create(
+                        :project => @project, :url => REPOSITORY_PATH,
+                        :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)
     def test_show
-      get :show, :id => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
       assert_not_nil assigns(:changesets)
     end
-    
+
     def test_browse_root
-      get :show, :id => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -54,9 +63,11 @@
       assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
       assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
     end
-    
+
     def test_browse_directory
-      get :show, :id => 3, :path => ['images']
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['images']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -66,27 +77,31 @@
       assert_equal 'file', entry.kind
       assert_equal 'images/edit.png', entry.path
     end
-    
+
     def test_browse_at_given_revision
-      Project.find(3).repository.fetch_changesets
-      get :show, :id => 3, :path => ['images'], :rev => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['images'], :rev => 1
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
       assert_equal ['delete.png'], assigns(:entries).collect(&:name)
     end
-    
+
     def test_changes
-      get :changes, :id => 3, :path => ['images', 'edit.png']
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['images', 'edit.png']
       assert_response :success
       assert_template 'changes'
       assert_tag :tag => 'h2', :content => 'edit.png'
     end
-  
+
     def test_diff
-      Project.find(3).repository.fetch_changesets
+      @repository.fetch_changesets
+      @repository.reload
       # Full diff of changeset 5
-      get :diff, :id => 3, :rev => 5
+      get :diff, :id => PRJ_ID, :rev => 5
       assert_response :success
       assert_template 'diff'
       # Line 22 removed
--- a/test/functional/repositories_mercurial_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/repositories_mercurial_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -34,6 +34,7 @@
     User.current = nil
     @repository = Repository::Mercurial.create(:project => Project.find(3), :url => REPOSITORY_PATH)
     assert @repository
+    @diff_c_support = true
   end
 
   if File.directory?(REPOSITORY_PATH)
@@ -137,7 +138,7 @@
         assert_response :success
         assert_template 'diff'
 
-        if @repository.scm.class.client_version_above?([1, 2])
+        if @diff_c_support
           # Line 22 removed
           assert_tag :tag => 'th',
                      :content => '22',
--- a/test/functional/repositories_subversion_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/repositories_subversion_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -26,17 +26,26 @@
            :repositories, :issues, :issue_statuses, :changesets, :changes,
            :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
 
+  PRJ_ID = 3
+
   def setup
     @controller = RepositoriesController.new
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
     Setting.default_language = 'en'
     User.current = nil
+
+    @project = Project.find(PRJ_ID)
+    @repository = Repository::Subversion.create(:project => @project,
+               :url => "file://#{self.class.repository_path('subversion')}")
+    assert @repository
   end
 
   if repository_configured?('subversion')
     def test_show
-      get :show, :id => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -44,7 +53,9 @@
     end
     
     def test_browse_root
-      get :show, :id => 1
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -53,7 +64,9 @@
     end
     
     def test_browse_directory
-      get :show, :id => 1, :path => ['subversion_test']
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['subversion_test']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -65,7 +78,9 @@
     end
 
     def test_browse_at_given_revision
-      get :show, :id => 1, :path => ['subversion_test'], :rev => 4
+      @repository.fetch_changesets
+      @repository.reload
+      get :show, :id => PRJ_ID, :path => ['subversion_test'], :rev => 4
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -73,7 +88,9 @@
     end
     
     def test_file_changes
-      get :changes, :id => 1, :path => ['subversion_test', 'folder', 'helloworld.rb' ]
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder', 'helloworld.rb' ]
       assert_response :success
       assert_template 'changes'
       
@@ -93,7 +110,9 @@
     end
 
     def test_directory_changes
-      get :changes, :id => 1, :path => ['subversion_test', 'folder' ]
+      @repository.fetch_changesets
+      @repository.reload
+      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder' ]
       assert_response :success
       assert_template 'changes'
       
@@ -103,15 +122,19 @@
     end
       
     def test_entry
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'entry'
     end
       
     def test_entry_should_send_if_too_big
+      @repository.fetch_changesets
+      @repository.reload
       # no files in the test repo is larger than 1KB...
       with_settings :file_max_size_displayed => 0 do
-        get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c']
+        get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
         assert_response :success
         assert_template ''
         assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition']
@@ -119,7 +142,9 @@
     end
     
     def test_entry_at_given_revision
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.rb'], :rev => 2
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.rb'], :rev => 2
       assert_response :success
       assert_template 'entry'
       # this line was removed in r3 and file was moved in r6
@@ -128,27 +153,36 @@
     end
     
     def test_entry_not_found
-      get :entry, :id => 1, :path => ['subversion_test', 'zzz.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'zzz.c']
       assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
                                 :content => /The entry or revision was not found in the repository/
     end
   
     def test_entry_download
-      get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c'], :format => 'raw'
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c'], :format => 'raw'
       assert_response :success
       assert_template ''
       assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition']
     end
     
     def test_directory_entry
-      get :entry, :id => 1, :path => ['subversion_test', 'folder']
+      @repository.fetch_changesets
+      @repository.reload
+      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'folder']
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entry)
       assert_equal 'folder', assigns(:entry).name
     end
     
+    # TODO: this test needs fixtures.
     def test_revision
+      @repository.fetch_changesets
+      @repository.reload
       get :revision, :id => 1, :rev => 2
       assert_response :success
       assert_template 'revision'
@@ -167,19 +201,30 @@
     end
     
     def test_invalid_revision
-      get :revision, :id => 1, :rev => 'something_weird'
+      @repository.fetch_changesets
+      @repository.reload
+      get :revision, :id => PRJ_ID, :rev => 'something_weird'
+      assert_response 404
+      assert_error_tag :content => /was not found/
+    end
+
+    def test_invalid_revision_diff
+      get :diff, :id => PRJ_ID, :rev => '1', :rev_to => 'something_weird'
       assert_response 404
       assert_error_tag :content => /was not found/
     end
 
     def test_empty_revision
+      @repository.fetch_changesets
+      @repository.reload
       ['', ' ', nil].each do |r|
-        get :revision, :id => 1, :rev => r
+        get :revision, :id => PRJ_ID, :rev => r
         assert_response 404
         assert_error_tag :content => /was not found/
       end
     end
 
+    # TODO: this test needs fixtures.
     def test_revision_with_repository_pointing_to_a_subdirectory
       r = Project.find(1).repository
       # Changes repository url to a subdirectory
@@ -203,7 +248,9 @@
     end
     
     def test_revision_diff
-      get :diff, :id => 1, :rev => 3
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 3
       assert_response :success
       assert_template 'diff'
 
@@ -211,7 +258,9 @@
     end
 
     def test_directory_diff
-      get :diff, :id => 1, :rev => 6, :rev_to => 2, :path => ['subversion_test', 'folder']
+      @repository.fetch_changesets
+      @repository.reload
+      get :diff, :id => PRJ_ID, :rev => 6, :rev_to => 2, :path => ['subversion_test', 'folder']
       assert_response :success
       assert_template 'diff'
       
@@ -224,13 +273,17 @@
     end
     
     def test_annotate
-      get :annotate, :id => 1, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :annotate, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'annotate'
     end
 
     def test_annotate_at_given_revision
-      get :annotate, :id => 1, :rev => 8, :path => ['subversion_test', 'helloworld.c']
+      @repository.fetch_changesets
+      @repository.reload
+      get :annotate, :id => PRJ_ID, :rev => 8, :path => ['subversion_test', 'helloworld.c']
       assert_response :success
       assert_template 'annotate'
       assert_tag :tag => 'h2', :content => /@ 8/
--- a/test/functional/welcome_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/welcome_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -67,4 +67,28 @@
     assert_equal 'text/plain', @response.content_type
     assert @response.body.match(%r{^Disallow: /projects/ecookbook/issues\r?$})
   end
+  
+  def test_warn_on_leaving_unsaved_turn_on
+    user = User.find(2)
+    user.pref.warn_on_leaving_unsaved = '1'
+    user.pref.save!
+    @request.session[:user_id] = 2
+    
+    get :index
+    assert_tag 'script',
+      :attributes => {:type => "text/javascript"},
+      :content => %r{new WarnLeavingUnsaved}
+  end
+  
+  def test_warn_on_leaving_unsaved_turn_off
+    user = User.find(2)
+    user.pref.warn_on_leaving_unsaved = '0'
+    user.pref.save!
+    @request.session[:user_id] = 2
+    
+    get :index
+    assert_no_tag 'script',
+      :attributes => {:type => "text/javascript"},
+      :content => %r{new WarnLeavingUnsaved}
+  end
 end
--- a/test/functional/workflows_controller_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/functional/workflows_controller_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -65,17 +65,17 @@
     
     # allowed transitions
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[3][]',
-                                                 :value => '5',
+                                                 :name => 'issue_status[3][5][]',
+                                                 :value => 'always',
                                                  :checked => 'checked' }
     # not allowed
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[3][]',
-                                                 :value => '2',
+                                                 :name => 'issue_status[3][2][]',
+                                                 :value => 'always',
                                                  :checked => nil }
     # unused
     assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                    :name => 'issue_status[4][]' }
+                                                    :name => 'issue_status[1][1][]' }
   end
   
   def test_get_edit_with_role_and_tracker_and_all_statuses
@@ -89,13 +89,17 @@
     assert_equal IssueStatus.count, assigns(:statuses).size
     
     assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
-                                                 :name => 'issue_status[1][]',
-                                                 :value => '1',
+                                                 :name => 'issue_status[1][1][]',
+                                                 :value => 'always',
                                                  :checked => nil }
   end
   
   def test_post_edit
-    post :edit, :role_id => 2, :tracker_id => 1, :issue_status => {'4' => ['5'], '3' => ['1', '2']}
+    post :edit, :role_id => 2, :tracker_id => 1,
+      :issue_status => {
+        '4' => {'5' => ['always']},
+        '3' => {'1' => ['always'], '2' => ['always']}
+      }
     assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1'
     
     assert_equal 3, Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2})
@@ -103,6 +107,30 @@
     assert_nil      Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4})
   end
   
+  def test_post_edit_with_additional_transitions
+    post :edit, :role_id => 2, :tracker_id => 1,
+      :issue_status => {
+        '4' => {'5' => ['always']},
+        '3' => {'1' => ['author'], '2' => ['assignee'], '4' => ['author', 'assignee']}
+      }
+    assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1'
+    
+    assert_equal 4, Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2})
+    
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 4, :new_status_id => 5})
+    assert ! w.author
+    assert ! w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 1})
+    assert w.author
+    assert ! w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2})
+    assert ! w.author
+    assert w.assignee
+    w = Workflow.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 4})
+    assert w.author
+    assert w.assignee
+  end
+  
   def test_clear_workflow
     assert Workflow.count(:conditions => {:tracker_id => 1, :role_id => 2}) > 0
 
--- a/test/integration/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/integration/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/integration
 http://redmine.rubyforge.org/svn
 
--- a/test/integration/api_test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/integration/api_test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/integration/api_test
 http://redmine.rubyforge.org/svn
 
--- a/test/integration/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/integration/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/integration/lib
 http://redmine.rubyforge.org/svn
 
--- a/test/integration/lib/redmine/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/integration/lib/redmine/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/integration/lib/redmine
 http://redmine.rubyforge.org/svn
 
--- a/test/mocks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/mocks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/mocks
 http://redmine.rubyforge.org/svn
 
--- a/test/mocks/development/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/mocks/development/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/mocks/development
 http://redmine.rubyforge.org/svn
 
--- a/test/mocks/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/mocks/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/mocks/test
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 34
-/svn/!svn/ver/4802/trunk/test/unit
+/svn/!svn/ver/4991/trunk/test/unit
 END
 document_test.rb
 K 25
@@ -19,13 +19,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 57
-/svn/!svn/ver/4703/trunk/test/unit/repository_git_test.rb
+/svn/!svn/ver/4986/trunk/test/unit/repository_git_test.rb
 END
 repository_mercurial_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 63
-/svn/!svn/ver/4704/trunk/test/unit/repository_mercurial_test.rb
+/svn/!svn/ver/4991/trunk/test/unit/repository_mercurial_test.rb
 END
 issue_relation_test.rb
 K 25
@@ -55,13 +55,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 48
-/svn/!svn/ver/4723/trunk/test/unit/issue_test.rb
+/svn/!svn/ver/4958/trunk/test/unit/issue_test.rb
 END
 issue_status_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 55
-/svn/!svn/ver/4509/trunk/test/unit/issue_status_test.rb
+/svn/!svn/ver/4895/trunk/test/unit/issue_status_test.rb
 END
 time_entry_activity_test.rb
 K 25
@@ -79,19 +79,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/4703/trunk/test/unit/repository_subversion_test.rb
+/svn/!svn/ver/4987/trunk/test/unit/repository_subversion_test.rb
 END
 repository_bazaar_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 60
-/svn/!svn/ver/4613/trunk/test/unit/repository_bazaar_test.rb
-END
-changeset_test.rb
-K 25
-svn:wc:ra_dav:version-url
-V 52
-/svn/!svn/ver/4613/trunk/test/unit/changeset_test.rb
+/svn/!svn/ver/4982/trunk/test/unit/repository_bazaar_test.rb
 END
 role_test.rb
 K 25
@@ -99,6 +93,12 @@
 V 47
 /svn/!svn/ver/4509/trunk/test/unit/role_test.rb
 END
+changeset_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 52
+/svn/!svn/ver/4984/trunk/test/unit/changeset_test.rb
+END
 comment_test.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -139,7 +139,19 @@
 K 25
 svn:wc:ra_dav:version-url
 V 47
-/svn/!svn/ver/4761/trunk/test/unit/user_test.rb
+/svn/!svn/ver/4936/trunk/test/unit/user_test.rb
+END
+mail_handler_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/!svn/ver/4576/trunk/test/unit/mail_handler_test.rb
+END
+repository_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 53
+/svn/!svn/ver/4982/trunk/test/unit/repository_test.rb
 END
 time_entry_test.rb
 K 25
@@ -147,17 +159,17 @@
 V 53
 /svn/!svn/ver/4709/trunk/test/unit/time_entry_test.rb
 END
-repository_test.rb
+principal_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 53
-/svn/!svn/ver/4726/trunk/test/unit/repository_test.rb
+V 52
+/svn/!svn/ver/4509/trunk/test/unit/principal_test.rb
 END
-mail_handler_test.rb
+journal_observer_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 55
-/svn/!svn/ver/4576/trunk/test/unit/mail_handler_test.rb
+V 59
+/svn/!svn/ver/4509/trunk/test/unit/journal_observer_test.rb
 END
 auth_source_ldap_test.rb
 K 25
@@ -165,17 +177,11 @@
 V 59
 /svn/!svn/ver/4509/trunk/test/unit/auth_source_ldap_test.rb
 END
-journal_observer_test.rb
+repository_filesystem_test.rb
 K 25
 svn:wc:ra_dav:version-url
-V 59
-/svn/!svn/ver/4509/trunk/test/unit/journal_observer_test.rb
-END
-principal_test.rb
-K 25
-svn:wc:ra_dav:version-url
-V 52
-/svn/!svn/ver/4509/trunk/test/unit/principal_test.rb
+V 64
+/svn/!svn/ver/4509/trunk/test/unit/repository_filesystem_test.rb
 END
 project_nested_set_test.rb
 K 25
@@ -183,12 +189,6 @@
 V 61
 /svn/!svn/ver/4650/trunk/test/unit/project_nested_set_test.rb
 END
-repository_filesystem_test.rb
-K 25
-svn:wc:ra_dav:version-url
-V 64
-/svn/!svn/ver/4509/trunk/test/unit/repository_filesystem_test.rb
-END
 message_test.rb
 K 25
 svn:wc:ra_dav:version-url
@@ -223,13 +223,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 57
-/svn/!svn/ver/4802/trunk/test/unit/repository_cvs_test.rb
+/svn/!svn/ver/4982/trunk/test/unit/repository_cvs_test.rb
 END
 repository_darcs_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4608/trunk/test/unit/repository_darcs_test.rb
+/svn/!svn/ver/4982/trunk/test/unit/repository_darcs_test.rb
 END
 activity_test.rb
 K 25
@@ -277,7 +277,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 48
-/svn/!svn/ver/4553/trunk/test/unit/query_test.rb
+/svn/!svn/ver/4888/trunk/test/unit/query_test.rb
 END
 search_test.rb
 K 25
--- a/test/unit/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T03:35:13.139305Z
+4991
 tmaruyama
 
 
@@ -100,10 +100,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-f95988379d5f7fa7f341954a886c6a3e
-2011-01-13T12:04:30.962313Z
-4703
+2011-03-03T11:40:17.000000Z
+47242b5b6c39be0674556191a42a70ff
+2011-03-02T05:12:39.499704Z
+4986
 tmaruyama
 has-props
 
@@ -126,7 +126,7 @@
 
 
 
-4415
+5437
 
 repository_mercurial_test.rb
 file
@@ -134,10 +134,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-37d81db20cb50110ac1f7fa44e5ecb40
-2011-01-13T12:04:51.838288Z
-4704
+2011-03-03T11:40:17.000000Z
+df5148d6503c41188684ca42c8fb1563
+2011-03-03T03:35:13.139305Z
+4991
 tmaruyama
 has-props
 
@@ -160,7 +160,7 @@
 
 
 
-6345
+7231
 
 issue_relation_test.rb
 file
@@ -304,10 +304,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-a8c280ae08bee271010554106ded8aa0
-2011-01-15T14:12:18.630628Z
-4723
+2011-03-03T11:40:17.000000Z
+103def744f4a7e87035c40962f5f4b9f
+2011-02-27T15:51:10.736814Z
+4958
 jplang
 has-props
 
@@ -330,7 +330,7 @@
 
 
 
-30795
+32944
 
 issue_status_test.rb
 file
@@ -338,11 +338,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-46bccc51b3aa0bd4b3826318f662f587
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+927e020ce867263e6cf5af443bfaecd8
+2011-02-20T15:38:07.840581Z
+4895
+jplang
 has-props
 
 
@@ -364,7 +364,7 @@
 
 
 
-3236
+4757
 
 time_entry_activity_test.rb
 file
@@ -440,10 +440,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-fb0636f5bb4d94047ed14879e88f7df7
-2011-01-13T12:04:30.962313Z
-4703
+2011-03-03T11:40:17.000000Z
+428e976e05c3c4bffbc9885ef1272fc7
+2011-03-02T07:10:39.633104Z
+4987
 tmaruyama
 has-props
 
@@ -466,7 +466,7 @@
 
 
 
-5506
+7066
 
 repository_bazaar_test.rb
 file
@@ -474,10 +474,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-b0c66b65fc51cdbf6f9885dddbfe5a23
-2011-01-02T09:45:05.291687Z
-4613
+2011-03-03T11:40:17.000000Z
+562f1297bf47e2199e1f04ccd1733f49
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -500,10 +500,41 @@
 
 
 
-3125
+2704
 
-helpers
-dir
+changeset_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+ee5c9c8f3cf4814a73673fe693faf697
+2011-03-01T15:35:27.747088Z
+4984
+tmaruyama
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+10123
 
 role_test.rb
 file
@@ -539,39 +570,8 @@
 
 3054
 
-changeset_test.rb
-file
-
-
-
-
-2011-03-03T11:05:21.000000Z
-c3cb358e85c7a5ddde50a50e8e8395d9
-2011-01-02T09:45:05.291687Z
-4613
-tmaruyama
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-7938
+helpers
+dir
 
 comment_test.rb
 file
@@ -786,10 +786,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-9b6aa6783e2b9f44ad37d027deeaf9d3
-2011-01-24T17:28:59.767504Z
-4761
+2011-03-03T11:40:17.000000Z
+93a08b69d91fdc8222483cbb6d20563d
+2011-02-23T17:27:31.762248Z
+4936
 jplang
 has-props
 
@@ -812,7 +812,75 @@
 
 
 
-25384
+26161
+
+mail_handler_test.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+ccd63941c3776cd520a713f27ed01d08
+2010-12-29T17:38:57.772516Z
+4576
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+18979
+
+repository_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+71ee0e9aa37fb046390f5774895ef623
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+6540
 
 time_entry_test.rb
 file
@@ -848,73 +916,73 @@
 
 4317
 
-repository_test.rb
+principal_test.rb
 file
 
 
 
 
-2011-03-03T11:05:21.000000Z
-759b702e56d17ca338fcead30d8cfcbe
-2011-01-16T14:27:02.047144Z
-4726
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6554
+2011-03-03T11:05:08.000000Z
+69e70ceb20c56bbb25155e8120146aa3
+2010-12-12T23:24:34.194336Z
+4509
+jbbarth
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2078
 
-mail_handler_test.rb
+journal_observer_test.rb
 file
 
 
 
 
 2011-03-03T11:05:08.000000Z
-ccd63941c3776cd520a713f27ed01d08
-2010-12-29T17:38:57.772516Z
-4576
-jplang
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-18979
+0a054ecc047ebca7e0cb9fe8aadf51eb
+2010-12-12T23:24:34.194336Z
+4509
+jbbarth
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3959
 
 auth_source_ldap_test.rb
 file
@@ -950,74 +1018,6 @@
 
 2793
 
-journal_observer_test.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-0a054ecc047ebca7e0cb9fe8aadf51eb
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-3959
-
-principal_test.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-69e70ceb20c56bbb25155e8120146aa3
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2078
-
 project_nested_set_test.rb
 file
 
@@ -1262,10 +1262,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-fdd38bbac4028c6fcb8b5902b7b509b2
-2011-02-07T10:26:15.436891Z
-4802
+2011-03-03T11:40:17.000000Z
+a2d7bc3feefa89da466f5ead9e4da18d
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -1288,7 +1288,7 @@
 
 
 
-3840
+3909
 
 repository_darcs_test.rb
 file
@@ -1296,10 +1296,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-ae2d97f344e9c59bb09648e9e333db84
-2011-01-01T22:01:28.805978Z
-4608
+2011-03-03T11:40:17.000000Z
+44a11577927a86290e2887c1e0c0dd24
+2011-03-01T10:27:30.170724Z
+4982
 tmaruyama
 has-props
 
@@ -1322,7 +1322,7 @@
 
 
 
-2596
+2723
 
 activity_test.rb
 file
@@ -1568,10 +1568,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-25fe3c9e8b257bd7f2ce5b8a28f8f508
-2010-12-21T21:46:54.984442Z
-4553
+2011-03-03T11:40:17.000000Z
+1cf7133fc93cd35e36b828afe1abdd35
+2011-02-20T13:03:32.835478Z
+4888
 jplang
 has-props
 
@@ -1594,7 +1594,7 @@
 
 
 
-20770
+21925
 
 search_test.rb
 file
--- a/test/unit/.svn/text-base/changeset_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/changeset_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -72,24 +72,40 @@
     Setting.commit_ref_keywords = '*'
     Setting.commit_logtime_enabled = '1'
 
-    c = Changeset.new(:repository => Project.find(1).repository,
-                      :committed_on => 24.hours.ago,
-                      :comments => 'Worked on this issue #1 @2h',
-                      :revision => '520',
-                      :user => User.find(2))
-    assert_difference 'TimeEntry.count' do
-      c.scan_comment_for_issue_ids
+    {
+      '2' => 2.0,
+      '2h' => 2.0,
+      '2hours' => 2.0,
+      '15m' => 0.25,
+      '15min' => 0.25,
+      '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
-    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
   
   def test_ref_keywords_closing_with_timelog
@@ -100,7 +116,7 @@
     
     c = Changeset.new(:repository => Project.find(1).repository,
                       :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))
     assert_difference 'TimeEntry.count', 2 do
       c.scan_comment_for_issue_ids
@@ -169,12 +185,12 @@
     assert_equal [2], c.issue_ids.sort
     assert c.issues.first.project != c.project
   end
-  
+
   def test_text_tag_revision
     c = Changeset.new(:revision => '520')
     assert_equal 'r520', c.text_tag
   end
-  
+
   def test_text_tag_hash
     c = Changeset.new(:scmid => '7234cb2750b63f47bff735edc50a1c0a433c2518', :revision => '7234cb2750b63f47bff735edc50a1c0a433c2518')
     assert_equal 'commit:7234cb2750b63f47bff735edc50a1c0a433c2518', c.text_tag
@@ -204,19 +220,67 @@
     changeset = Changeset.find_by_revision('10')
     assert_nil changeset.next
   end
-  
+
   def test_comments_should_be_converted_to_utf8
-    with_settings :commit_logs_encoding => 'ISO-8859-1' do
-      c = Changeset.new
-      c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      proj = Project.find(3)
+      str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'ISO-8859-1' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => str)
+      assert( c.save )
       assert_equal "Texte encodé en ISO-8859-1.", c.comments
-    end
   end
-  
+
   def test_invalid_utf8_sequences_in_comments_should_be_stripped
-    c = Changeset.new
-    c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
-    assert_equal "Texte encod en ISO-8859-1.", c.comments
+      proj = Project.find(3)
+      str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'UTF-8' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => str)
+      assert( c.save )
+      if str.respond_to?(:force_encoding)
+        assert_equal "Texte encod? en ISO-8859-1.", c.comments
+      else
+        assert_equal "Texte encod en ISO-8859-1.", c.comments
+      end
+  end
+
+  def test_comments_should_be_converted_all_latin1_to_utf8
+      s1 = "\xC2\x80"
+      s2 = "\xc3\x82\xc2\x80"
+      if s1.respond_to?(:force_encoding)
+        s3 = s1
+        s4 = s2
+        s1.force_encoding('ASCII-8BIT')
+        s2.force_encoding('ASCII-8BIT')
+        s3.force_encoding('ISO-8859-1')
+        s4.force_encoding('UTF-8')
+        assert_equal s3.encode('UTF-8'), s4
+      end
+      proj = Project.find(3)
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'ISO-8859-1' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => s1)
+      assert( c.save )
+      assert_equal s2, c.comments
   end
 
   def test_identifier
--- a/test/unit/.svn/text-base/issue_status_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/issue_status_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -18,7 +18,7 @@
 require File.expand_path('../../test_helper', __FILE__)
 
 class IssueStatusTest < ActiveSupport::TestCase
-  fixtures :issue_statuses, :issues
+  fixtures :issue_statuses, :issues, :roles, :trackers
 
   def test_create
     status = IssueStatus.new :name => "Assigned"
@@ -68,6 +68,30 @@
     status.reload
     assert status.is_default?
   end
+  
+  def test_new_statuses_allowed_to
+    Workflow.delete_all
+    
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3, :author => true, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4, :author => false, :assignee => true)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5, :author => true, :assignee => true)
+    status = IssueStatus.find(1)
+    role = Role.find(1)
+    tracker = Tracker.find(1)
+
+    assert_equal [2], status.new_statuses_allowed_to([role], tracker, false, false).map(&:id)
+    assert_equal [2], status.find_new_statuses_allowed_to([role], tracker, false, false).map(&:id)
+    
+    assert_equal [2, 3], status.new_statuses_allowed_to([role], tracker, true, false).map(&:id)
+    assert_equal [2, 3], status.find_new_statuses_allowed_to([role], tracker, true, false).map(&:id)
+    
+    assert_equal [2, 4], status.new_statuses_allowed_to([role], tracker, false, true).map(&:id)
+    assert_equal [2, 4], status.find_new_statuses_allowed_to([role], tracker, false, true).map(&:id)
+    
+    assert_equal [2, 3, 4, 5], status.new_statuses_allowed_to([role], tracker, true, true).map(&:id)
+    assert_equal [2, 3, 4, 5], status.find_new_statuses_allowed_to([role], tracker, true, true).map(&:id)
+  end
 
   context "#update_done_ratios" do
     setup do
--- a/test/unit/.svn/text-base/issue_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/issue_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -210,6 +210,33 @@
     assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
   end
   
+  
+  
+  def test_new_statuses_allowed_to
+    Workflow.delete_all
+    
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3, :author => true, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4, :author => false, :assignee => true)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5, :author => true, :assignee => true)
+    status = IssueStatus.find(1)
+    role = Role.find(1)
+    tracker = Tracker.find(1)
+    user = User.find(2)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1)
+    assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user)
+    assert_equal [1, 2, 3], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user)
+    assert_equal [1, 2, 4], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user)
+    assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
+  end
+  
   def test_copy
     issue = Issue.new.copy_from(1)
     assert issue.save
@@ -594,6 +621,29 @@
     assert ActionMailer::Base.deliveries.empty?
   end
   
+  def test_journalized_description
+    IssueCustomField.delete_all
+    
+    i = Issue.first
+    old_description = i.description
+    new_description = "This is the new description"
+    
+    i.init_journal(User.find(2))
+    i.description = new_description
+    assert_difference 'Journal.count', 1 do
+      assert_difference 'JournalDetail.count', 1 do
+        i.save!
+      end
+    end
+    
+    detail = JournalDetail.first(:order => 'id DESC')
+    assert_equal i, detail.journal.journalized
+    assert_equal 'attr', detail.property
+    assert_equal 'description', detail.prop_key
+    assert_equal old_description, detail.old_value
+    assert_equal new_description, detail.value
+  end
+  
   def test_saving_twice_should_not_duplicate_journal_details
     i = Issue.find(:first)
     i.init_journal(User.find(2), 'Some notes')
--- a/test/unit/.svn/text-base/query_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/query_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -484,7 +484,6 @@
         # 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_find_issues_with_query_is_successful @query
-
       end
 
       should "search assigned to any group member (all)" do
@@ -494,7 +493,22 @@
         # 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_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
 
@@ -540,6 +554,22 @@
         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
       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
   
--- a/test/unit/.svn/text-base/repository_bazaar_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_bazaar_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,19 @@
 
 class RepositoryBazaarTest < ActiveSupport::TestCase
   fixtures :projects
-  
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
   REPOSITORY_PATH.gsub!(/\/+/, '/')
 
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Bazaar.create(:project => @project, :url => "file:///#{REPOSITORY_PATH}")
+    @project = Project.find(3)
+    @repository = Repository::Bazaar.create(
+              :project => @project, :url => "file:///#{REPOSITORY_PATH}",
+              :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
@@ -38,7 +41,7 @@
       assert_equal 9, @repository.changes.count
       assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 5
@@ -49,7 +52,7 @@
       @repository.fetch_changesets
       assert_equal 4, @repository.changesets.count
     end
-    
+
     def test_entries
       entries = @repository.entries
       assert_equal 2, entries.size
@@ -68,19 +71,6 @@
       assert_equal 'file', entries.last.kind
       assert_equal 'edit.png', entries.last.name
     end
-    
-    def test_cat
-      cat = @repository.scm.cat('directory/document.txt')
-      assert cat =~ /Write the contents of a file as of a given revision to standard output/
-    end
-    
-    def test_annotate
-      annotate = @repository.scm.annotate('doc-mkdir.txt')
-      assert_equal 17, annotate.lines.size
-      assert_equal '1', annotate.revisions[0].identifier
-      assert_equal 'jsmith@', annotate.revisions[0].author
-      assert_equal 'mkdir', annotate.lines[0]
-    end
   else
     puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/.svn/text-base/repository_cvs_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_cvs_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -28,9 +28,11 @@
   
   def setup
     @project = Project.find(3)
-    assert @repository = Repository::Cvs.create(:project => @project, 
-                                                :root_url => REPOSITORY_PATH,
-                                                :url => MODULE_NAME)
+    @repository = Repository::Cvs.create(:project => @project, 
+                                         :root_url => REPOSITORY_PATH,
+                                         :url => MODULE_NAME,
+                                         :log_encoding => 'UTF-8')
+    assert @repository
   end
   
   if File.directory?(REPOSITORY_PATH)  
--- a/test/unit/.svn/text-base/repository_darcs_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_darcs_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -19,25 +19,28 @@
 
 class RepositoryDarcsTest < ActiveSupport::TestCase
   fixtures :projects
-  
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
-  
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Darcs.create(:project => @project, :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Darcs.create(
+                      :project => @project, :url => REPOSITORY_PATH,
+                      :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
+
       assert_equal 6, @repository.changesets.count
       assert_equal 13, @repository.changes.count
       assert_equal "Initial commit.", @repository.changesets.find_by_revision('1').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 3
@@ -48,8 +51,10 @@
       @repository.fetch_changesets
       assert_equal 6, @repository.changesets.count
     end
-    
+
     def test_deleted_files_should_not_be_listed
+      @repository.fetch_changesets
+      @repository.reload
       entries = @repository.entries('sources')
       assert entries.detect {|e| e.name == 'watchers_controller.rb'}
       assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'}
--- a/test/unit/.svn/text-base/repository_git_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_git_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -18,25 +18,29 @@
 require File.expand_path('../../test_helper', __FILE__)
 
 class RepositoryGitTest < ActiveSupport::TestCase
-  fixtures :projects, :repositories, :enabled_modules, :users, :roles 
-  
+  fixtures :projects, :repositories, :enabled_modules, :users, :roles
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
   REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
-  
+
+  FELIX_HEX  = "Felix Sch\xC3\xA4fer"
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Git.create(:project => @project, :url => REPOSITORY_PATH)
+    Setting.commit_logs_encoding = 'UTF-8'
+    @project = Project.find(3)
+    @repository = Repository::Git.create(:project => @project, :url => REPOSITORY_PATH)
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
-      assert_equal 15, @repository.changesets.count
-      assert_equal 24, @repository.changes.count
-      
+
+      assert_equal 16, @repository.changesets.count
+      assert_equal 25, @repository.changes.count
+
       commit = @repository.changesets.find(:first, :order => 'committed_on ASC')
       assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments
       assert_equal "jsmith <jsmith@foo.bar>", commit.committer
@@ -57,10 +61,20 @@
       # Remove the 3 latest changesets
       @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy)
       @repository.reload
-      assert_equal 12, @repository.changesets.count
-      
+      cs1 = @repository.changesets
+      assert_equal 13, cs1.count
+
+      rev_a_commit = @repository.changesets.find(:first, :order => 'committed_on DESC')
+      assert_equal '4f26664364207fa8b1af9f8722647ab2d4ac5d43', rev_a_commit.revision
+      # Mon Jul 5 22:34:26 2010 +0200
+      rev_a_committed_on = Time.gm(2010, 7, 5, 20, 34, 26)
+      assert_equal '4f26664364207fa8b1af9f8722647ab2d4ac5d43', rev_a_commit.scmid
+      assert_equal rev_a_committed_on, rev_a_commit.committed_on
+      latest_rev = @repository.latest_changeset
+      assert_equal rev_a_committed_on, latest_rev.committed_on
+
       @repository.fetch_changesets
-      assert_equal 15, @repository.changesets.count
+      assert_equal 16, @repository.changesets.count
     end
 
     def test_find_changeset_by_name
@@ -103,6 +117,17 @@
       assert c.event_title.include?('abc7234c:')
       assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
     end
+
+    def test_log_utf8
+      @repository.fetch_changesets
+      @repository.reload
+      str_felix_hex  = FELIX_HEX
+      if str_felix_hex.respond_to?(:force_encoding)
+          str_felix_hex.force_encoding('UTF-8')
+      end
+      c = @repository.changesets.find_by_revision('ed5bb786bbda2dee66a2d50faf51429dbc043a7b')
+      assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer
+    end
   else
     puts "Git test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/.svn/text-base/repository_mercurial_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_mercurial_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -22,23 +22,23 @@
   
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
-  
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH)
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
       assert_equal 17, @repository.changesets.count
       assert_equal 25, @repository.changes.count
       assert_equal "Initial import.\nThe repository contains 3 files.",
                    @repository.changesets.find_by_revision('0').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 2
@@ -49,19 +49,6 @@
       @repository.fetch_changesets
       assert_equal 17, @repository.changesets.count
     end
-    
-    def test_entries
-      assert_equal 2, @repository.entries("sources", 2).size
-      assert_equal 2, @repository.entries("sources", '400bb8672109').size
-      assert_equal 1, @repository.entries("sources", 3).size
-      assert_equal 1, @repository.entries("sources", 'b3a615152df8').size
-    end
-
-    def test_locate_on_outdated_repository
-      assert_equal 1, @repository.entries("images", 0).size
-      assert_equal 2, @repository.entries("images").size
-      assert_equal 2, @repository.entries("images", 2).size
-    end
 
     def test_isodatesec
       # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
@@ -171,6 +158,43 @@
       assert c.event_title.include?('123:abc400bb8672:')
       assert_equal 'abc400bb8672', c.event_url[:rev]
     end
+
+    def test_latest_changesets_with_limit
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('', nil, 2)
+      assert_equal @repository.latest_changesets('', nil)[0, 2], changesets
+    end
+
+    def test_latest_changesets_with_filepath
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('README', nil)
+      assert_equal %w|8 6 1 0|, changesets.collect(&:revision)
+
+      path = 'sql_escape/percent%dir/percent%file1.txt'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|11 10 9|, changesets.collect(&:revision)
+
+      path = 'sql_escape/underscore_dir/understrike_file.txt'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|12 9|, changesets.collect(&:revision)
+    end
+
+    def test_latest_changesets_with_dirpath
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('images', nil)
+      assert_equal %w|1 0|, changesets.collect(&:revision)
+
+      path = 'sql_escape/percent%dir'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|13 11 10 9|, changesets.collect(&:revision)
+
+      path = 'sql_escape/underscore_dir'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|13 12 9|, changesets.collect(&:revision)
+    end
   else
     puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/.svn/text-base/repository_subversion_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_subversion_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -21,8 +21,9 @@
   fixtures :projects, :repositories, :enabled_modules, :users, :roles 
   
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}")
+    @project = Project.find(3)
+    assert @repository = Repository::Subversion.create(:project => @project,
+             :url => "file://#{self.class.repository_path('subversion')}")
   end
   
   if repository_configured?('subversion')
@@ -74,7 +75,7 @@
     end
 
     def test_directory_listing_with_square_brackets_in_base
-      @project = Project.find(1)
+      @project = Project.find(3)
       @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}/subversion_test/[folder_with_brackets]")
 
       @repository.fetch_changesets
@@ -136,6 +137,56 @@
       assert c.event_title.include?('123456789:')
       assert_equal '123456789', c.event_url[:rev]
     end
+
+    def test_log_encoding_ignore_setting
+      with_settings :commit_logs_encoding => 'windows-1252' do
+        s1 = "\xC2\x80"
+        s2 = "\xc3\x82\xc2\x80"
+        if s1.respond_to?(:force_encoding)
+          s3 = s1
+          s4 = s2
+          s1.force_encoding('ASCII-8BIT')
+          s2.force_encoding('ASCII-8BIT')
+          s3.force_encoding('ISO-8859-1')
+          s4.force_encoding('UTF-8')
+          assert_equal s3.encode('UTF-8'), s4
+        end
+        c = Changeset.new(:repository => @repository,
+                          :comments=>s2,
+                          :revision=>'123',
+                          :committed_on => Time.now)
+        assert c.save
+        assert_equal s2, c.comments
+      end
+    end
+
+    def test_previous
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('3')
+      assert_equal @repository.find_changeset_by_name('2'), changeset.previous
+    end
+
+    def test_previous_nil
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('1')
+      assert_nil changeset.previous
+    end
+
+    def test_next
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('2')
+      assert_equal @repository.find_changeset_by_name('3'), changeset.next
+    end
+
+    def test_next_nil
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('11')
+      assert_nil changeset.next
+    end
   else
     puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/.svn/text-base/repository_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/repository_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -125,16 +125,19 @@
     assert_not_equal( comment, changeset.comments )
     assert_equal( 'This is a loooooooooooooooooooooooooooong comment', changeset.comments )
   end
-  
+
   def test_for_urls_strip
-    repository = Repository::Cvs.create(:project => Project.find(4), :url => ' :pserver:login:password@host:/path/to/the/repository',
-                                                                     :root_url => 'foo  ')
+    repository = Repository::Cvs.create(
+        :project => Project.find(4),
+        :url => ' :pserver:login:password@host:/path/to/the/repository',
+        :root_url => 'foo  ',
+        :log_encoding => 'UTF-8')
     assert repository.save
     repository.reload
     assert_equal ':pserver:login:password@host:/path/to/the/repository', repository.url
     assert_equal 'foo', repository.root_url
   end
-  
+
   def test_manual_user_mapping
     assert_no_difference "Changeset.count(:conditions => 'user_id <> 2')" do
       c = Changeset.create!(:repository => @repository, :committer => 'foo', :committed_on => Time.now, :revision => 100, :comments => 'Committed by foo.')
--- a/test/unit/.svn/text-base/user_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/.svn/text-base/user_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -361,7 +361,6 @@
     user = User.try_to_login("admin", "hello")
     assert_kind_of User, user
     assert_equal "admin", user.login
-    assert_equal User.hash_password("hello"), user.hashed_password    
   end
   
   def test_name_format
@@ -383,6 +382,22 @@
     assert_equal nil, user  
   end
   
+  context ".try_to_login" do
+    context "with good credentials" do
+      should "return the user" do
+        user = User.try_to_login("admin", "admin")
+        assert_kind_of User, user
+        assert_equal "admin", user.login
+      end
+    end
+    
+    context "with wrong credentials" do
+      should "return nil" do
+        assert_nil User.try_to_login("admin", "foo")
+      end
+    end
+  end
+  
   if ldap_configured?
     context "#try_to_login using LDAP" do
       context "with failed connection to the LDAP server" do
@@ -727,6 +742,23 @@
       should 'be added and tested'
     end
   end
+
+  def test_salt_unsalted_passwords
+    # Restore a user with an unsalted password
+    user = User.find(1)
+    user.salt = nil
+    user.hashed_password = User.hash_password("unsalted")
+    user.save!
+    
+    User.salt_unsalted_passwords!
+    
+    user.reload
+    # Salt added
+    assert !user.salt.blank?
+    # Password still valid
+    assert user.check_password?("unsalted")
+    assert_equal user, User.try_to_login(user.login, "unsalted")
+  end
   
   if Object.const_defined?(:OpenID)
     
--- a/test/unit/changeset_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/changeset_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -72,24 +72,40 @@
     Setting.commit_ref_keywords = '*'
     Setting.commit_logtime_enabled = '1'
 
-    c = Changeset.new(:repository => Project.find(1).repository,
-                      :committed_on => 24.hours.ago,
-                      :comments => 'Worked on this issue #1 @2h',
-                      :revision => '520',
-                      :user => User.find(2))
-    assert_difference 'TimeEntry.count' do
-      c.scan_comment_for_issue_ids
+    {
+      '2' => 2.0,
+      '2h' => 2.0,
+      '2hours' => 2.0,
+      '15m' => 0.25,
+      '15min' => 0.25,
+      '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
-    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
   
   def test_ref_keywords_closing_with_timelog
@@ -100,7 +116,7 @@
     
     c = Changeset.new(:repository => Project.find(1).repository,
                       :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))
     assert_difference 'TimeEntry.count', 2 do
       c.scan_comment_for_issue_ids
@@ -169,12 +185,12 @@
     assert_equal [2], c.issue_ids.sort
     assert c.issues.first.project != c.project
   end
-  
+
   def test_text_tag_revision
     c = Changeset.new(:revision => '520')
     assert_equal 'r520', c.text_tag
   end
-  
+
   def test_text_tag_hash
     c = Changeset.new(:scmid => '7234cb2750b63f47bff735edc50a1c0a433c2518', :revision => '7234cb2750b63f47bff735edc50a1c0a433c2518')
     assert_equal 'commit:7234cb2750b63f47bff735edc50a1c0a433c2518', c.text_tag
@@ -204,19 +220,67 @@
     changeset = Changeset.find_by_revision('10')
     assert_nil changeset.next
   end
-  
+
   def test_comments_should_be_converted_to_utf8
-    with_settings :commit_logs_encoding => 'ISO-8859-1' do
-      c = Changeset.new
-      c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      proj = Project.find(3)
+      str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'ISO-8859-1' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => str)
+      assert( c.save )
       assert_equal "Texte encodé en ISO-8859-1.", c.comments
-    end
   end
-  
+
   def test_invalid_utf8_sequences_in_comments_should_be_stripped
-    c = Changeset.new
-    c.comments = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
-    assert_equal "Texte encod en ISO-8859-1.", c.comments
+      proj = Project.find(3)
+      str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt")
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'UTF-8' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => str)
+      assert( c.save )
+      if str.respond_to?(:force_encoding)
+        assert_equal "Texte encod? en ISO-8859-1.", c.comments
+      else
+        assert_equal "Texte encod en ISO-8859-1.", c.comments
+      end
+  end
+
+  def test_comments_should_be_converted_all_latin1_to_utf8
+      s1 = "\xC2\x80"
+      s2 = "\xc3\x82\xc2\x80"
+      if s1.respond_to?(:force_encoding)
+        s3 = s1
+        s4 = s2
+        s1.force_encoding('ASCII-8BIT')
+        s2.force_encoding('ASCII-8BIT')
+        s3.force_encoding('ISO-8859-1')
+        s4.force_encoding('UTF-8')
+        assert_equal s3.encode('UTF-8'), s4
+      end
+      proj = Project.find(3)
+      r = Repository::Bazaar.create!(
+            :project => proj, :url => '/tmp/test/bazaar',
+            :log_encoding => 'ISO-8859-1' )
+      assert r
+      c = Changeset.new(:repository => r,
+                        :committed_on => Time.now,
+                        :revision => '123',
+                        :scmid => '12345',
+                        :comments => s1)
+      assert( c.save )
+      assert_equal s2, c.comments
   end
 
   def test_identifier
--- a/test/unit/helpers/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/helpers/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,13 @@
 K 25
 svn:wc:ra_dav:version-url
 V 42
-/svn/!svn/ver/4760/trunk/test/unit/helpers
+/svn/!svn/ver/4982/trunk/test/unit/helpers
+END
+repository_helper_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 68
+/svn/!svn/ver/4932/trunk/test/unit/helpers/repository_helper_test.rb
 END
 custom_fields_helper_test.rb
 K 25
@@ -25,7 +31,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 69
-/svn/!svn/ver/4760/trunk/test/unit/helpers/application_helper_test.rb
+/svn/!svn/ver/4982/trunk/test/unit/helpers/application_helper_test.rb
 END
 search_helper_test.rb
 K 25
--- a/test/unit/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,15 +1,15 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/helpers
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-23T17:02:10.030897Z
-4760
-jplang
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
 
 
 
@@ -26,6 +26,40 @@
 
 e93f8b46-1217-0410-a6f0-8f06a7374b81
 
+repository_helper_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+657e0f9ae00af3978571139525631dcc
+2011-02-23T07:04:52.071012Z
+4932
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2288
+
 custom_fields_helper_test.rb
 file
 
@@ -134,11 +168,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-8dd8aaf2b5473e5db20fd4fd273a3680
-2011-01-23T17:02:10.030897Z
-4760
-jplang
+2011-03-03T11:40:17.000000Z
+1f311492ce81d8708bef3193e684f98d
+2011-03-01T10:27:30.170724Z
+4982
+tmaruyama
 has-props
 
 
@@ -160,7 +194,7 @@
 
 
 
-34973
+35024
 
 search_helper_test.rb
 file
--- a/test/unit/helpers/.svn/text-base/application_helper_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/helpers/.svn/text-base/application_helper_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -292,7 +292,9 @@
       'commit:20080308225258-98289-abcd456efg.gz' => changeset_link,
      }
     @project = Project.find(3)
-    r = Repository::Darcs.create!(:project => @project, :url => '/tmp/test/darcs')
+    r = Repository::Darcs.create!(
+            :project => @project, :url => '/tmp/test/darcs',
+            :log_encoding => 'UTF-8')
     assert r
     c = Changeset.new(:repository => r,
                       :committed_on => Time.now,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/helpers/.svn/text-base/repository_helper_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,68 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../test_helper', __FILE__)
+
+class RepositoryHelperTest < HelperTestCase
+  include RepositoriesHelper
+
+  def test_from_latin1_to_utf8
+    with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
+      s1 = "Texte encod\xc3\xa9"
+      s2 = "Texte encod\xe9"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+
+  def test_from_euc_jp_to_utf8
+    with_settings :repositories_encodings => 'UTF-8,EUC-JP' do
+      s1 = "\xe3\x83\xac\xe3\x83\x83\xe3\x83\x89\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xb3"
+      s2 = "\xa5\xec\xa5\xc3\xa5\xc9\xa5\xde\xa5\xa4\xa5\xf3"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+
+  def test_to_utf8_should_be_converted_all_latin1_to_utf8
+    with_settings :repositories_encodings => 'ISO-8859-1' do
+      s1 = "\xc3\x82\xc2\x80"
+      s2 = "\xC2\x80"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+end
+
--- a/test/unit/helpers/application_helper_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/helpers/application_helper_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -292,7 +292,9 @@
       'commit:20080308225258-98289-abcd456efg.gz' => changeset_link,
      }
     @project = Project.find(3)
-    r = Repository::Darcs.create!(:project => @project, :url => '/tmp/test/darcs')
+    r = Repository::Darcs.create!(
+            :project => @project, :url => '/tmp/test/darcs',
+            :log_encoding => 'UTF-8')
     assert r
     c = Changeset.new(:repository => r,
                       :committed_on => Time.now,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/helpers/repository_helper_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,68 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../test_helper', __FILE__)
+
+class RepositoryHelperTest < HelperTestCase
+  include RepositoriesHelper
+
+  def test_from_latin1_to_utf8
+    with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
+      s1 = "Texte encod\xc3\xa9"
+      s2 = "Texte encod\xe9"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+
+  def test_from_euc_jp_to_utf8
+    with_settings :repositories_encodings => 'UTF-8,EUC-JP' do
+      s1 = "\xe3\x83\xac\xe3\x83\x83\xe3\x83\x89\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xb3"
+      s2 = "\xa5\xec\xa5\xc3\xa5\xc9\xa5\xde\xa5\xa4\xa5\xf3"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+
+  def test_to_utf8_should_be_converted_all_latin1_to_utf8
+    with_settings :repositories_encodings => 'ISO-8859-1' do
+      s1 = "\xc3\x82\xc2\x80"
+      s2 = "\xC2\x80"
+      s3 = s2
+      if s1.respond_to?(:force_encoding)
+        s1.force_encoding("UTF-8")
+        s2.force_encoding("ASCII-8BIT")
+        s3.force_encoding("UTF-8")
+      end
+      assert_equal s1, to_utf8(s2)
+      assert_equal s1, to_utf8(s3)
+    end
+  end
+end
+
--- a/test/unit/issue_status_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/issue_status_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -18,7 +18,7 @@
 require File.expand_path('../../test_helper', __FILE__)
 
 class IssueStatusTest < ActiveSupport::TestCase
-  fixtures :issue_statuses, :issues
+  fixtures :issue_statuses, :issues, :roles, :trackers
 
   def test_create
     status = IssueStatus.new :name => "Assigned"
@@ -68,6 +68,30 @@
     status.reload
     assert status.is_default?
   end
+  
+  def test_new_statuses_allowed_to
+    Workflow.delete_all
+    
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3, :author => true, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4, :author => false, :assignee => true)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5, :author => true, :assignee => true)
+    status = IssueStatus.find(1)
+    role = Role.find(1)
+    tracker = Tracker.find(1)
+
+    assert_equal [2], status.new_statuses_allowed_to([role], tracker, false, false).map(&:id)
+    assert_equal [2], status.find_new_statuses_allowed_to([role], tracker, false, false).map(&:id)
+    
+    assert_equal [2, 3], status.new_statuses_allowed_to([role], tracker, true, false).map(&:id)
+    assert_equal [2, 3], status.find_new_statuses_allowed_to([role], tracker, true, false).map(&:id)
+    
+    assert_equal [2, 4], status.new_statuses_allowed_to([role], tracker, false, true).map(&:id)
+    assert_equal [2, 4], status.find_new_statuses_allowed_to([role], tracker, false, true).map(&:id)
+    
+    assert_equal [2, 3, 4, 5], status.new_statuses_allowed_to([role], tracker, true, true).map(&:id)
+    assert_equal [2, 3, 4, 5], status.find_new_statuses_allowed_to([role], tracker, true, true).map(&:id)
+  end
 
   context "#update_done_ratios" do
     setup do
--- a/test/unit/issue_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/issue_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -210,6 +210,33 @@
     assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
   end
   
+  
+  
+  def test_new_statuses_allowed_to
+    Workflow.delete_all
+    
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2, :author => false, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3, :author => true, :assignee => false)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4, :author => false, :assignee => true)
+    Workflow.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5, :author => true, :assignee => true)
+    status = IssueStatus.find(1)
+    role = Role.find(1)
+    tracker = Tracker.find(1)
+    user = User.find(2)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1)
+    assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user)
+    assert_equal [1, 2, 3], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user)
+    assert_equal [1, 2, 4], issue.new_statuses_allowed_to(user).map(&:id)
+    
+    issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user)
+    assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
+  end
+  
   def test_copy
     issue = Issue.new.copy_from(1)
     assert issue.save
@@ -594,6 +621,29 @@
     assert ActionMailer::Base.deliveries.empty?
   end
   
+  def test_journalized_description
+    IssueCustomField.delete_all
+    
+    i = Issue.first
+    old_description = i.description
+    new_description = "This is the new description"
+    
+    i.init_journal(User.find(2))
+    i.description = new_description
+    assert_difference 'Journal.count', 1 do
+      assert_difference 'JournalDetail.count', 1 do
+        i.save!
+      end
+    end
+    
+    detail = JournalDetail.first(:order => 'id DESC')
+    assert_equal i, detail.journal.journalized
+    assert_equal 'attr', detail.property
+    assert_equal 'description', detail.prop_key
+    assert_equal old_description, detail.old_value
+    assert_equal new_description, detail.value
+  end
+  
   def test_saving_twice_should_not_duplicate_journal_details
     i = Issue.find(:first)
     i.init_journal(User.find(2), 'Some notes')
--- a/test/unit/lib/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 38
-/svn/!svn/ver/4794/trunk/test/unit/lib
+/svn/!svn/ver/4964/trunk/test/unit/lib
 END
 redmine_test.rb
 K 25
--- a/test/unit/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-02T13:13:44.942059Z
-4794
+2011-02-28T14:12:47.115180Z
+4964
 tmaruyama
 
 
--- a/test/unit/lib/redmine/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 46
-/svn/!svn/ver/4794/trunk/test/unit/lib/redmine
+/svn/!svn/ver/4964/trunk/test/unit/lib/redmine
 END
 wiki_formatting.rb
 K 25
@@ -25,7 +25,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4679/trunk/test/unit/lib/redmine/i18n_test.rb
+/svn/!svn/ver/4894/trunk/test/unit/lib/redmine/i18n_test.rb
 END
 hook_test.rb
 K 25
@@ -55,7 +55,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 68
-/svn/!svn/ver/4752/trunk/test/unit/lib/redmine/configuration_test.rb
+/svn/!svn/ver/4949/trunk/test/unit/lib/redmine/configuration_test.rb
 END
 mime_type_test.rb
 K 25
@@ -63,11 +63,17 @@
 V 64
 /svn/!svn/ver/4509/trunk/test/unit/lib/redmine/mime_type_test.rb
 END
+ciphering_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/!svn/ver/4950/trunk/test/unit/lib/redmine/ciphering_test.rb
+END
 unified_diff_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 67
-/svn/!svn/ver/4509/trunk/test/unit/lib/redmine/unified_diff_test.rb
+/svn/!svn/ver/4929/trunk/test/unit/lib/redmine/unified_diff_test.rb
 END
 notifiable_test.rb
 K 25
--- a/test/unit/lib/redmine/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-02T13:13:44.942059Z
-4794
+2011-02-28T14:12:47.115180Z
+4964
 tmaruyama
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-9aeca8ed785b33fdf901312133798b8b
-2011-01-10T18:25:12.105765Z
-4679
+2011-03-03T11:40:17.000000Z
+4368129679eec86fab2cd631de3b8cc5
+2011-02-20T14:56:37.399906Z
+4894
 jplang
 has-props
 
@@ -58,7 +58,7 @@
 
 
 
-4202
+4952
 
 scm
 dir
@@ -165,15 +165,83 @@
 
 2014
 
-wiki_formatting
+views
 dir
 
-views
+wiki_formatting
 dir
 
 menu_manager
 dir
 
+plugin_test.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+d2f2e4457ed4eda1b5efb8a41a3de255
+2010-12-12T23:24:34.194336Z
+4509
+jbbarth
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4168
+
+menu_manager_test.rb
+file
+
+
+
+
+2011-03-03T11:05:08.000000Z
+1a6043d0994b5fb4a09f3962ab5542ce
+2010-12-12T23:24:34.194336Z
+4509
+jbbarth
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1044
+
 wiki_formatting.rb
 file
 
@@ -208,74 +276,6 @@
 
 1966
 
-menu_manager_test.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-1a6043d0994b5fb4a09f3962ab5542ce
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1044
-
-plugin_test.rb
-file
-
-
-
-
-2011-03-03T11:05:08.000000Z
-d2f2e4457ed4eda1b5efb8a41a3de255
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
-has-props
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-4168
-
 hook_test.rb
 file
 
@@ -310,9 +310,6 @@
 
 5741
 
-helpers
-dir
-
 access_control_test.rb
 file
 
@@ -347,16 +344,19 @@
 
 1801
 
+helpers
+dir
+
 configuration_test.rb
 file
 
 
 
 
-2011-03-03T11:05:21.000000Z
-49a50b72de5c622520734a4c53725140
-2011-01-23T10:22:00.456857Z
-4752
+2011-03-03T11:40:17.000000Z
+d96ffe5035b073e1dffdb3f01fe8e06e
+2011-02-25T14:30:05.998365Z
+4949
 jplang
 has-props
 
@@ -379,7 +379,41 @@
 
 
 
-1629
+1877
+
+ciphering_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+c2c353211cdd7cf9a87b9102e26b8d14
+2011-02-26T13:09:25.657748Z
+4950
+jplang
+has-props
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+3125
 
 unified_diff_test.rb
 file
@@ -387,11 +421,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-247766b1dcc53d063207850027e6f78d
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+6b58d3612b430c0757566b1cd6bfcda0
+2011-02-23T07:03:45.049119Z
+4929
+tmaruyama
 has-props
 
 
@@ -413,7 +447,7 @@
 
 
 
-1923
+2455
 
 notifiable_test.rb
 file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/lib/redmine/.svn/prop-base/ciphering_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,5 @@
+K 13
+svn:eol-style
+V 6
+native
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/lib/redmine/.svn/text-base/ciphering_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,84 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../../test_helper', __FILE__)
+
+class Redmine::CipheringTest < ActiveSupport::TestCase
+  
+  def test_password_should_be_encrypted
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert r.read_attribute(:password).match(/\Aaes-256-cbc:.+\Z/)
+    end
+  end
+  
+  def test_password_should_be_clear_with_blank_key
+    Redmine::Configuration.with 'database_cipher_key' => '' do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert_equal 'foo', r.read_attribute(:password)
+    end
+  end
+  
+  def test_password_should_be_clear_with_nil_key
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert_equal 'foo', r.read_attribute(:password)
+    end
+  end
+  
+  def test_unciphered_password_should_be_readable
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      r = Repository::Subversion.generate!(:password => 'clear')
+    end
+    
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'clear', r.password
+    end
+  end
+  
+  def test_encrypt_all
+    Repository.delete_all
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      Repository::Subversion.generate!(:password => 'foo')
+      Repository::Subversion.generate!(:password => 'bar')
+    end
+    
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      assert Repository.encrypt_all(:password)
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'bar', r.password
+      assert r.read_attribute(:password).match(/\Aaes-256-cbc:.+\Z/)
+    end
+  end
+  
+  def test_decrypt_all
+    Repository.delete_all
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      Repository::Subversion.generate!(:password => 'foo')
+      Repository::Subversion.generate!(:password => 'bar')
+      
+      assert Repository.decrypt_all(:password)
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'bar', r.password
+      assert_equal 'bar', r.read_attribute(:password)
+    end
+  end
+end
--- a/test/unit/lib/redmine/.svn/text-base/configuration_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/.svn/text-base/configuration_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -41,6 +41,15 @@
     assert_equal 'bar', @conf['somesetting']
   end
   
+  def test_with
+    load_conf('default.yml', 'test')
+    assert_equal 'foo', @conf['somesetting']
+    @conf.with 'somesetting' => 'bar' do
+      assert_equal 'bar', @conf['somesetting']
+    end
+    assert_equal 'foo', @conf['somesetting']
+  end
+  
   private
   
   def load_conf(file, env)
--- a/test/unit/lib/redmine/.svn/text-base/i18n_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/.svn/text-base/i18n_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -58,13 +58,36 @@
     end
   end
   
+  def test_time_format
+    set_language_if_valid 'en'
+    now = Time.parse('2011-02-20 15:45:22')
+    with_settings :time_format => '%H:%M' do
+      with_settings :date_format => '' do
+        assert_equal '02/20/2011 15:45', format_time(now)
+        assert_equal '15:45', format_time(now, false)
+      end
+      
+      with_settings :date_format => '%Y-%m-%d' do
+        assert_equal '2011-02-20 15:45', format_time(now)
+        assert_equal '15:45', format_time(now, false)
+      end
+    end
+  end
+  
   def test_time_format_default
     set_language_if_valid 'en'
-    now = Time.now
-    Setting.date_format = ''
-    Setting.time_format = ''    
-    assert_equal I18n.l(now), format_time(now)
-    assert_equal I18n.l(now, :format => :time), format_time(now, false)
+    now = Time.parse('2011-02-20 15:45:22')
+    with_settings :time_format => '' do
+      with_settings :date_format => '' do
+        assert_equal '02/20/2011 03:45 pm', format_time(now)
+        assert_equal '03:45 pm', format_time(now, false)
+      end
+      
+      with_settings :date_format => '%Y-%m-%d' do
+        assert_equal '2011-02-20 03:45 pm', format_time(now)
+        assert_equal '03:45 pm', format_time(now, false)
+      end
+    end
   end
   
   def test_time_format
--- a/test/unit/lib/redmine/.svn/text-base/unified_diff_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/.svn/text-base/unified_diff_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -60,8 +60,39 @@
     assert_equal 1, diff.size
   end
 
+  def test_one_line_new_files
+    diff = Redmine::UnifiedDiff.new(<<-DIFF
+diff -r 000000000000 -r ea98b14f75f0 README1
+--- /dev/null
++++ b/README1
+@@ -0,0 +1,1 @@
++test1
+diff -r 000000000000 -r ea98b14f75f0 README2
+--- /dev/null
++++ b/README2
+@@ -0,0 +1,1 @@
++test2
+diff -r 000000000000 -r ea98b14f75f0 README3
+--- /dev/null
++++ b/README3
+@@ -0,0 +1,3 @@
++test4
++test5
++test6
+diff -r 000000000000 -r ea98b14f75f0 README4
+--- /dev/null
++++ b/README4
+@@ -0,0 +1,3 @@
++test4
++test5
++test6
+DIFF
+    )
+    assert_equal 4, diff.size
+  end
+
   private
-  
+
   def read_diff_fixture(filename)
     File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
   end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/lib/redmine/ciphering_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,84 @@
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../../../test_helper', __FILE__)
+
+class Redmine::CipheringTest < ActiveSupport::TestCase
+  
+  def test_password_should_be_encrypted
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert r.read_attribute(:password).match(/\Aaes-256-cbc:.+\Z/)
+    end
+  end
+  
+  def test_password_should_be_clear_with_blank_key
+    Redmine::Configuration.with 'database_cipher_key' => '' do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert_equal 'foo', r.read_attribute(:password)
+    end
+  end
+  
+  def test_password_should_be_clear_with_nil_key
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      r = Repository::Subversion.generate!(:password => 'foo')
+      assert_equal 'foo', r.password
+      assert_equal 'foo', r.read_attribute(:password)
+    end
+  end
+  
+  def test_unciphered_password_should_be_readable
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      r = Repository::Subversion.generate!(:password => 'clear')
+    end
+    
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'clear', r.password
+    end
+  end
+  
+  def test_encrypt_all
+    Repository.delete_all
+    Redmine::Configuration.with 'database_cipher_key' => nil do
+      Repository::Subversion.generate!(:password => 'foo')
+      Repository::Subversion.generate!(:password => 'bar')
+    end
+    
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      assert Repository.encrypt_all(:password)
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'bar', r.password
+      assert r.read_attribute(:password).match(/\Aaes-256-cbc:.+\Z/)
+    end
+  end
+  
+  def test_decrypt_all
+    Repository.delete_all
+    Redmine::Configuration.with 'database_cipher_key' => 'secret' do
+      Repository::Subversion.generate!(:password => 'foo')
+      Repository::Subversion.generate!(:password => 'bar')
+      
+      assert Repository.decrypt_all(:password)
+      r = Repository.first(:order => 'id DESC')
+      assert_equal 'bar', r.password
+      assert_equal 'bar', r.read_attribute(:password)
+    end
+  end
+end
--- a/test/unit/lib/redmine/configuration_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/configuration_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -41,6 +41,15 @@
     assert_equal 'bar', @conf['somesetting']
   end
   
+  def test_with
+    load_conf('default.yml', 'test')
+    assert_equal 'foo', @conf['somesetting']
+    @conf.with 'somesetting' => 'bar' do
+      assert_equal 'bar', @conf['somesetting']
+    end
+    assert_equal 'foo', @conf['somesetting']
+  end
+  
   private
   
   def load_conf(file, env)
--- a/test/unit/lib/redmine/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/helpers
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/lib/redmine/i18n_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/i18n_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -58,13 +58,36 @@
     end
   end
   
+  def test_time_format
+    set_language_if_valid 'en'
+    now = Time.parse('2011-02-20 15:45:22')
+    with_settings :time_format => '%H:%M' do
+      with_settings :date_format => '' do
+        assert_equal '02/20/2011 15:45', format_time(now)
+        assert_equal '15:45', format_time(now, false)
+      end
+      
+      with_settings :date_format => '%Y-%m-%d' do
+        assert_equal '2011-02-20 15:45', format_time(now)
+        assert_equal '15:45', format_time(now, false)
+      end
+    end
+  end
+  
   def test_time_format_default
     set_language_if_valid 'en'
-    now = Time.now
-    Setting.date_format = ''
-    Setting.time_format = ''    
-    assert_equal I18n.l(now), format_time(now)
-    assert_equal I18n.l(now, :format => :time), format_time(now, false)
+    now = Time.parse('2011-02-20 15:45:22')
+    with_settings :time_format => '' do
+      with_settings :date_format => '' do
+        assert_equal '02/20/2011 03:45 pm', format_time(now)
+        assert_equal '03:45 pm', format_time(now, false)
+      end
+      
+      with_settings :date_format => '%Y-%m-%d' do
+        assert_equal '2011-02-20 03:45 pm', format_time(now)
+        assert_equal '03:45 pm', format_time(now, false)
+      end
+    end
   end
   
   def test_time_format
--- a/test/unit/lib/redmine/menu_manager/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/menu_manager/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/menu_manager
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/lib/redmine/scm/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 50
-/svn/!svn/ver/4794/trunk/test/unit/lib/redmine/scm
+/svn/!svn/ver/4964/trunk/test/unit/lib/redmine/scm
 END
--- a/test/unit/lib/redmine/scm/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/scm
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-02T13:13:44.942059Z
-4794
+2011-02-28T14:12:47.115180Z
+4964
 tmaruyama
 
 
--- a/test/unit/lib/redmine/scm/adapters/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,25 +1,31 @@
 K 25
 svn:wc:ra_dav:version-url
 V 59
-/svn/!svn/ver/4794/trunk/test/unit/lib/redmine/scm/adapters
+/svn/!svn/ver/4964/trunk/test/unit/lib/redmine/scm/adapters
 END
 subversion_adapter_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 86
-/svn/!svn/ver/4509/trunk/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb
+/svn/!svn/ver/4825/trunk/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb
+END
+bazaar_adapter_test.rb
+K 25
+svn:wc:ra_dav:version-url
+V 82
+/svn/!svn/ver/4836/trunk/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb
 END
 git_adapter_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 79
-/svn/!svn/ver/4510/trunk/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
+/svn/!svn/ver/4964/trunk/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb
 END
 mercurial_adapter_test.rb
 K 25
 svn:wc:ra_dav:version-url
 V 85
-/svn/!svn/ver/4792/trunk/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb
+/svn/!svn/ver/4875/trunk/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb
 END
 filesystem_adapter_test.rb
 K 25
@@ -31,7 +37,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 79
-/svn/!svn/ver/4794/trunk/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb
+/svn/!svn/ver/4832/trunk/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb
 END
 darcs_adapter_test.rb
 K 25
--- a/test/unit/lib/redmine/scm/adapters/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/scm/adapters
 http://redmine.rubyforge.org/svn
 
 
 
-2011-02-02T13:13:44.942059Z
-4794
+2011-02-28T14:12:47.115180Z
+4964
 tmaruyama
 
 
@@ -32,11 +32,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-765ef194c70144742d0b8bfcb99f6627
-2010-12-12T23:24:34.194336Z
-4509
-jbbarth
+2011-03-03T11:40:17.000000Z
+f0de1284b35555e358dcb810fff1e7e5
+2011-02-15T02:12:39.628343Z
+4825
+tmaruyama
 has-props
 
 
@@ -58,7 +58,41 @@
 
 
 
-1221
+2221
+
+bazaar_adapter_test.rb
+file
+
+
+
+
+2011-03-03T11:40:17.000000Z
+2f30e1187cf8e155707fdf3ff7925f55
+2011-02-15T11:05:33.284244Z
+4836
+tmaruyama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1755
 
 git_adapter_test.rb
 file
@@ -66,11 +100,11 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-2e3d6f99dd454ee396770a707ea169db
-2010-12-12T23:24:45.195624Z
-4510
-jbbarth
+2011-03-03T11:40:17.000000Z
+3d2db23c9a95bf5342365aa4580873c7
+2011-02-28T14:12:47.115180Z
+4964
+tmaruyama
 has-props
 
 
@@ -92,7 +126,7 @@
 
 
 
-3016
+4592
 
 mercurial_adapter_test.rb
 file
@@ -100,10 +134,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-64cc2244eb07beb0857fe8888b957ad3
-2011-02-02T10:01:22.051980Z
-4792
+2011-03-03T11:40:17.000000Z
+20194ed3de36e9107b3279bb4ae596e9
+2011-02-18T07:15:58.762873Z
+4875
 tmaruyama
 has-props
 
@@ -126,7 +160,7 @@
 
 
 
-6500
+10201
 
 filesystem_adapter_test.rb
 file
@@ -168,10 +202,10 @@
 
 
 
-2011-03-03T11:05:21.000000Z
-0407a64851e16387512e427ffb0e167c
-2011-02-02T13:13:44.942059Z
-4794
+2011-03-03T11:40:17.000000Z
+ddf3ab1a187f29d3e377f684c2c0f18c
+2011-02-15T08:04:11.026838Z
+4832
 tmaruyama
 
 
@@ -194,7 +228,7 @@
 
 
 
-1164
+1844
 
 darcs_adapter_test.rb
 file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/text-base/bazaar_adapter_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,54 @@
+require File.expand_path('../../../../../../test_helper', __FILE__)
+begin
+  require 'mocha'
+
+  class BazaarAdapterTest < ActiveSupport::TestCase
+
+    REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
+    REPOSITORY_PATH.gsub!(/\/+/, '/')
+
+    if File.directory?(REPOSITORY_PATH)  
+      def setup
+        @adapter = Redmine::Scm::Adapters::BazaarAdapter.new(REPOSITORY_PATH)
+      end
+
+      def test_scm_version
+        to_test = { "Bazaar (bzr) 2.1.2\n"             => [2,1,2],
+                    "2.1.1\n1.7\n1.8"                  => [2,1,1],
+                    "2.0.1\r\n1.8.1\r\n1.9.1"          => [2,0,1]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      def test_cat
+        cat = @adapter.cat('directory/document.txt')
+        assert cat =~ /Write the contents of a file as of a given revision to standard output/
+      end
+    
+      def test_annotate
+        annotate = @adapter.annotate('doc-mkdir.txt')
+        assert_equal 17, annotate.lines.size
+        assert_equal '1', annotate.revisions[0].identifier
+        assert_equal 'jsmith@', annotate.revisions[0].author
+        assert_equal 'mkdir', annotate.lines[0]
+      end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
+    else
+      puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
+    end
+  end
+
+rescue LoadError
+  class BazaarMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
+  end
+end
+
--- a/test/unit/lib/redmine/scm/adapters/.svn/text-base/cvs_adapter_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/text-base/cvs_adapter_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -5,6 +5,7 @@
   class CvsAdapterTest < ActiveSupport::TestCase
     
     REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/cvs_repository'
+    REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
     MODULE_NAME = 'test'
 
     if File.directory?(REPOSITORY_PATH)  
@@ -12,6 +13,15 @@
         @adapter = Redmine::Scm::Adapters::CvsAdapter.new(MODULE_NAME, REPOSITORY_PATH)
       end
 
+      def test_scm_version
+        to_test = { "\nConcurrent Versions System (CVS) 1.12.13 (client/server)\n"  => [1,12,13],
+                    "\r\n1.12.12\r\n1.12.11"                   => [1,12,12],
+                    "1.12.11\r\n1.12.10\r\n"                   => [1,12,11]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
       def test_revisions_all
         cnt = 0
         @adapter.revisions('', nil, nil, :with_paths => true) do |revision|
@@ -28,6 +38,13 @@
         end
         assert_equal 2, cnt
       end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
     else
       puts "Cvs test repository NOT FOUND. Skipping unit tests !!!"
       def test_fake; assert true end
--- a/test/unit/lib/redmine/scm/adapters/.svn/text-base/git_adapter_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/text-base/git_adapter_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -1,71 +1,120 @@
 # encoding: utf-8
 
+# This file includes UTF-8 "Felix Schäfer".
+# We need to consider Ruby 1.9 compatibility.
+
 require File.expand_path('../../../../../../test_helper', __FILE__)
+begin
+  require 'mocha'
 
-class GitAdapterTest < ActiveSupport::TestCase
-  REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
+  class GitAdapterTest < ActiveSupport::TestCase
+    REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
 
-  if File.directory?(REPOSITORY_PATH)  
-    def setup
-      @adapter = Redmine::Scm::Adapters::GitAdapter.new(REPOSITORY_PATH)
+    FELIX_UTF8 = "Felix Schäfer"
+    FELIX_HEX  = "Felix Sch\xC3\xA4fer"
+
+    if File.directory?(REPOSITORY_PATH)
+      def setup
+        @adapter = Redmine::Scm::Adapters::GitAdapter.new(REPOSITORY_PATH)
+      end
+
+      def test_scm_version
+        to_test = { "git version 1.7.3.4\n"             => [1,7,3,4],
+                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
+                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      def test_branches
+        assert_equal @adapter.branches, ['master', 'test-latin-1', 'test_branch']
+      end
+
+      def test_getting_all_revisions
+        assert_equal 16, @adapter.revisions('',nil,nil,:all => true).length
+      end
+
+      def test_getting_certain_revisions
+        assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
+      end
+
+      def test_getting_revisions_with_spaces_in_filename
+        assert_equal 1, @adapter.revisions("filemane with spaces.txt",
+                                           nil, nil, :all => true).length
+      end
+
+      def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
+        assert_equal " filename with a leading space.txt ",
+           @adapter.revisions(" filename with a leading space.txt ",
+                               nil, nil, :all => true)[0].paths[0][:path]
+      end
+
+      def test_getting_entries_with_leading_and_trailing_spaces_in_filename
+        assert_equal " filename with a leading space.txt ",
+           @adapter.entries('',
+                   '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
+      end
+
+      def test_annotate
+        annotate = @adapter.annotate('sources/watchers_controller.rb')
+        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
+        assert_equal 41, annotate.lines.size
+        assert_equal "# This program is free software; you can redistribute it and/or", annotate.lines[4].strip
+        assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
+                      annotate.revisions[4].identifier
+        assert_equal "jsmith", annotate.revisions[4].author
+      end
+
+      def test_annotate_moved_file
+        annotate = @adapter.annotate('renamed_test.txt')
+        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
+        assert_equal 2, annotate.lines.size
+      end
+
+      def test_last_rev
+        last_rev = @adapter.lastrev("README",
+                                    "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
+        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
+        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
+        assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
+        assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
+      end
+
+      def test_last_rev_with_spaces_in_filename
+        last_rev = @adapter.lastrev("filemane with spaces.txt",
+                                    "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
+        str_felix_utf8 = FELIX_UTF8
+        str_felix_hex  = FELIX_HEX
+        last_rev_author = last_rev.author
+        if last_rev_author.respond_to?(:force_encoding)
+          last_rev_author.force_encoding('UTF-8')
+        end
+        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
+        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
+        assert_equal "#{str_felix_utf8} <felix@fachschaften.org>",
+                       last_rev.author
+        assert_equal "#{str_felix_hex} <felix@fachschaften.org>",
+                       last_rev.author
+        assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
+      end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
+
+    else
+      puts "Git test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
     end
+  end
 
-    def test_branches
-      assert_equal @adapter.branches, ['master', 'test_branch']
-    end
-
-    def test_getting_all_revisions
-      assert_equal 15, @adapter.revisions('',nil,nil,:all => true).length
-    end
-    
-    def test_getting_certain_revisions
-      assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
-    end
-    
-    def test_getting_revisions_with_spaces_in_filename
-      assert_equal 1, @adapter.revisions("filemane with spaces.txt", nil, nil, :all => true).length
-    end
-    
-    def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
-      assert_equal " filename with a leading space.txt ", @adapter.revisions(" filename with a leading space.txt ", nil, nil, :all => true)[0].paths[0][:path]
-    end
-    
-    def test_getting_entries_with_leading_and_trailing_spaces_in_filename
-      assert_equal " filename with a leading space.txt ", @adapter.entries('', '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
-    end
-    
-    def test_annotate
-      annotate = @adapter.annotate('sources/watchers_controller.rb')
-      assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
-      assert_equal 41, annotate.lines.size
-      assert_equal "# This program is free software; you can redistribute it and/or", annotate.lines[4].strip
-      assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", annotate.revisions[4].identifier
-      assert_equal "jsmith", annotate.revisions[4].author
-    end
-    
-    def test_annotate_moved_file
-      annotate = @adapter.annotate('renamed_test.txt')
-      assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
-      assert_equal 2, annotate.lines.size
-    end
-    
-    def test_last_rev
-      last_rev = @adapter.lastrev("README", "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
-      assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
-      assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
-      assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
-      assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
-    end
-    
-    def test_last_rev_with_spaces_in_filename
-      last_rev = @adapter.lastrev("filemane with spaces.txt", "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
-      assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
-      assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
-      assert_equal "Felix Schäfer <felix@fachschaften.org>", last_rev.author
-      assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
-    end
-  else
-    puts "Git test repository NOT FOUND. Skipping unit tests !!!"
-    def test_fake; assert true end
+rescue LoadError
+  class GitMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
   end
 end
+
--- a/test/unit/lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/text-base/mercurial_adapter_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -4,7 +4,7 @@
 
   class MercurialAdapterTest < ActiveSupport::TestCase
 
-    TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
+    HELPERS_DIR = Redmine::Scm::Adapters::MercurialAdapter::HELPERS_DIR
     TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
     TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
 
@@ -13,6 +13,7 @@
     if File.directory?(REPOSITORY_PATH)
       def setup
         @adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
+        @diff_c_support = true
       end
 
       def test_hgversion
@@ -42,6 +43,31 @@
         end
       end
 
+      def test_info
+        [REPOSITORY_PATH, REPOSITORY_PATH + "/",
+             REPOSITORY_PATH + "//"].each do |repo|
+          adp = Redmine::Scm::Adapters::MercurialAdapter.new(repo)
+          repo_path =  adp.info.root_url.gsub(/\\/, "/")
+          assert_equal REPOSITORY_PATH, repo_path
+          assert_equal '16', adp.info.lastrev.revision
+          assert_equal '4cddb4e45f52',adp.info.lastrev.scmid
+        end
+      end
+
+      def test_revisions
+        revisions = @adapter.revisions(nil, 2, 4)
+        assert_equal 3, revisions.size
+        assert_equal '2', revisions[0].revision
+        assert_equal '400bb8672109', revisions[0].scmid
+        assert_equal '4', revisions[2].revision
+        assert_equal 'def6d2f1254a', revisions[2].scmid
+
+        revisions = @adapter.revisions(nil, 2, 4, {:limit => 2})
+        assert_equal 2, revisions.size
+        assert_equal '2', revisions[0].revision
+        assert_equal '400bb8672109', revisions[0].scmid
+      end
+
       def test_diff
         if @adapter.class.client_version_above?([1, 2])
           assert_nil @adapter.diff(nil, '100000')
@@ -49,7 +75,7 @@
         assert_nil @adapter.diff(nil, '100000', '200000')
         [2, '400bb8672109', '400', 400].each do |r1|
           diff1 = @adapter.diff(nil, r1)
-          if @adapter.class.client_version_above?([1, 2])
+          if @diff_c_support
             assert_equal 28, diff1.size
             buf = diff1[24].gsub(/\r\n|\r|\n/, "")
             assert_equal "+    return true unless klass.respond_to?('watched_by')", buf
@@ -70,7 +96,7 @@
       end
 
       def test_diff_made_by_revision
-        if @adapter.class.client_version_above?([1, 2])
+        if @diff_c_support
           [16, '16', '4cddb4e45f52'].each do |r1|
             diff1 = @adapter.diff(nil, r1)
             assert_equal 5, diff1.size
@@ -104,9 +130,12 @@
         end
       end
 
-      # TODO filesize etc.
       def test_entries
         assert_nil @adapter.entries(nil, '100000')
+
+        assert_equal 1, @adapter.entries("sources", 3).size
+        assert_equal 1, @adapter.entries("sources", 'b3a615152df8').size
+
         [2, '400bb8672109', '400', 400].each do |r|
           entries1 = @adapter.entries(nil, r)
           assert entries1
@@ -114,9 +143,15 @@
           assert_equal 'sources', entries1[1].name
           assert_equal 'sources', entries1[1].path
           assert_equal 'dir', entries1[1].kind
-          assert_equal 'README', entries1[2].name
-          assert_equal 'README', entries1[2].path
-          assert_equal 'file', entries1[2].kind
+          readme = entries1[2]
+          assert_equal 'README', readme.name
+          assert_equal 'README', readme.path
+          assert_equal 'file', readme.kind
+          assert_equal 27, readme.size
+          assert_equal '1', readme.lastrev.revision
+          assert_equal '9d5b5b004199', readme.lastrev.identifier
+          # 2007-12-14 10:24:01 +0100
+          assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time
 
           entries2 = @adapter.entries('sources', r)
           assert entries2
@@ -130,6 +165,48 @@
         end
       end
 
+      def test_entries_tag
+        entries1 = @adapter.entries(nil, 'tag_test.00')
+        assert entries1
+        assert_equal 3, entries1.size
+        assert_equal 'sources', entries1[1].name
+        assert_equal 'sources', entries1[1].path
+        assert_equal 'dir', entries1[1].kind
+        readme = entries1[2]
+        assert_equal 'README', readme.name
+        assert_equal 'README', readme.path
+        assert_equal 'file', readme.kind
+        assert_equal 21, readme.size
+        assert_equal '0', readme.lastrev.revision
+        assert_equal '0885933ad4f6', readme.lastrev.identifier
+        # 2007-12-14 10:22:52 +0100
+        assert_equal Time.gm(2007, 12, 14, 9, 22, 52), readme.lastrev.time
+      end
+
+      def test_entries_branch
+        entries1 = @adapter.entries(nil, 'test-branch-00')
+        assert entries1
+        assert_equal 5, entries1.size
+        assert_equal 'sql_escape', entries1[2].name
+        assert_equal 'sql_escape', entries1[2].path
+        assert_equal 'dir', entries1[2].kind
+        readme = entries1[4]
+        assert_equal 'README', readme.name
+        assert_equal 'README', readme.path
+        assert_equal 'file', readme.kind
+        assert_equal 365, readme.size
+        assert_equal '8', readme.lastrev.revision
+        assert_equal 'c51f5bb613cd', readme.lastrev.identifier
+        # 2001-02-01 00:00:00 -0900
+        assert_equal Time.gm(2001, 2, 1, 9, 0, 0), readme.lastrev.time
+      end
+
+      def test_locate_on_outdated_repository
+        assert_equal 1, @adapter.entries("images", 0).size
+        assert_equal 2, @adapter.entries("images").size
+        assert_equal 2, @adapter.entries("images", 2).size
+      end
+
       def test_access_by_nodeid
         path = 'sources/welcome_controller.rb'
         assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')
@@ -141,6 +218,28 @@
         assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400')
       end
 
+      def test_tags
+        assert_equal ['tag_test.00', 'tag-init-revision'], @adapter.tags
+      end
+
+      def test_tagmap
+        tm = { 'tag_test.00'       => '6987191f453a',
+               'tag-init-revision' => '0885933ad4f6' }
+        assert_equal tm, @adapter.tagmap
+      end
+
+      def test_branches
+        assert_equal ['default', 'branch (1)[2]&,%.-3_4', 'test-branch-00'],
+                     @adapter.branches
+      end
+
+      def test_branchmap
+        bm = { 'default'               => '4cddb4e45f52',
+               'branch (1)[2]&,%.-3_4' => '933ca60293d7',
+               'test-branch-00'        => '3a330eb32958' }
+        assert_equal bm, @adapter.branchmap
+      end
+
       private
 
       def test_hgversion_for(hgversion, version)
@@ -149,7 +248,7 @@
       end
 
       def test_template_path_for(version, template)
-        assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
+        assert_equal "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
                      @adapter.class.template_path_for(version)
         assert File.exist?(@adapter.class.template_path_for(version))
       end
--- a/test/unit/lib/redmine/scm/adapters/.svn/text-base/subversion_adapter_test.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/.svn/text-base/subversion_adapter_test.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -17,15 +17,47 @@
 
 require File.expand_path('../../../../../../test_helper', __FILE__)
 
-class SubversionAdapterTest < ActiveSupport::TestCase
+begin
+  require 'mocha'
+
+  class SubversionAdapterTest < ActiveSupport::TestCase
   
-  if repository_configured?('subversion')
-    def test_client_version
-      v = Redmine::Scm::Adapters::SubversionAdapter.client_version
-      assert v.is_a?(Array)
+    if repository_configured?('subversion')
+      def setup
+        repo_path = "file://#{self.class.repository_path('subversion')}"
+        @adapter = Redmine::Scm::Adapters::SubversionAdapter.new(repo_path)
+      end
+
+      def test_client_version
+        v = Redmine::Scm::Adapters::SubversionAdapter.client_version
+        assert v.is_a?(Array)
+      end
+
+      def test_scm_version
+        to_test = { "svn, version 1.6.13 (r1002816)\n"  => [1,6,13],
+                    "svn, versione 1.6.13 (r1002816)\n" => [1,6,13],
+                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
+                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      private
+
+      def test_scm_version_for(scm_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_version)
+        assert_equal version, @adapter.class.svn_binary_version
+      end
+
+    else
+      puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
     end
-  else
-    puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
-    def test_fake; assert true end
+  end
+
+rescue LoadError
+  class SubversionMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
   end
 end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/lib/redmine/scm/adapters/bazaar_adapter_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -0,0 +1,54 @@
+require File.expand_path('../../../../../../test_helper', __FILE__)
+begin
+  require 'mocha'
+
+  class BazaarAdapterTest < ActiveSupport::TestCase
+
+    REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
+    REPOSITORY_PATH.gsub!(/\/+/, '/')
+
+    if File.directory?(REPOSITORY_PATH)  
+      def setup
+        @adapter = Redmine::Scm::Adapters::BazaarAdapter.new(REPOSITORY_PATH)
+      end
+
+      def test_scm_version
+        to_test = { "Bazaar (bzr) 2.1.2\n"             => [2,1,2],
+                    "2.1.1\n1.7\n1.8"                  => [2,1,1],
+                    "2.0.1\r\n1.8.1\r\n1.9.1"          => [2,0,1]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      def test_cat
+        cat = @adapter.cat('directory/document.txt')
+        assert cat =~ /Write the contents of a file as of a given revision to standard output/
+      end
+    
+      def test_annotate
+        annotate = @adapter.annotate('doc-mkdir.txt')
+        assert_equal 17, annotate.lines.size
+        assert_equal '1', annotate.revisions[0].identifier
+        assert_equal 'jsmith@', annotate.revisions[0].author
+        assert_equal 'mkdir', annotate.lines[0]
+      end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
+    else
+      puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
+    end
+  end
+
+rescue LoadError
+  class BazaarMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
+  end
+end
+
--- a/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/cvs_adapter_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -5,6 +5,7 @@
   class CvsAdapterTest < ActiveSupport::TestCase
     
     REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/cvs_repository'
+    REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
     MODULE_NAME = 'test'
 
     if File.directory?(REPOSITORY_PATH)  
@@ -12,6 +13,15 @@
         @adapter = Redmine::Scm::Adapters::CvsAdapter.new(MODULE_NAME, REPOSITORY_PATH)
       end
 
+      def test_scm_version
+        to_test = { "\nConcurrent Versions System (CVS) 1.12.13 (client/server)\n"  => [1,12,13],
+                    "\r\n1.12.12\r\n1.12.11"                   => [1,12,12],
+                    "1.12.11\r\n1.12.10\r\n"                   => [1,12,11]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
       def test_revisions_all
         cnt = 0
         @adapter.revisions('', nil, nil, :with_paths => true) do |revision|
@@ -28,6 +38,13 @@
         end
         assert_equal 2, cnt
       end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
     else
       puts "Cvs test repository NOT FOUND. Skipping unit tests !!!"
       def test_fake; assert true end
--- a/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/git_adapter_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -1,71 +1,120 @@
 # encoding: utf-8
 
+# This file includes UTF-8 "Felix Schäfer".
+# We need to consider Ruby 1.9 compatibility.
+
 require File.expand_path('../../../../../../test_helper', __FILE__)
+begin
+  require 'mocha'
 
-class GitAdapterTest < ActiveSupport::TestCase
-  REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
+  class GitAdapterTest < ActiveSupport::TestCase
+    REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
 
-  if File.directory?(REPOSITORY_PATH)  
-    def setup
-      @adapter = Redmine::Scm::Adapters::GitAdapter.new(REPOSITORY_PATH)
+    FELIX_UTF8 = "Felix Schäfer"
+    FELIX_HEX  = "Felix Sch\xC3\xA4fer"
+
+    if File.directory?(REPOSITORY_PATH)
+      def setup
+        @adapter = Redmine::Scm::Adapters::GitAdapter.new(REPOSITORY_PATH)
+      end
+
+      def test_scm_version
+        to_test = { "git version 1.7.3.4\n"             => [1,7,3,4],
+                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
+                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      def test_branches
+        assert_equal @adapter.branches, ['master', 'test-latin-1', 'test_branch']
+      end
+
+      def test_getting_all_revisions
+        assert_equal 16, @adapter.revisions('',nil,nil,:all => true).length
+      end
+
+      def test_getting_certain_revisions
+        assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
+      end
+
+      def test_getting_revisions_with_spaces_in_filename
+        assert_equal 1, @adapter.revisions("filemane with spaces.txt",
+                                           nil, nil, :all => true).length
+      end
+
+      def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
+        assert_equal " filename with a leading space.txt ",
+           @adapter.revisions(" filename with a leading space.txt ",
+                               nil, nil, :all => true)[0].paths[0][:path]
+      end
+
+      def test_getting_entries_with_leading_and_trailing_spaces_in_filename
+        assert_equal " filename with a leading space.txt ",
+           @adapter.entries('',
+                   '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
+      end
+
+      def test_annotate
+        annotate = @adapter.annotate('sources/watchers_controller.rb')
+        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
+        assert_equal 41, annotate.lines.size
+        assert_equal "# This program is free software; you can redistribute it and/or", annotate.lines[4].strip
+        assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
+                      annotate.revisions[4].identifier
+        assert_equal "jsmith", annotate.revisions[4].author
+      end
+
+      def test_annotate_moved_file
+        annotate = @adapter.annotate('renamed_test.txt')
+        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
+        assert_equal 2, annotate.lines.size
+      end
+
+      def test_last_rev
+        last_rev = @adapter.lastrev("README",
+                                    "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
+        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
+        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
+        assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
+        assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
+      end
+
+      def test_last_rev_with_spaces_in_filename
+        last_rev = @adapter.lastrev("filemane with spaces.txt",
+                                    "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
+        str_felix_utf8 = FELIX_UTF8
+        str_felix_hex  = FELIX_HEX
+        last_rev_author = last_rev.author
+        if last_rev_author.respond_to?(:force_encoding)
+          last_rev_author.force_encoding('UTF-8')
+        end
+        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
+        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
+        assert_equal "#{str_felix_utf8} <felix@fachschaften.org>",
+                       last_rev.author
+        assert_equal "#{str_felix_hex} <felix@fachschaften.org>",
+                       last_rev.author
+        assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
+      end
+
+      private
+
+      def test_scm_version_for(scm_command_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
+        assert_equal version, @adapter.class.scm_command_version
+      end
+
+    else
+      puts "Git test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
     end
+  end
 
-    def test_branches
-      assert_equal @adapter.branches, ['master', 'test_branch']
-    end
-
-    def test_getting_all_revisions
-      assert_equal 15, @adapter.revisions('',nil,nil,:all => true).length
-    end
-    
-    def test_getting_certain_revisions
-      assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
-    end
-    
-    def test_getting_revisions_with_spaces_in_filename
-      assert_equal 1, @adapter.revisions("filemane with spaces.txt", nil, nil, :all => true).length
-    end
-    
-    def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
-      assert_equal " filename with a leading space.txt ", @adapter.revisions(" filename with a leading space.txt ", nil, nil, :all => true)[0].paths[0][:path]
-    end
-    
-    def test_getting_entries_with_leading_and_trailing_spaces_in_filename
-      assert_equal " filename with a leading space.txt ", @adapter.entries('', '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
-    end
-    
-    def test_annotate
-      annotate = @adapter.annotate('sources/watchers_controller.rb')
-      assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
-      assert_equal 41, annotate.lines.size
-      assert_equal "# This program is free software; you can redistribute it and/or", annotate.lines[4].strip
-      assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", annotate.revisions[4].identifier
-      assert_equal "jsmith", annotate.revisions[4].author
-    end
-    
-    def test_annotate_moved_file
-      annotate = @adapter.annotate('renamed_test.txt')
-      assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
-      assert_equal 2, annotate.lines.size
-    end
-    
-    def test_last_rev
-      last_rev = @adapter.lastrev("README", "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
-      assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
-      assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
-      assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
-      assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
-    end
-    
-    def test_last_rev_with_spaces_in_filename
-      last_rev = @adapter.lastrev("filemane with spaces.txt", "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
-      assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
-      assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
-      assert_equal "Felix Schäfer <felix@fachschaften.org>", last_rev.author
-      assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
-    end
-  else
-    puts "Git test repository NOT FOUND. Skipping unit tests !!!"
-    def test_fake; assert true end
+rescue LoadError
+  class GitMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
   end
 end
+
--- a/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -4,7 +4,7 @@
 
   class MercurialAdapterTest < ActiveSupport::TestCase
 
-    TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
+    HELPERS_DIR = Redmine::Scm::Adapters::MercurialAdapter::HELPERS_DIR
     TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
     TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
 
@@ -13,6 +13,7 @@
     if File.directory?(REPOSITORY_PATH)
       def setup
         @adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
+        @diff_c_support = true
       end
 
       def test_hgversion
@@ -42,6 +43,31 @@
         end
       end
 
+      def test_info
+        [REPOSITORY_PATH, REPOSITORY_PATH + "/",
+             REPOSITORY_PATH + "//"].each do |repo|
+          adp = Redmine::Scm::Adapters::MercurialAdapter.new(repo)
+          repo_path =  adp.info.root_url.gsub(/\\/, "/")
+          assert_equal REPOSITORY_PATH, repo_path
+          assert_equal '16', adp.info.lastrev.revision
+          assert_equal '4cddb4e45f52',adp.info.lastrev.scmid
+        end
+      end
+
+      def test_revisions
+        revisions = @adapter.revisions(nil, 2, 4)
+        assert_equal 3, revisions.size
+        assert_equal '2', revisions[0].revision
+        assert_equal '400bb8672109', revisions[0].scmid
+        assert_equal '4', revisions[2].revision
+        assert_equal 'def6d2f1254a', revisions[2].scmid
+
+        revisions = @adapter.revisions(nil, 2, 4, {:limit => 2})
+        assert_equal 2, revisions.size
+        assert_equal '2', revisions[0].revision
+        assert_equal '400bb8672109', revisions[0].scmid
+      end
+
       def test_diff
         if @adapter.class.client_version_above?([1, 2])
           assert_nil @adapter.diff(nil, '100000')
@@ -49,7 +75,7 @@
         assert_nil @adapter.diff(nil, '100000', '200000')
         [2, '400bb8672109', '400', 400].each do |r1|
           diff1 = @adapter.diff(nil, r1)
-          if @adapter.class.client_version_above?([1, 2])
+          if @diff_c_support
             assert_equal 28, diff1.size
             buf = diff1[24].gsub(/\r\n|\r|\n/, "")
             assert_equal "+    return true unless klass.respond_to?('watched_by')", buf
@@ -70,7 +96,7 @@
       end
 
       def test_diff_made_by_revision
-        if @adapter.class.client_version_above?([1, 2])
+        if @diff_c_support
           [16, '16', '4cddb4e45f52'].each do |r1|
             diff1 = @adapter.diff(nil, r1)
             assert_equal 5, diff1.size
@@ -104,9 +130,12 @@
         end
       end
 
-      # TODO filesize etc.
       def test_entries
         assert_nil @adapter.entries(nil, '100000')
+
+        assert_equal 1, @adapter.entries("sources", 3).size
+        assert_equal 1, @adapter.entries("sources", 'b3a615152df8').size
+
         [2, '400bb8672109', '400', 400].each do |r|
           entries1 = @adapter.entries(nil, r)
           assert entries1
@@ -114,9 +143,15 @@
           assert_equal 'sources', entries1[1].name
           assert_equal 'sources', entries1[1].path
           assert_equal 'dir', entries1[1].kind
-          assert_equal 'README', entries1[2].name
-          assert_equal 'README', entries1[2].path
-          assert_equal 'file', entries1[2].kind
+          readme = entries1[2]
+          assert_equal 'README', readme.name
+          assert_equal 'README', readme.path
+          assert_equal 'file', readme.kind
+          assert_equal 27, readme.size
+          assert_equal '1', readme.lastrev.revision
+          assert_equal '9d5b5b004199', readme.lastrev.identifier
+          # 2007-12-14 10:24:01 +0100
+          assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time
 
           entries2 = @adapter.entries('sources', r)
           assert entries2
@@ -130,6 +165,48 @@
         end
       end
 
+      def test_entries_tag
+        entries1 = @adapter.entries(nil, 'tag_test.00')
+        assert entries1
+        assert_equal 3, entries1.size
+        assert_equal 'sources', entries1[1].name
+        assert_equal 'sources', entries1[1].path
+        assert_equal 'dir', entries1[1].kind
+        readme = entries1[2]
+        assert_equal 'README', readme.name
+        assert_equal 'README', readme.path
+        assert_equal 'file', readme.kind
+        assert_equal 21, readme.size
+        assert_equal '0', readme.lastrev.revision
+        assert_equal '0885933ad4f6', readme.lastrev.identifier
+        # 2007-12-14 10:22:52 +0100
+        assert_equal Time.gm(2007, 12, 14, 9, 22, 52), readme.lastrev.time
+      end
+
+      def test_entries_branch
+        entries1 = @adapter.entries(nil, 'test-branch-00')
+        assert entries1
+        assert_equal 5, entries1.size
+        assert_equal 'sql_escape', entries1[2].name
+        assert_equal 'sql_escape', entries1[2].path
+        assert_equal 'dir', entries1[2].kind
+        readme = entries1[4]
+        assert_equal 'README', readme.name
+        assert_equal 'README', readme.path
+        assert_equal 'file', readme.kind
+        assert_equal 365, readme.size
+        assert_equal '8', readme.lastrev.revision
+        assert_equal 'c51f5bb613cd', readme.lastrev.identifier
+        # 2001-02-01 00:00:00 -0900
+        assert_equal Time.gm(2001, 2, 1, 9, 0, 0), readme.lastrev.time
+      end
+
+      def test_locate_on_outdated_repository
+        assert_equal 1, @adapter.entries("images", 0).size
+        assert_equal 2, @adapter.entries("images").size
+        assert_equal 2, @adapter.entries("images", 2).size
+      end
+
       def test_access_by_nodeid
         path = 'sources/welcome_controller.rb'
         assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')
@@ -141,6 +218,28 @@
         assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400')
       end
 
+      def test_tags
+        assert_equal ['tag_test.00', 'tag-init-revision'], @adapter.tags
+      end
+
+      def test_tagmap
+        tm = { 'tag_test.00'       => '6987191f453a',
+               'tag-init-revision' => '0885933ad4f6' }
+        assert_equal tm, @adapter.tagmap
+      end
+
+      def test_branches
+        assert_equal ['default', 'branch (1)[2]&,%.-3_4', 'test-branch-00'],
+                     @adapter.branches
+      end
+
+      def test_branchmap
+        bm = { 'default'               => '4cddb4e45f52',
+               'branch (1)[2]&,%.-3_4' => '933ca60293d7',
+               'test-branch-00'        => '3a330eb32958' }
+        assert_equal bm, @adapter.branchmap
+      end
+
       private
 
       def test_hgversion_for(hgversion, version)
@@ -149,7 +248,7 @@
       end
 
       def test_template_path_for(version, template)
-        assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
+        assert_equal "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
                      @adapter.class.template_path_for(version)
         assert File.exist?(@adapter.class.template_path_for(version))
       end
--- a/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/scm/adapters/subversion_adapter_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -17,15 +17,47 @@
 
 require File.expand_path('../../../../../../test_helper', __FILE__)
 
-class SubversionAdapterTest < ActiveSupport::TestCase
+begin
+  require 'mocha'
+
+  class SubversionAdapterTest < ActiveSupport::TestCase
   
-  if repository_configured?('subversion')
-    def test_client_version
-      v = Redmine::Scm::Adapters::SubversionAdapter.client_version
-      assert v.is_a?(Array)
+    if repository_configured?('subversion')
+      def setup
+        repo_path = "file://#{self.class.repository_path('subversion')}"
+        @adapter = Redmine::Scm::Adapters::SubversionAdapter.new(repo_path)
+      end
+
+      def test_client_version
+        v = Redmine::Scm::Adapters::SubversionAdapter.client_version
+        assert v.is_a?(Array)
+      end
+
+      def test_scm_version
+        to_test = { "svn, version 1.6.13 (r1002816)\n"  => [1,6,13],
+                    "svn, versione 1.6.13 (r1002816)\n" => [1,6,13],
+                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
+                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
+        to_test.each do |s, v|
+          test_scm_version_for(s, v)
+        end
+      end
+
+      private
+
+      def test_scm_version_for(scm_version, version)
+        @adapter.class.expects(:scm_version_from_command_line).returns(scm_version)
+        assert_equal version, @adapter.class.svn_binary_version
+      end
+
+    else
+      puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
+      def test_fake; assert true end
     end
-  else
-    puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
-    def test_fake; assert true end
+  end
+
+rescue LoadError
+  class SubversionMochaFake < ActiveSupport::TestCase
+    def test_fake; assert(false, "Requires mocha to run those tests")  end
   end
 end
--- a/test/unit/lib/redmine/unified_diff_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/unified_diff_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -60,8 +60,39 @@
     assert_equal 1, diff.size
   end
 
+  def test_one_line_new_files
+    diff = Redmine::UnifiedDiff.new(<<-DIFF
+diff -r 000000000000 -r ea98b14f75f0 README1
+--- /dev/null
++++ b/README1
+@@ -0,0 +1,1 @@
++test1
+diff -r 000000000000 -r ea98b14f75f0 README2
+--- /dev/null
++++ b/README2
+@@ -0,0 +1,1 @@
++test2
+diff -r 000000000000 -r ea98b14f75f0 README3
+--- /dev/null
++++ b/README3
+@@ -0,0 +1,3 @@
++test4
++test5
++test6
+diff -r 000000000000 -r ea98b14f75f0 README4
+--- /dev/null
++++ b/README4
+@@ -0,0 +1,3 @@
++test4
++test5
++test6
+DIFF
+    )
+    assert_equal 4, diff.size
+  end
+
   private
-  
+
   def read_diff_fixture(filename)
     File.new(File.join(File.dirname(__FILE__), '/../../../fixtures/diffs', filename)).read
   end
--- a/test/unit/lib/redmine/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/views
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/lib/redmine/views/builders/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/views/builders/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/views/builders
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/lib/redmine/wiki_formatting/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/lib/redmine/wiki_formatting/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/test/unit/lib/redmine/wiki_formatting
 http://redmine.rubyforge.org/svn
 
--- a/test/unit/query_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/query_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -484,7 +484,6 @@
         # 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_find_issues_with_query_is_successful @query
-
       end
 
       should "search assigned to any group member (all)" do
@@ -494,7 +493,22 @@
         # 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_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
 
@@ -540,6 +554,22 @@
         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
       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
   
--- a/test/unit/repository_bazaar_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_bazaar_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,16 +19,19 @@
 
 class RepositoryBazaarTest < ActiveSupport::TestCase
   fixtures :projects
-  
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/bazaar_repository'
   REPOSITORY_PATH.gsub!(/\/+/, '/')
 
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Bazaar.create(:project => @project, :url => "file:///#{REPOSITORY_PATH}")
+    @project = Project.find(3)
+    @repository = Repository::Bazaar.create(
+              :project => @project, :url => "file:///#{REPOSITORY_PATH}",
+              :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
@@ -38,7 +41,7 @@
       assert_equal 9, @repository.changes.count
       assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 5
@@ -49,7 +52,7 @@
       @repository.fetch_changesets
       assert_equal 4, @repository.changesets.count
     end
-    
+
     def test_entries
       entries = @repository.entries
       assert_equal 2, entries.size
@@ -68,19 +71,6 @@
       assert_equal 'file', entries.last.kind
       assert_equal 'edit.png', entries.last.name
     end
-    
-    def test_cat
-      cat = @repository.scm.cat('directory/document.txt')
-      assert cat =~ /Write the contents of a file as of a given revision to standard output/
-    end
-    
-    def test_annotate
-      annotate = @repository.scm.annotate('doc-mkdir.txt')
-      assert_equal 17, annotate.lines.size
-      assert_equal '1', annotate.revisions[0].identifier
-      assert_equal 'jsmith@', annotate.revisions[0].author
-      assert_equal 'mkdir', annotate.lines[0]
-    end
   else
     puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/repository_cvs_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_cvs_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -28,9 +28,11 @@
   
   def setup
     @project = Project.find(3)
-    assert @repository = Repository::Cvs.create(:project => @project, 
-                                                :root_url => REPOSITORY_PATH,
-                                                :url => MODULE_NAME)
+    @repository = Repository::Cvs.create(:project => @project, 
+                                         :root_url => REPOSITORY_PATH,
+                                         :url => MODULE_NAME,
+                                         :log_encoding => 'UTF-8')
+    assert @repository
   end
   
   if File.directory?(REPOSITORY_PATH)  
--- a/test/unit/repository_darcs_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_darcs_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -19,25 +19,28 @@
 
 class RepositoryDarcsTest < ActiveSupport::TestCase
   fixtures :projects
-  
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/darcs_repository'
-  
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Darcs.create(:project => @project, :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Darcs.create(
+                      :project => @project, :url => REPOSITORY_PATH,
+                      :log_encoding => 'UTF-8')
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
+
       assert_equal 6, @repository.changesets.count
       assert_equal 13, @repository.changes.count
       assert_equal "Initial commit.", @repository.changesets.find_by_revision('1').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 3
@@ -48,8 +51,10 @@
       @repository.fetch_changesets
       assert_equal 6, @repository.changesets.count
     end
-    
+
     def test_deleted_files_should_not_be_listed
+      @repository.fetch_changesets
+      @repository.reload
       entries = @repository.entries('sources')
       assert entries.detect {|e| e.name == 'watchers_controller.rb'}
       assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'}
--- a/test/unit/repository_git_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_git_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -18,25 +18,29 @@
 require File.expand_path('../../test_helper', __FILE__)
 
 class RepositoryGitTest < ActiveSupport::TestCase
-  fixtures :projects, :repositories, :enabled_modules, :users, :roles 
-  
+  fixtures :projects, :repositories, :enabled_modules, :users, :roles
+
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
   REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
-  
+
+  FELIX_HEX  = "Felix Sch\xC3\xA4fer"
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Git.create(:project => @project, :url => REPOSITORY_PATH)
+    Setting.commit_logs_encoding = 'UTF-8'
+    @project = Project.find(3)
+    @repository = Repository::Git.create(:project => @project, :url => REPOSITORY_PATH)
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
-      assert_equal 15, @repository.changesets.count
-      assert_equal 24, @repository.changes.count
-      
+
+      assert_equal 16, @repository.changesets.count
+      assert_equal 25, @repository.changes.count
+
       commit = @repository.changesets.find(:first, :order => 'committed_on ASC')
       assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments
       assert_equal "jsmith <jsmith@foo.bar>", commit.committer
@@ -57,10 +61,20 @@
       # Remove the 3 latest changesets
       @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy)
       @repository.reload
-      assert_equal 12, @repository.changesets.count
-      
+      cs1 = @repository.changesets
+      assert_equal 13, cs1.count
+
+      rev_a_commit = @repository.changesets.find(:first, :order => 'committed_on DESC')
+      assert_equal '4f26664364207fa8b1af9f8722647ab2d4ac5d43', rev_a_commit.revision
+      # Mon Jul 5 22:34:26 2010 +0200
+      rev_a_committed_on = Time.gm(2010, 7, 5, 20, 34, 26)
+      assert_equal '4f26664364207fa8b1af9f8722647ab2d4ac5d43', rev_a_commit.scmid
+      assert_equal rev_a_committed_on, rev_a_commit.committed_on
+      latest_rev = @repository.latest_changeset
+      assert_equal rev_a_committed_on, latest_rev.committed_on
+
       @repository.fetch_changesets
-      assert_equal 15, @repository.changesets.count
+      assert_equal 16, @repository.changesets.count
     end
 
     def test_find_changeset_by_name
@@ -103,6 +117,17 @@
       assert c.event_title.include?('abc7234c:')
       assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
     end
+
+    def test_log_utf8
+      @repository.fetch_changesets
+      @repository.reload
+      str_felix_hex  = FELIX_HEX
+      if str_felix_hex.respond_to?(:force_encoding)
+          str_felix_hex.force_encoding('UTF-8')
+      end
+      c = @repository.changesets.find_by_revision('ed5bb786bbda2dee66a2d50faf51429dbc043a7b')
+      assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer
+    end
   else
     puts "Git test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/repository_mercurial_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_mercurial_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -22,23 +22,23 @@
   
   # No '..' in the repository path
   REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
-  
+
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH)
+    @project = Project.find(3)
+    @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH)
+    assert @repository
   end
-  
+
   if File.directory?(REPOSITORY_PATH)  
     def test_fetch_changesets_from_scratch
       @repository.fetch_changesets
       @repository.reload
-      
       assert_equal 17, @repository.changesets.count
       assert_equal 25, @repository.changes.count
       assert_equal "Initial import.\nThe repository contains 3 files.",
                    @repository.changesets.find_by_revision('0').comments
     end
-    
+
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
       # Remove changesets with revision > 2
@@ -49,19 +49,6 @@
       @repository.fetch_changesets
       assert_equal 17, @repository.changesets.count
     end
-    
-    def test_entries
-      assert_equal 2, @repository.entries("sources", 2).size
-      assert_equal 2, @repository.entries("sources", '400bb8672109').size
-      assert_equal 1, @repository.entries("sources", 3).size
-      assert_equal 1, @repository.entries("sources", 'b3a615152df8').size
-    end
-
-    def test_locate_on_outdated_repository
-      assert_equal 1, @repository.entries("images", 0).size
-      assert_equal 2, @repository.entries("images").size
-      assert_equal 2, @repository.entries("images", 2).size
-    end
 
     def test_isodatesec
       # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
@@ -171,6 +158,43 @@
       assert c.event_title.include?('123:abc400bb8672:')
       assert_equal 'abc400bb8672', c.event_url[:rev]
     end
+
+    def test_latest_changesets_with_limit
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('', nil, 2)
+      assert_equal @repository.latest_changesets('', nil)[0, 2], changesets
+    end
+
+    def test_latest_changesets_with_filepath
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('README', nil)
+      assert_equal %w|8 6 1 0|, changesets.collect(&:revision)
+
+      path = 'sql_escape/percent%dir/percent%file1.txt'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|11 10 9|, changesets.collect(&:revision)
+
+      path = 'sql_escape/underscore_dir/understrike_file.txt'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|12 9|, changesets.collect(&:revision)
+    end
+
+    def test_latest_changesets_with_dirpath
+      @repository.fetch_changesets
+      @repository.reload
+      changesets = @repository.latest_changesets('images', nil)
+      assert_equal %w|1 0|, changesets.collect(&:revision)
+
+      path = 'sql_escape/percent%dir'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|13 11 10 9|, changesets.collect(&:revision)
+
+      path = 'sql_escape/underscore_dir'
+      changesets = @repository.latest_changesets(path, nil)
+      assert_equal %w|13 12 9|, changesets.collect(&:revision)
+    end
   else
     puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/repository_subversion_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_subversion_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -21,8 +21,9 @@
   fixtures :projects, :repositories, :enabled_modules, :users, :roles 
   
   def setup
-    @project = Project.find(1)
-    assert @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}")
+    @project = Project.find(3)
+    assert @repository = Repository::Subversion.create(:project => @project,
+             :url => "file://#{self.class.repository_path('subversion')}")
   end
   
   if repository_configured?('subversion')
@@ -74,7 +75,7 @@
     end
 
     def test_directory_listing_with_square_brackets_in_base
-      @project = Project.find(1)
+      @project = Project.find(3)
       @repository = Repository::Subversion.create(:project => @project, :url => "file:///#{self.class.repository_path('subversion')}/subversion_test/[folder_with_brackets]")
 
       @repository.fetch_changesets
@@ -136,6 +137,56 @@
       assert c.event_title.include?('123456789:')
       assert_equal '123456789', c.event_url[:rev]
     end
+
+    def test_log_encoding_ignore_setting
+      with_settings :commit_logs_encoding => 'windows-1252' do
+        s1 = "\xC2\x80"
+        s2 = "\xc3\x82\xc2\x80"
+        if s1.respond_to?(:force_encoding)
+          s3 = s1
+          s4 = s2
+          s1.force_encoding('ASCII-8BIT')
+          s2.force_encoding('ASCII-8BIT')
+          s3.force_encoding('ISO-8859-1')
+          s4.force_encoding('UTF-8')
+          assert_equal s3.encode('UTF-8'), s4
+        end
+        c = Changeset.new(:repository => @repository,
+                          :comments=>s2,
+                          :revision=>'123',
+                          :committed_on => Time.now)
+        assert c.save
+        assert_equal s2, c.comments
+      end
+    end
+
+    def test_previous
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('3')
+      assert_equal @repository.find_changeset_by_name('2'), changeset.previous
+    end
+
+    def test_previous_nil
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('1')
+      assert_nil changeset.previous
+    end
+
+    def test_next
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('2')
+      assert_equal @repository.find_changeset_by_name('3'), changeset.next
+    end
+
+    def test_next_nil
+      @repository.fetch_changesets
+      @repository.reload
+      changeset = @repository.find_changeset_by_name('11')
+      assert_nil changeset.next
+    end
   else
     puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
--- a/test/unit/repository_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/repository_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -125,16 +125,19 @@
     assert_not_equal( comment, changeset.comments )
     assert_equal( 'This is a loooooooooooooooooooooooooooong comment', changeset.comments )
   end
-  
+
   def test_for_urls_strip
-    repository = Repository::Cvs.create(:project => Project.find(4), :url => ' :pserver:login:password@host:/path/to/the/repository',
-                                                                     :root_url => 'foo  ')
+    repository = Repository::Cvs.create(
+        :project => Project.find(4),
+        :url => ' :pserver:login:password@host:/path/to/the/repository',
+        :root_url => 'foo  ',
+        :log_encoding => 'UTF-8')
     assert repository.save
     repository.reload
     assert_equal ':pserver:login:password@host:/path/to/the/repository', repository.url
     assert_equal 'foo', repository.root_url
   end
-  
+
   def test_manual_user_mapping
     assert_no_difference "Changeset.count(:conditions => 'user_id <> 2')" do
       c = Changeset.create!(:repository => @repository, :committer => 'foo', :committed_on => Time.now, :revision => 100, :comments => 'Committed by foo.')
--- a/test/unit/user_test.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/test/unit/user_test.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -361,7 +361,6 @@
     user = User.try_to_login("admin", "hello")
     assert_kind_of User, user
     assert_equal "admin", user.login
-    assert_equal User.hash_password("hello"), user.hashed_password    
   end
   
   def test_name_format
@@ -383,6 +382,22 @@
     assert_equal nil, user  
   end
   
+  context ".try_to_login" do
+    context "with good credentials" do
+      should "return the user" do
+        user = User.try_to_login("admin", "admin")
+        assert_kind_of User, user
+        assert_equal "admin", user.login
+      end
+    end
+    
+    context "with wrong credentials" do
+      should "return nil" do
+        assert_nil User.try_to_login("admin", "foo")
+      end
+    end
+  end
+  
   if ldap_configured?
     context "#try_to_login using LDAP" do
       context "with failed connection to the LDAP server" do
@@ -727,6 +742,23 @@
       should 'be added and tested'
     end
   end
+
+  def test_salt_unsalted_passwords
+    # Restore a user with an unsalted password
+    user = User.find(1)
+    user.salt = nil
+    user.hashed_password = User.hash_password("unsalted")
+    user.save!
+    
+    User.salt_unsalted_passwords!
+    
+    user.reload
+    # Salt added
+    assert !user.salt.blank?
+    # Password still valid
+    assert user.check_password?("unsalted")
+    assert_equal user, User.try_to_login(user.login, "unsalted")
+  end
   
   if Object.const_defined?(:OpenID)
     
--- a/tmp/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/tmp/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/tmp
 http://redmine.rubyforge.org/svn
 
--- a/tmp/cache/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/tmp/cache/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/tmp/cache
 http://redmine.rubyforge.org/svn
 
--- a/tmp/sessions/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/tmp/sessions/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/tmp/sessions
 http://redmine.rubyforge.org/svn
 
--- a/tmp/sockets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/tmp/sockets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/tmp/sockets
 http://redmine.rubyforge.org/svn
 
--- a/tmp/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/tmp/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/tmp/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 31
-/svn/!svn/ver/4739/trunk/vendor
+/svn/!svn/ver/4891/trunk/vendor
 END
--- a/vendor/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-22T13:18:01.557255Z
-4739
+2011-02-20T14:26:23.957459Z
+4891
 jplang
 has-props
 
--- a/vendor/gems/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/bin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/bin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/bin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/encoders/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/encoders/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/encoders
 http://redmine.rubyforge.org/svn
 
@@ -162,6 +162,40 @@
 
 835
 
+lines_of_code.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+966e154458fb6c665b6d62aa90d07e18
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2395
+
 count.rb
 file
 
@@ -196,40 +230,6 @@
 
 230
 
-lines_of_code.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-966e154458fb6c665b6d62aa90d07e18
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2395
-
 xml.rb
 file
 
@@ -298,9 +298,6 @@
 
 236
 
-html
-dir
-
 yaml.rb
 file
 
@@ -335,6 +332,9 @@
 
 264
 
+html
+dir
+
 html.rb
 file
 
@@ -369,6 +369,74 @@
 
 7995
 
+term.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+422a51cd181de3cc0a55aba7f9915c18
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+4324
+
+statistic.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+49017735ef679f73dd65795e30d8e5c7
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1800
+
 comment_filter.rb
 file
 
@@ -403,74 +471,6 @@
 
 808
 
-statistic.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-49017735ef679f73dd65795e30d8e5c7
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1800
-
-term.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-422a51cd181de3cc0a55aba7f9915c18
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-4324
-
 json.rb
 file
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/encoders/html/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/encoders/html/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/encoders/html
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/helpers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/scanners
 http://redmine.rubyforge.org/svn
 
@@ -60,11 +60,79 @@
 
 6723
 
+java
+dir
+
 ruby
 dir
 
-java
-dir
+java.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+35c0803e396fa14a42c6b8645ca7d557
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+5041
+
+python.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+939e009d9b197cb6437646be82c02982
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+9190
 
 ruby.rb
 file
@@ -100,14 +168,14 @@
 
 15309
 
-python.rb
+cpp.rb
 file
 
 
 
 
 2011-03-03T11:05:13.000000Z
-939e009d9b197cb6437646be82c02982
+afc4a4b0842e5efdafe98f6c5a10810e
 2011-01-22T13:18:01.557255Z
 4739
 jplang
@@ -132,41 +200,7 @@
 
 
 
-9190
-
-java.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-35c0803e396fa14a42c6b8645ca7d557
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-5041
+6286
 
 c.rb
 file
@@ -202,40 +236,6 @@
 
 5408
 
-cpp.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-afc4a4b0842e5efdafe98f6c5a10810e
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6286
-
 groovy.rb
 file
 
@@ -270,6 +270,40 @@
 
 8521
 
+debug.rb
+file
+
+
+
+
+2011-03-03T11:05:13.000000Z
+94bdd6c948cb9c3d21ef94a5cec19e05
+2011-01-22T13:18:01.557255Z
+4739
+jplang
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1281
+
 rhtml.rb
 file
 
@@ -304,40 +338,6 @@
 
 1629
 
-debug.rb
-file
-
-
-
-
-2011-03-03T11:05:13.000000Z
-94bdd6c948cb9c3d21ef94a5cec19e05
-2011-01-22T13:18:01.557255Z
-4739
-jplang
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-1281
-
 php.rb
 file
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/java/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/java/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/scanners/java
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/scanners/ruby
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/lib/coderay/styles/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/lib/coderay/styles/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/lib/coderay/styles
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/coderay-0.9.7/test/functional/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/coderay-0.9.7/test/functional/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/coderay-0.9.7/test/functional
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/rubytree-0.5.2/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/rubytree-0.5.2/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/rubytree-0.5.2
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/rubytree-0.5.2/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/rubytree-0.5.2/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/rubytree-0.5.2/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/rubytree-0.5.2/lib/tree/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/rubytree-0.5.2/lib/tree/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/rubytree-0.5.2/lib/tree
 http://redmine.rubyforge.org/svn
 
--- a/vendor/gems/rubytree-0.5.2/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/gems/rubytree-0.5.2/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/gems/rubytree-0.5.2/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,5 +1,5 @@
 K 25
 svn:wc:ra_dav:version-url
 V 39
-/svn/!svn/ver/4739/trunk/vendor/plugins
+/svn/!svn/ver/4891/trunk/vendor/plugins
 END
--- a/vendor/plugins/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins
 http://redmine.rubyforge.org/svn
 
 
 
-2011-01-22T13:18:01.557255Z
-4739
+2011-02-20T14:26:23.957459Z
+4891
 jplang
 
 
--- a/vendor/plugins/acts_as_activity_provider/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_activity_provider/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_activity_provider
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_activity_provider/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_activity_provider/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_activity_provider/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_attachable/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_attachable/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_attachable
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_attachable/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_attachable/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_attachable/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_customizable/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 K 25
 svn:wc:ra_dav:version-url
 V 60
-/svn/!svn/ver/4481/trunk/vendor/plugins/acts_as_customizable
+/svn/!svn/ver/4891/trunk/vendor/plugins/acts_as_customizable
 END
 init.rb
 K 25
--- a/vendor/plugins/acts_as_customizable/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_customizable
 http://redmine.rubyforge.org/svn
 
 
 
-2010-12-10T10:48:16.342425Z
-4481
+2011-02-20T14:26:23.957459Z
+4891
 jplang
 
 
--- a/vendor/plugins/acts_as_customizable/lib/.svn/all-wcprops	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/lib/.svn/all-wcprops	Thu Mar 03 11:42:28 2011 +0000
@@ -1,11 +1,11 @@
 K 25
 svn:wc:ra_dav:version-url
 V 64
-/svn/!svn/ver/4481/trunk/vendor/plugins/acts_as_customizable/lib
+/svn/!svn/ver/4891/trunk/vendor/plugins/acts_as_customizable/lib
 END
 acts_as_customizable.rb
 K 25
 svn:wc:ra_dav:version-url
 V 88
-/svn/!svn/ver/4481/trunk/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb
+/svn/!svn/ver/4891/trunk/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb
 END
--- a/vendor/plugins/acts_as_customizable/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,14 +1,14 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_customizable/lib
 http://redmine.rubyforge.org/svn
 
 
 
-2010-12-10T10:48:16.342425Z
-4481
+2011-02-20T14:26:23.957459Z
+4891
 jplang
 
 
@@ -32,10 +32,10 @@
 
 
 
-2011-03-03T11:05:22.000000Z
-cef2f70b94f09391acec6dea08160454
-2010-12-10T10:48:16.342425Z
-4481
+2011-03-03T11:40:18.000000Z
+2a7f0cd4a6b5d7f58a12567604697208
+2011-02-20T14:26:23.957459Z
+4891
 jplang
 has-props
 
@@ -58,5 +58,5 @@
 
 
 
-4418
+4469
 
--- a/vendor/plugins/acts_as_customizable/lib/.svn/text-base/acts_as_customizable.rb.svn-base	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/lib/.svn/text-base/acts_as_customizable.rb.svn-base	Thu Mar 03 11:42:28 2011 +0000
@@ -71,6 +71,7 @@
           custom_field_values.each do |custom_value|
             custom_value.value = values[custom_value.custom_field_id.to_s] if values.has_key?(custom_value.custom_field_id.to_s)
           end if values.is_a?(Hash)
+          self.custom_values = custom_field_values
         end
         
         def custom_field_values
--- a/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb	Thu Mar 03 11:42:28 2011 +0000
@@ -71,6 +71,7 @@
           custom_field_values.each do |custom_value|
             custom_value.value = values[custom_value.custom_field_id.to_s] if values.has_key?(custom_value.custom_field_id.to_s)
           end if values.is_a?(Hash)
+          self.custom_values = custom_field_values
         end
         
         def custom_field_values
--- a/vendor/plugins/acts_as_event/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_event/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_event
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_event/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_event/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_event/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_list/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_list/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_list
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_list/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_list/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_list/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_list/lib/active_record/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_list/lib/active_record/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_list/lib/active_record
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_list/lib/active_record/acts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_list/lib/active_record/acts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_list/lib/active_record/acts
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_list/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_list/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_list/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_searchable/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_searchable/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_searchable
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_searchable/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_searchable/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_searchable/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/lib/active_record/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/lib/active_record/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree/lib/active_record
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/lib/active_record/acts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/lib/active_record/acts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree/lib/active_record/acts
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_tree/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_tree/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_tree/test/fixtures
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_versioned/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_versioned/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_versioned
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_versioned/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_versioned/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_versioned/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_versioned/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_versioned/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_versioned/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_versioned/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_versioned/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_versioned/test/fixtures
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_versioned/test/fixtures/migrations/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_versioned/test/fixtures/migrations/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_versioned/test/fixtures/migrations
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_watchable/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_watchable/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_watchable
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/acts_as_watchable/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/acts_as_watchable/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/acts_as_watchable/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/lib/awesome_nested_set/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/lib/awesome_nested_set/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/lib/awesome_nested_set
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/rails/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/rails/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/rails
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/test/awesome_nested_set/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/test/awesome_nested_set/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/test/awesome_nested_set
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/test/db/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/test/db/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/test/db
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/awesome_nested_set/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/awesome_nested_set/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/awesome_nested_set/test/fixtures
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/classic_pagination/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/classic_pagination/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/classic_pagination
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/classic_pagination/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/classic_pagination/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/classic_pagination/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/classic_pagination/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/classic_pagination/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/classic_pagination/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/classic_pagination/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/classic_pagination/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/classic_pagination/test/fixtures
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/generators/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/generators/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/generators
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/generators/plugin_migration/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/generators/plugin_migration/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/generators/plugin_migration
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/generators/plugin_migration/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/generators/plugin_migration/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/generators/plugin_migration/templates
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/lib/engines/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/lib/engines/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/lib/engines
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/lib/engines/plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/lib/engines/plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/lib/engines/plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/lib/engines/rails_extensions/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/lib/engines/rails_extensions/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/lib/engines/rails_extensions
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/tasks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/tasks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/tasks
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/controllers/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/controllers/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/controllers/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/helpers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/helpers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/helpers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/models
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/things/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/things/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/things
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/app_and_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/app_and_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views/app_and_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/namespace/app_and_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/namespace/app_and_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views/namespace/app_and_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/notify_mail/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/notify_mail/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views/notify_mail
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/app/views/plugin_mail/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/app/views/plugin_mail/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/app/views/plugin_mail
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/functional/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/functional/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/functional
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/controllers/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/models
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/alpha_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/app_and_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/layouts
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/namespace/shared_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/app/views/shared_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/alpha_plugin/locales/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/alpha_plugin/locales/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/alpha_plugin/locales
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/controllers/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/models
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/views/namespace/shared_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/app/views/shared_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/beta_plugin/locales/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/beta_plugin/locales/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/beta_plugin/locales
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/not_a_plugin/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/not_a_plugin/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/not_a_plugin
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/not_a_plugin/public/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/not_a_plugin/public/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/not_a_plugin/public
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/app/views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/app/views/assets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/views/assets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/app/views/assets
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/app/views/layouts
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/public/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/public/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/public
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets/public/subfolder/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets/public/subfolder/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets/public/subfolder
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets_with_assets_directory/assets/subfolder
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_assets_with_no_subdirectory/assets
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_code_mixing/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_code_mixing/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_code_mixing
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_code_mixing/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_code_mixing/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_code_mixing/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_code_mixing/app/things/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_code_mixing/app/things/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_code_mixing/app/things
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_load_path/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_load_path/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_load_path
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_migration/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_migration/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_migration
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_migration/db/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_migration/db/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_migration/db
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_migration/db/migrate/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_migration/db/migrate/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_migration/db/migrate
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_plugin_mailing/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_plugin_mailing
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_plugin_mailing/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/models
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_plugin_mailing/app/views/plugin_mail
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_routing/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_routing/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_routing
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_routing/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_routing/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_routing/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_routing/app/controllers/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_routing/app/controllers
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_routing/app/controllers/namespace
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_routing/config/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_routing/config/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_routing/config
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_testing/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_testing/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_testing
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_testing/app/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_testing/app/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_testing/app
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_testing/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_testing/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_testing/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_testing/test/fixtures/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_testing/test/fixtures/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_testing/test/fixtures
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/plugins/test_testing/test/unit/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/plugins/test_testing/test/unit/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/plugins/test_testing/test/unit
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/unit/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/unit/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/unit
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/engines/test/unit/test_testing/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/engines/test/unit/test_testing/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/engines/test/unit/test_testing
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/gravatar/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/gravatar/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/gravatar
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/gravatar/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/gravatar/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/gravatar/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/gravatar/spec/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/gravatar/spec/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/gravatar/spec
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/generators/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/generators/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/generators
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/generators/open_id_authentication_tables/templates
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/generators/upgrade_open_id_authentication_tables/templates
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/lib/open_id_authentication/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/lib/open_id_authentication/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/lib/open_id_authentication
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/tasks/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/tasks/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/tasks
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/open_id_authentication/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/open_id_authentication/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/open_id_authentication/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/prepend_engine_views/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/prepend_engine_views/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/prepend_engine_views
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/rfpdf/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/rfpdf/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/rfpdf
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/rfpdf/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/rfpdf/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/rfpdf/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/rfpdf/lib/rfpdf/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/rfpdf/lib/rfpdf/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/rfpdf/lib/rfpdf
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/rfpdf/test/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/rfpdf/test/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/rfpdf/test
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/ruby-net-ldap-0.0.4/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/ruby-net-ldap-0.0.4/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/ruby-net-ldap-0.0.4
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/ruby-net-ldap-0.0.4/lib/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/ruby-net-ldap-0.0.4/lib/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap
 http://redmine.rubyforge.org/svn
 
--- a/vendor/plugins/ruby-net-ldap-0.0.4/tests/.svn/entries	Thu Mar 03 11:40:10 2011 +0000
+++ b/vendor/plugins/ruby-net-ldap-0.0.4/tests/.svn/entries	Thu Mar 03 11:42:28 2011 +0000
@@ -1,7 +1,7 @@
 10
 
 dir
-4802
+4993
 http://redmine.rubyforge.org/svn/trunk/vendor/plugins/ruby-net-ldap-0.0.4/tests
 http://redmine.rubyforge.org/svn