##// END OF EJS Templates
Check that target tables exist before proceeding....
Jean-Philippe Lang -
r12590:fa31229a2338
parent child
Show More
@@ -1,169 +1,178
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 namespace :redmine do
18 namespace :redmine do
19 namespace :attachments do
19 namespace :attachments do
20 desc 'Removes uploaded files left unattached after one day.'
20 desc 'Removes uploaded files left unattached after one day.'
21 task :prune => :environment do
21 task :prune => :environment do
22 Attachment.prune
22 Attachment.prune
23 end
23 end
24
24
25 desc 'Moves attachments stored at the root of the file directory (ie. created before Redmine 2.3) to their subdirectories'
25 desc 'Moves attachments stored at the root of the file directory (ie. created before Redmine 2.3) to their subdirectories'
26 task :move_to_subdirectories => :environment do
26 task :move_to_subdirectories => :environment do
27 Attachment.move_from_root_to_target_directory
27 Attachment.move_from_root_to_target_directory
28 end
28 end
29 end
29 end
30
30
31 namespace :tokens do
31 namespace :tokens do
32 desc 'Removes expired tokens.'
32 desc 'Removes expired tokens.'
33 task :prune => :environment do
33 task :prune => :environment do
34 Token.destroy_expired
34 Token.destroy_expired
35 end
35 end
36 end
36 end
37
37
38 namespace :watchers do
38 namespace :watchers do
39 desc 'Removes watchers from what they can no longer view.'
39 desc 'Removes watchers from what they can no longer view.'
40 task :prune => :environment do
40 task :prune => :environment do
41 Watcher.prune
41 Watcher.prune
42 end
42 end
43 end
43 end
44
44
45 desc 'Fetch changesets from the repositories'
45 desc 'Fetch changesets from the repositories'
46 task :fetch_changesets => :environment do
46 task :fetch_changesets => :environment do
47 Repository.fetch_changesets
47 Repository.fetch_changesets
48 end
48 end
49
49
50 desc 'Migrates and copies plugins assets.'
50 desc 'Migrates and copies plugins assets.'
51 task :plugins do
51 task :plugins do
52 Rake::Task["redmine:plugins:migrate"].invoke
52 Rake::Task["redmine:plugins:migrate"].invoke
53 Rake::Task["redmine:plugins:assets"].invoke
53 Rake::Task["redmine:plugins:assets"].invoke
54 end
54 end
55
55
56 desc <<-DESC
56 desc <<-DESC
57 FOR EXPERIMENTAL USE ONLY, Moves Redmine data from production database to the development database.
57 FOR EXPERIMENTAL USE ONLY, Moves Redmine data from production database to the development database.
58 This task should only be used when you need to move data from one DBMS to a different one (eg. MySQL to PostgreSQL).
58 This task should only be used when you need to move data from one DBMS to a different one (eg. MySQL to PostgreSQL).
59 WARNING: All data in the development database is deleted.
59 WARNING: All data in the development database is deleted.
60 DESC
60 DESC
61
61
62 task :migrate_dbms => :environment do
62 task :migrate_dbms => :environment do
63 ActiveRecord::Base.establish_connection :development
64 target_tables = ActiveRecord::Base.connection.tables
65 ActiveRecord::Base.remove_connection
66
63 ActiveRecord::Base.establish_connection :production
67 ActiveRecord::Base.establish_connection :production
68 tables = ActiveRecord::Base.connection.tables.sort - %w(schema_migrations plugin_schema_info)
69
70 if (tables - target_tables).any?
71 abort "The following table(s) are missing from the target database: #{(tables - target_tables).join(', ')}"
72 end
64
73
65 (ActiveRecord::Base.connection.tables - %w(schema_migrations plugin_schema_info)).each do |table_name|
74 tables.each do |table_name|
66 Source = Class.new(ActiveRecord::Base)
75 Source = Class.new(ActiveRecord::Base)
67 Target = Class.new(ActiveRecord::Base)
76 Target = Class.new(ActiveRecord::Base)
68 Target.establish_connection(:development)
77 Target.establish_connection(:development)
69
78
70 [Source, Target].each do |klass|
79 [Source, Target].each do |klass|
71 klass.table_name = table_name
80 klass.table_name = table_name
72 klass.reset_column_information
81 klass.reset_column_information
73 klass.inheritance_column = "foo"
82 klass.inheritance_column = "foo"
74 klass.record_timestamps = false
83 klass.record_timestamps = false
75 end
84 end
76 Target.primary_key = (Target.column_names.include?("id") ? "id" : nil)
85 Target.primary_key = (Target.column_names.include?("id") ? "id" : nil)
77
86
78 source_count = Source.count
87 source_count = Source.count
79 puts "Migrating %6d records from #{table_name}..." % source_count
88 puts "Migrating %6d records from #{table_name}..." % source_count
80
89
81 Target.delete_all
90 Target.delete_all
82 offset = 0
91 offset = 0
83 while (objects = Source.offset(offset).limit(5000).order("1,2").to_a) && objects.any?
92 while (objects = Source.offset(offset).limit(5000).order("1,2").to_a) && objects.any?
84 offset += objects.size
93 offset += objects.size
85 Target.transaction do
94 Target.transaction do
86 objects.each do |object|
95 objects.each do |object|
87 new_object = Target.new(object.attributes)
96 new_object = Target.new(object.attributes)
88 new_object.id = object.id if Target.primary_key
97 new_object.id = object.id if Target.primary_key
89 new_object.save(:validate => false)
98 new_object.save(:validate => false)
90 end
99 end
91 end
100 end
92 end
101 end
93 Target.connection.reset_pk_sequence!(table_name) if Target.primary_key
102 Target.connection.reset_pk_sequence!(table_name) if Target.primary_key
94 target_count = Target.count
103 target_count = Target.count
95 abort "Some records were not migrated" unless source_count == target_count
104 abort "Some records were not migrated" unless source_count == target_count
96 end
105 end
97 end
106 end
98
107
99 namespace :plugins do
108 namespace :plugins do
100 desc 'Migrates installed plugins.'
109 desc 'Migrates installed plugins.'
101 task :migrate => :environment do
110 task :migrate => :environment do
102 name = ENV['NAME']
111 name = ENV['NAME']
103 version = nil
112 version = nil
104 version_string = ENV['VERSION']
113 version_string = ENV['VERSION']
105 if version_string
114 if version_string
106 if version_string =~ /^\d+$/
115 if version_string =~ /^\d+$/
107 version = version_string.to_i
116 version = version_string.to_i
108 if name.nil?
117 if name.nil?
109 abort "The VERSION argument requires a plugin NAME."
118 abort "The VERSION argument requires a plugin NAME."
110 end
119 end
111 else
120 else
112 abort "Invalid VERSION #{version_string} given."
121 abort "Invalid VERSION #{version_string} given."
113 end
122 end
114 end
123 end
115
124
116 begin
125 begin
117 Redmine::Plugin.migrate(name, version)
126 Redmine::Plugin.migrate(name, version)
118 rescue Redmine::PluginNotFound
127 rescue Redmine::PluginNotFound
119 abort "Plugin #{name} was not found."
128 abort "Plugin #{name} was not found."
120 end
129 end
121
130
122 Rake::Task["db:schema:dump"].invoke
131 Rake::Task["db:schema:dump"].invoke
123 end
132 end
124
133
125 desc 'Copies plugins assets into the public directory.'
134 desc 'Copies plugins assets into the public directory.'
126 task :assets => :environment do
135 task :assets => :environment do
127 name = ENV['NAME']
136 name = ENV['NAME']
128
137
129 begin
138 begin
130 Redmine::Plugin.mirror_assets(name)
139 Redmine::Plugin.mirror_assets(name)
131 rescue Redmine::PluginNotFound
140 rescue Redmine::PluginNotFound
132 abort "Plugin #{name} was not found."
141 abort "Plugin #{name} was not found."
133 end
142 end
134 end
143 end
135
144
136 desc 'Runs the plugins tests.'
145 desc 'Runs the plugins tests.'
137 task :test do
146 task :test do
138 Rake::Task["redmine:plugins:test:units"].invoke
147 Rake::Task["redmine:plugins:test:units"].invoke
139 Rake::Task["redmine:plugins:test:functionals"].invoke
148 Rake::Task["redmine:plugins:test:functionals"].invoke
140 Rake::Task["redmine:plugins:test:integration"].invoke
149 Rake::Task["redmine:plugins:test:integration"].invoke
141 end
150 end
142
151
143 namespace :test do
152 namespace :test do
144 desc 'Runs the plugins unit tests.'
153 desc 'Runs the plugins unit tests.'
145 Rake::TestTask.new :units => "db:test:prepare" do |t|
154 Rake::TestTask.new :units => "db:test:prepare" do |t|
146 t.libs << "test"
155 t.libs << "test"
147 t.verbose = true
156 t.verbose = true
148 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/unit/**/*_test.rb"
157 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/unit/**/*_test.rb"
149 end
158 end
150
159
151 desc 'Runs the plugins functional tests.'
160 desc 'Runs the plugins functional tests.'
152 Rake::TestTask.new :functionals => "db:test:prepare" do |t|
161 Rake::TestTask.new :functionals => "db:test:prepare" do |t|
153 t.libs << "test"
162 t.libs << "test"
154 t.verbose = true
163 t.verbose = true
155 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/functional/**/*_test.rb"
164 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/functional/**/*_test.rb"
156 end
165 end
157
166
158 desc 'Runs the plugins integration tests.'
167 desc 'Runs the plugins integration tests.'
159 Rake::TestTask.new :integration => "db:test:prepare" do |t|
168 Rake::TestTask.new :integration => "db:test:prepare" do |t|
160 t.libs << "test"
169 t.libs << "test"
161 t.verbose = true
170 t.verbose = true
162 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/integration/**/*_test.rb"
171 t.pattern = "plugins/#{ENV['NAME'] || '*'}/test/integration/**/*_test.rb"
163 end
172 end
164 end
173 end
165 end
174 end
166 end
175 end
167
176
168 # Load plugins' rake tasks
177 # Load plugins' rake tasks
169 Dir[File.join(Rails.root, "plugins/*/lib/tasks/**/*.rake")].sort.each { |ext| load ext }
178 Dir[File.join(Rails.root, "plugins/*/lib/tasks/**/*.rake")].sort.each { |ext| load ext }
General Comments 0
You need to be logged in to leave comments. Login now