Mercurial > hg > soundsoftware-site
changeset 245:051f544170fe
* Update to SVN trunk revision 4993
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}')"%>"> </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}')"%>"> </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
--- 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