dump 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +8 -8
  2. data/.rubocop.yml +53 -0
  3. data/.rubocop_todo.yml +33 -0
  4. data/.travis.yml +12 -3
  5. data/README.markdown +8 -0
  6. data/dump.gemspec +4 -1
  7. data/lib/dump.rb +1 -0
  8. data/lib/dump/capistrano.rb +7 -1
  9. data/lib/dump/capistrano/v2.rb +331 -0
  10. data/lib/dump/railtie.rb +1 -0
  11. data/lib/dump_rake.rb +17 -8
  12. data/lib/dump_rake/archive_tar_minitar_fix.rb +3 -1
  13. data/lib/dump_rake/assets.rb +1 -0
  14. data/lib/dump_rake/continious_timeout.rb +17 -17
  15. data/lib/dump_rake/dump.rb +27 -22
  16. data/lib/dump_rake/dump_reader.rb +62 -63
  17. data/lib/dump_rake/dump_writer.rb +20 -21
  18. data/lib/dump_rake/env.rb +12 -10
  19. data/lib/dump_rake/env/filter.rb +3 -0
  20. data/lib/dump_rake/rails_root.rb +1 -0
  21. data/lib/dump_rake/table_manipulation.rb +23 -20
  22. data/lib/generators/assets_config/assets_config_generator.rb +2 -0
  23. data/lib/tasks/assets.rake +1 -2
  24. data/lib/tasks/dump.rake +5 -6
  25. data/recipes/dump.rb +1 -343
  26. data/script/update_readme +5 -3
  27. data/spec/cycle_spec.rb +33 -30
  28. data/spec/dummy_rails_app.rb +42 -0
  29. data/spec/lib/dump_rake/dump_reader_spec.rb +80 -92
  30. data/spec/lib/dump_rake/dump_spec.rb +56 -58
  31. data/spec/lib/dump_rake/dump_writer_spec.rb +42 -43
  32. data/spec/lib/dump_rake/env/filter_spec.rb +9 -9
  33. data/spec/lib/dump_rake/env_spec.rb +21 -21
  34. data/spec/lib/dump_rake/rails_root_spec.rb +7 -7
  35. data/spec/lib/dump_rake/table_manipulation_spec.rb +57 -63
  36. data/spec/lib/dump_rake_spec.rb +76 -76
  37. data/spec/recipes/dump_spec.rb +241 -217
  38. data/spec/spec_helper.rb +1 -42
  39. data/spec/tasks/assets_spec.rb +18 -18
  40. data/spec/tasks/dump_spec.rb +18 -18
  41. metadata +21 -2
@@ -1,4 +1,5 @@
1
1
  class DumpRake
2
+ # Creating dump
2
3
  class DumpWriter < Dump
3
4
  attr_reader :stream, :config
4
5
 
@@ -79,21 +80,21 @@ class DumpRake
79
80
 
80
81
  def write_assets
81
82
  assets = assets_to_dump
82
- if assets.present?
83
- config[:assets] = {}
84
- Dir.chdir(DumpRake::RailsRoot) do
85
- assets = Dir[*assets].uniq
86
- assets.with_progress('Assets') do |asset|
87
- paths = Dir[File.join(asset, '**/*')]
88
- files = paths.select{ |path| File.file?(path) }
89
- config[:assets][asset] = {:total => paths.length, :files => files.length}
90
- assets_root_link do |tmpdir, prefix|
91
- paths.with_progress(asset) do |entry|
92
- begin
93
- Archive::Tar::Minitar.pack_file(File.join(prefix, entry), stream)
94
- rescue => e
95
- $stderr.puts "Skipped asset due to error #{e}"
96
- end
83
+ return if assets.blank?
84
+
85
+ config[:assets] = {}
86
+ Dir.chdir(DumpRake::RailsRoot) do
87
+ assets = Dir[*assets].uniq
88
+ assets.with_progress('Assets') do |asset|
89
+ paths = Dir[File.join(asset, '**/*')]
90
+ files = paths.select{ |path| File.file?(path) }
91
+ config[:assets][asset] = {:total => paths.length, :files => files.length}
92
+ assets_root_link do |_tmpdir, prefix|
93
+ paths.with_progress(asset) do |entry|
94
+ begin
95
+ Archive::Tar::Minitar.pack_file(File.join(prefix, entry), stream)
96
+ rescue => e
97
+ $stderr.puts "Skipped asset due to error #{e}"
97
98
  end
98
99
  end
99
100
  end
@@ -108,12 +109,10 @@ class DumpRake
108
109
  end
109
110
 
110
111
  def assets_to_dump
111
- begin
112
- Rake::Task['assets'].invoke
113
- DumpRake::Env[:assets].split(DumpRake::Assets::SPLITTER)
114
- rescue
115
- []
116
- end
112
+ Rake::Task['assets'].invoke
113
+ DumpRake::Env[:assets].split(DumpRake::Assets::SPLITTER)
114
+ rescue
115
+ []
117
116
  end
118
117
  end
119
118
  end
@@ -3,6 +3,7 @@
3
3
  require 'dump_rake/env/filter'
4
4
 
5
5
  class DumpRake
6
+ # Working with environment variables
6
7
  module Env
7
8
  DICTIONARY = {
8
9
  :desc => %w[DESC DESCRIPTION],
@@ -69,7 +70,7 @@ class DumpRake
69
70
  end
70
71
 
71
72
  def filter(key, splitter = nil)
72
- @filters ||= Hash.new{ |hash, key| hash[key] = Filter.new(*key) }
73
+ @filters ||= Hash.new{ |h, k| h[k] = Filter.new(*k) }
73
74
  @filters[[self[key], splitter]]
74
75
  end
75
76
 
@@ -90,7 +91,7 @@ class DumpRake
90
91
  :select => [:like, :tags],
91
92
  :assets => [:assets],
92
93
  :restore_options => [:migrate_down, :restore_schema, :restore_tables, :restore_assets],
93
- :transfer_options => [:transfer_via]
94
+ :transfer_options => [:transfer_via],
94
95
  }
95
96
 
96
97
  m[:versions] = m[:select] | [:summary]
@@ -108,12 +109,13 @@ class DumpRake
108
109
  end
109
110
 
110
111
  def for_command(command, strings = false)
111
- variables = variable_names_for_command(command)
112
- variables.inject({}) do |env, variable|
113
- value = self[variable]
114
- env[strings ? DICTIONARY[variable].first : variable] = value if value
115
- env
112
+ env = {}
113
+ variable_names_for_command(command).each do |variable|
114
+ if (value = self[variable])
115
+ env[strings ? DICTIONARY[variable].first : variable] = value
116
+ end
116
117
  end
118
+ env
117
119
  end
118
120
 
119
121
  def stringify!(hash)
@@ -124,9 +126,9 @@ class DumpRake
124
126
 
125
127
  def explain_variables_for_command(command)
126
128
  ".\n" <<
127
- variable_names_for_command(command).map do |variable_name|
128
- " #{DICTIONARY[variable_name].join(', ')} — #{EXPLANATIONS[variable_name]}\n"
129
- end.join('')
129
+ variable_names_for_command(command).map do |variable_name|
130
+ " #{DICTIONARY[variable_name].join(', ')} — #{EXPLANATIONS[variable_name]}\n"
131
+ end.join('')
130
132
  end
131
133
 
132
134
  private
@@ -2,6 +2,9 @@
2
2
 
3
3
  class DumpRake
4
4
  module Env
5
+ # Filter strings by simple pattern:
6
+ # 'a,b,c' will pass only 'a', 'b' and 'c'
7
+ # '-a,b,c' will pass everything except 'a', 'b' and 'c'
5
8
  class Filter
6
9
  attr_reader :invert, :values, :transparent
7
10
  def initialize(s, splitter = nil)
@@ -1,5 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ # Get rails app root (Rails.root or RAILS_ROOT or Dir.pwd)
3
4
  class DumpRake
4
5
  RailsRoot = case
5
6
  when defined?(Rails)
@@ -1,4 +1,5 @@
1
1
  class DumpRake
2
+ # Methods to work with db using ActiveRecord
2
3
  module TableManipulation
3
4
  protected
4
5
 
@@ -7,36 +8,33 @@ class DumpRake
7
8
  end
8
9
 
9
10
  def verify_connection
10
- ActiveRecord::Base.connection.verify!(0)
11
+ connection.verify!(0)
11
12
  end
12
13
 
13
-
14
14
  def quote_table_name(table)
15
- ActiveRecord::Base.connection.quote_table_name(table)
15
+ connection.quote_table_name(table)
16
16
  end
17
17
 
18
18
  def quote_column_name(column)
19
- ActiveRecord::Base.connection.quote_column_name(column)
19
+ connection.quote_column_name(column)
20
20
  end
21
21
 
22
22
  def quote_value(value)
23
- ActiveRecord::Base.connection.quote(value)
23
+ connection.quote(value)
24
24
  end
25
25
 
26
-
27
26
  def clear_table(table_sql)
28
- ActiveRecord::Base.connection.delete("DELETE FROM #{table_sql}", 'Clearing table')
27
+ connection.delete("DELETE FROM #{table_sql}", 'Clearing table')
29
28
  end
30
29
 
31
30
  def insert_into_table(table_sql, columns_sql, values_sql)
32
31
  values_sql = values_sql.join(',') if values_sql.is_a?(Array)
33
- ActiveRecord::Base.connection.insert("INSERT INTO #{table_sql} #{columns_sql} VALUES #{values_sql}", 'Loading dump')
32
+ connection.insert("INSERT INTO #{table_sql} #{columns_sql} VALUES #{values_sql}", 'Loading dump')
34
33
  end
35
34
 
36
35
  def fix_sequence!(table)
37
- if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
38
- ActiveRecord::Base.connection.reset_pk_sequence!(table)
39
- end
36
+ return unless connection.respond_to?(:reset_pk_sequence!)
37
+ connection.reset_pk_sequence!(table)
40
38
  end
41
39
 
42
40
  def join_for_sql(quoted)
@@ -51,9 +49,8 @@ class DumpRake
51
49
  join_for_sql(values.map{ |value| quote_value(value) })
52
50
  end
53
51
 
54
-
55
52
  def avaliable_tables
56
- ActiveRecord::Base.connection.tables
53
+ connection.tables
57
54
  end
58
55
 
59
56
  def tables_to_dump
@@ -67,7 +64,7 @@ class DumpRake
67
64
  end
68
65
 
69
66
  def table_row_count(table)
70
- ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM #{quote_table_name(table)}").to_i
67
+ connection.select_value("SELECT COUNT(*) FROM #{quote_table_name(table)}").to_i
71
68
  end
72
69
 
73
70
  CHUNK_SIZE_MIN = 100 unless const_defined?(:CHUNK_SIZE_MIN)
@@ -87,7 +84,7 @@ class DumpRake
87
84
  end
88
85
 
89
86
  def table_columns(table)
90
- ActiveRecord::Base.connection.columns(table)
87
+ connection.columns(table)
91
88
  end
92
89
 
93
90
  def table_has_primary_column?(table)
@@ -95,7 +92,7 @@ class DumpRake
95
92
  table_columns(table).any?{ |column| column.name == table_primary_key(table) && column.type == :integer }
96
93
  end
97
94
 
98
- def table_primary_key(table)
95
+ def table_primary_key(_table)
99
96
  'id'
100
97
  end
101
98
 
@@ -105,9 +102,9 @@ class DumpRake
105
102
  primary_key = table_primary_key(table)
106
103
  quoted_primary_key = "#{quote_table_name(table)}.#{quote_column_name(primary_key)}"
107
104
  select_where_primary_key =
108
- "SELECT * FROM #{quote_table_name(table)}" +
109
- " WHERE #{quoted_primary_key} %s" +
110
- " ORDER BY #{quoted_primary_key} ASC" +
105
+ "SELECT * FROM #{quote_table_name(table)}" \
106
+ " WHERE #{quoted_primary_key} %s" \
107
+ " ORDER BY #{quoted_primary_key} ASC" \
111
108
  " LIMIT #{chunk_size}"
112
109
  rows = select_all_by_sql(select_where_primary_key % '>= 0')
113
110
  until rows.blank?
@@ -125,7 +122,13 @@ class DumpRake
125
122
  end
126
123
 
127
124
  def select_all_by_sql(sql)
128
- ActiveRecord::Base.connection.select_all(sql)
125
+ connection.select_all(sql)
126
+ end
127
+
128
+ private
129
+
130
+ def connection
131
+ ActiveRecord::Base.connection
129
132
  end
130
133
  end
131
134
  end
@@ -1,5 +1,6 @@
1
1
  case
2
2
  when defined?(Rails::Generator::Base)
3
+ # Generator for rails < 3
3
4
  class AssetsConfigGenerator < Rails::Generator::Base
4
5
  def manifest
5
6
  record do |m|
@@ -8,6 +9,7 @@ when defined?(Rails::Generator::Base)
8
9
  end
9
10
  end
10
11
  when defined?(Rails::Generators::Base)
12
+ # Generator for rails >= 3
11
13
  class AssetsConfigGenerator < Rails::Generators::Base
12
14
  def create_assets_config
13
15
  create_file 'config/assets', File.read(File.join(File.dirname(__FILE__), 'templates/assets'))
@@ -1,4 +1,3 @@
1
- $: << File.join(File.dirname(__FILE__), '../../lib')
2
1
  require 'dump_rake'
3
2
 
4
3
  task :assets do
@@ -6,7 +5,7 @@ task :assets do
6
5
  end
7
6
 
8
7
  namespace :assets do
9
- desc "Delete assets" << DumpRake::Env.explain_variables_for_command(:assets)
8
+ desc 'Delete assets' << DumpRake::Env.explain_variables_for_command(:assets)
10
9
  task :delete => :assets do
11
10
  ENV['ASSETS'].split(':').each do |asset|
12
11
  DumpRake::Assets.glob_asset_children(asset, '*').each do |child|
@@ -1,26 +1,25 @@
1
- $: << File.join(File.dirname(__FILE__), '../../lib')
2
1
  require 'dump_rake'
3
2
 
4
- desc "Short for dump:create" << DumpRake::Env.explain_variables_for_command(:create)
3
+ desc 'Short for dump:create' << DumpRake::Env.explain_variables_for_command(:create)
5
4
  task :dump => 'dump:create'
6
5
 
7
6
  namespace :dump do
8
- desc "Show avaliable versions" << DumpRake::Env.explain_variables_for_command(:versions)
7
+ desc 'Show avaliable versions' << DumpRake::Env.explain_variables_for_command(:versions)
9
8
  task :versions => :environment do
10
9
  DumpRake.versions(DumpRake::Env.for_command(:versions))
11
10
  end
12
11
 
13
- desc "Create dump" << DumpRake::Env.explain_variables_for_command(:create)
12
+ desc 'Create dump' << DumpRake::Env.explain_variables_for_command(:create)
14
13
  task :create => :environment do
15
14
  DumpRake.create(DumpRake::Env.for_command(:create))
16
15
  end
17
16
 
18
- desc "Restore dump" << DumpRake::Env.explain_variables_for_command(:restore)
17
+ desc 'Restore dump' << DumpRake::Env.explain_variables_for_command(:restore)
19
18
  task :restore => :environment do
20
19
  DumpRake.restore(DumpRake::Env.for_command(:restore))
21
20
  end
22
21
 
23
- desc "Cleanup dumps" << DumpRake::Env.explain_variables_for_command(:cleanup)
22
+ desc 'Cleanup dumps' << DumpRake::Env.explain_variables_for_command(:cleanup)
24
23
  task :cleanup => :environment do
25
24
  DumpRake.cleanup(DumpRake::Env.for_command(:cleanup))
26
25
  end
@@ -1,343 +1 @@
1
- # encoding: UTF-8
2
-
3
- Capistrano::Configuration.instance(:i_need_this!).load do
4
- $: << File.join(File.dirname(__FILE__), '../lib')
5
- require 'fileutils'
6
- require 'shellwords'
7
-
8
- require 'dump_rake/continious_timeout'
9
- require 'dump_rake/env'
10
-
11
- begin
12
- nil.blank?
13
- rescue
14
- Object.class_eval do
15
- def blank?
16
- respond_to?(:empty?) ? empty? : !self
17
- end
18
- def present?
19
- !blank?
20
- end
21
- end
22
- end
23
-
24
- namespace :dump do
25
- def dump_command(command, env = {})
26
- rake = env.delete(:rake) || 'rake'
27
-
28
- # stringify_keys! from activesupport
29
- DumpRake::Env.stringify!(env)
30
-
31
- env.update(DumpRake::Env.for_command(command, true))
32
-
33
- cmd = %W[-s dump:#{command}]
34
- cmd += env.sort.map{ |key, value| "#{key}=#{value}" }
35
- "#{rake} #{cmd.shelljoin}"
36
- end
37
-
38
- def fetch_rails_env
39
- fetch(:rails_env, "production")
40
- end
41
-
42
- def got_rsync?
43
- `which rsync`
44
- $?.success?
45
- end
46
-
47
- def do_transfer_via(via, direction, from, to)
48
- case via
49
- when :rsync
50
- if run_local('which rsync').present? && $?.success?
51
- execute_on_servers do |servers|
52
- commands = servers.map do |server|
53
- target = sessions[server]
54
- user = target.options[:user] || fetch(:user, nil)
55
- host = target.host
56
- port = target.options[:port]
57
- full_host = "#{"#{user}@" if user.present?}#{host}"
58
-
59
- ssh = port.present? ? "ssh -p #{port}" : 'ssh'
60
- cmd = %W[rsync -P -e #{ssh} --timeout=15]
61
- case direction
62
- when :up
63
- cmd << from << "#{full_host}:#{to}"
64
- when :down
65
- cmd << "#{full_host}:#{from}" << to
66
- else
67
- raise "Don't know how to transfer in direction #{direction}"
68
- end
69
- cmd.shelljoin
70
- end
71
- commands.each do |cmd|
72
- logger.info cmd if logger
73
-
74
- 3.times do
75
- break if system(cmd)
76
- break unless [10, 11, 12, 23, 30, 35].include?($?.exitstatus)
77
- end
78
- raise "rsync returned #{$?.exitstatus}" unless $?.success?
79
- end
80
- end
81
- end
82
- when :sftp, :scp
83
- ContiniousTimeout.timeout 15 do |thread|
84
- transfer(direction, from, to, :via => via) do |channel, path, transfered, total|
85
- thread.defer
86
- progress = if transfered < total
87
- "\e[1m%5.1f%%\e[0m" % (transfered * 100.0 / total)
88
- else
89
- "100%"
90
- end
91
- $stderr << "\rTransfering: #{progress}"
92
- end
93
- end
94
- else
95
- raise "Unknown transfer method #{via}"
96
- end
97
- end
98
-
99
- def do_transfer(direction, from, to)
100
- if via = DumpRake::Env[:transfer_via]
101
- case via.downcase
102
- when 'rsync'
103
- do_transfer_via(:rsync, direction, from, to)
104
- when 'sftp'
105
- do_transfer_via(:sftp, direction, from, to)
106
- when 'scp'
107
- do_transfer_via(:scp, direction, from, to)
108
- else
109
- raise "Unknown transfer method #{via}"
110
- end
111
- else
112
- if got_rsync?
113
- do_transfer_via(:rsync, direction, from, to)
114
- else
115
- $stderr.puts "To transfer using rsync — make rsync binary accessible and verify that remote host can work with rsync through ssh"
116
- begin
117
- do_transfer_via(:sftp, direction, from, to)
118
- rescue => e
119
- $stderr.puts e
120
- do_transfer_via(:scp, direction, from, to)
121
- end
122
- end
123
- end
124
- end
125
-
126
- def with_additional_tags(*tags)
127
- tags = [tags, DumpRake::Env[:tags]].flatten.select(&:present?).join(',')
128
- DumpRake::Env.with_env(:tags => tags) do
129
- yield
130
- end
131
- end
132
-
133
- def print_and_return_or_fail
134
- out = yield
135
- raise 'Failed creating dump' if out.blank?
136
- print out
137
- out.strip
138
- end
139
-
140
- def run_local(cmd)
141
- `#{cmd}`
142
- end
143
-
144
- def run_remote(cmd)
145
- output = ''
146
- run(cmd) do |channel, io, data|
147
- case io
148
- when :out
149
- output << data
150
- when :err
151
- $stderr << data
152
- end
153
- end
154
- output
155
- end
156
-
157
- def last_part_of_last_line(out)
158
- if line = out.strip.split(/\s*[\n\r]\s*/).last
159
- line.split("\t").last
160
- end
161
- end
162
-
163
- def fetch_rake
164
- fetch(:rake, nil)
165
- end
166
-
167
- def auto_backup?
168
- !DumpRake::Env.no?(:backup)
169
- end
170
-
171
- namespace :local do
172
- desc "Shorthand for dump:local:create" << DumpRake::Env.explain_variables_for_command(:create)
173
- task :default, :roles => :db, :only => {:primary => true} do
174
- create
175
- end
176
-
177
- desc "Create local dump" << DumpRake::Env.explain_variables_for_command(:create)
178
- task :create, :roles => :db, :only => {:primary => true} do
179
- print_and_return_or_fail do
180
- with_additional_tags('local') do
181
- run_local(dump_command(:create))
182
- end
183
- end
184
- end
185
-
186
- desc "Restore local dump" << DumpRake::Env.explain_variables_for_command(:restore)
187
- task :restore, :roles => :db, :only => {:primary => true} do
188
- run_local(dump_command(:restore))
189
- end
190
-
191
- desc "Versions of local dumps" << DumpRake::Env.explain_variables_for_command(:versions)
192
- task :versions, :roles => :db, :only => {:primary => true} do
193
- print run_local(dump_command(:versions, :show_size => true))
194
- end
195
-
196
- desc "Cleanup local dumps" << DumpRake::Env.explain_variables_for_command(:cleanup)
197
- task :cleanup, :roles => :db, :only => {:primary => true} do
198
- print run_local(dump_command(:cleanup))
199
- end
200
-
201
- desc "Upload dump" << DumpRake::Env.explain_variables_for_command(:transfer)
202
- task :upload, :roles => :db, :only => {:primary => true} do
203
- file = DumpRake::Env.with_env(:summary => nil) do
204
- last_part_of_last_line(run_local(dump_command(:versions)))
205
- end
206
- if file
207
- do_transfer :up, "dump/#{file}", "#{current_path}/dump/#{file}"
208
- end
209
- end
210
- end
211
-
212
- namespace :remote do
213
- desc "Shorthand for dump:remote:create" << DumpRake::Env.explain_variables_for_command(:create)
214
- task :default, :roles => :db, :only => {:primary => true} do
215
- remote.create
216
- end
217
-
218
- desc "Create remote dump" << DumpRake::Env.explain_variables_for_command(:create)
219
- task :create, :roles => :db, :only => {:primary => true} do
220
- print_and_return_or_fail do
221
- with_additional_tags('remote') do
222
- run_remote("cd #{current_path}; #{dump_command(:create, :rake => fetch_rake, :RAILS_ENV => fetch_rails_env, :PROGRESS_TTY => '+')}")
223
- end
224
- end
225
- end
226
-
227
- desc "Restore remote dump" << DumpRake::Env.explain_variables_for_command(:restore)
228
- task :restore, :roles => :db, :only => {:primary => true} do
229
- run_remote("cd #{current_path}; #{dump_command(:restore, :rake => fetch_rake, :RAILS_ENV => fetch_rails_env, :PROGRESS_TTY => '+')}")
230
- end
231
-
232
- desc "Versions of remote dumps" << DumpRake::Env.explain_variables_for_command(:versions)
233
- task :versions, :roles => :db, :only => {:primary => true} do
234
- print run_remote("cd #{current_path}; #{dump_command(:versions, :rake => fetch_rake, :RAILS_ENV => fetch_rails_env, :PROGRESS_TTY => '+', :show_size => true)}")
235
- end
236
-
237
- desc "Cleanup of remote dumps" << DumpRake::Env.explain_variables_for_command(:cleanup)
238
- task :cleanup, :roles => :db, :only => {:primary => true} do
239
- print run_remote("cd #{current_path}; #{dump_command(:cleanup, :rake => fetch_rake, :RAILS_ENV => fetch_rails_env, :PROGRESS_TTY => '+')}")
240
- end
241
-
242
- desc "Download dump" << DumpRake::Env.explain_variables_for_command(:transfer)
243
- task :download, :roles => :db, :only => {:primary => true} do
244
- file = DumpRake::Env.with_env(:summary => nil) do
245
- last_part_of_last_line(run_remote("cd #{current_path}; #{dump_command(:versions, :rake => fetch_rake, :RAILS_ENV => fetch_rails_env, :PROGRESS_TTY => '+')}"))
246
- end
247
- if file
248
- FileUtils.mkpath('dump')
249
- do_transfer :down, "#{current_path}/dump/#{file}", "dump/#{file}"
250
- end
251
- end
252
- end
253
-
254
- desc "Shorthand for dump:local:upload" << DumpRake::Env.explain_variables_for_command(:transfer)
255
- task :upload, :roles => :db, :only => {:primary => true} do
256
- local.upload
257
- end
258
-
259
- desc "Shorthand for dump:remote:download" << DumpRake::Env.explain_variables_for_command(:transfer)
260
- task :download, :roles => :db, :only => {:primary => true} do
261
- remote:download
262
- end
263
-
264
- namespace :mirror do
265
- desc "Creates local dump, uploads and restores on remote" << DumpRake::Env.explain_variables_for_command(:mirror)
266
- task :up, :roles => :db, :only => {:primary => true} do
267
- auto_backup = if auto_backup?
268
- with_additional_tags('auto-backup') do
269
- remote.create
270
- end
271
- end
272
- if !auto_backup? || auto_backup.present?
273
- file = with_additional_tags('mirror') do
274
- local.create
275
- end
276
- if file.present?
277
- DumpRake::Env.with_clean_env(:like => file) do
278
- local.upload
279
- remote.restore
280
- end
281
- end
282
- end
283
- end
284
-
285
- desc "Creates remote dump, downloads and restores on local" << DumpRake::Env.explain_variables_for_command(:mirror)
286
- task :down, :roles => :db, :only => {:primary => true} do
287
- auto_backup = if auto_backup?
288
- with_additional_tags('auto-backup') do
289
- local.create
290
- end
291
- end
292
- if !auto_backup? || auto_backup.present?
293
- file = with_additional_tags('mirror') do
294
- remote.create
295
- end
296
- if file.present?
297
- DumpRake::Env.with_clean_env(:like => file) do
298
- remote.download
299
- local.restore
300
- end
301
- end
302
- end
303
- end
304
- end
305
-
306
- namespace :backup do
307
- desc "Shorthand for dump:backup:create" << DumpRake::Env.explain_variables_for_command(:backup)
308
- task :default, :roles => :db, :only => {:primary => true} do
309
- create
310
- end
311
-
312
- desc "Creates remote dump and downloads to local (desc defaults to 'backup')" << DumpRake::Env.explain_variables_for_command(:backup)
313
- task :create, :roles => :db, :only => {:primary => true} do
314
- file = with_additional_tags('backup') do
315
- remote.create
316
- end
317
- if file.present?
318
- DumpRake::Env.with_clean_env(:like => file) do
319
- remote.download
320
- end
321
- end
322
- end
323
-
324
- desc "Uploads dump with backup tag and restores it on remote" << DumpRake::Env.explain_variables_for_command(:backup_restore)
325
- task :restore, :roles => :db, :only => {:primary => true} do
326
- file = with_additional_tags('backup') do
327
- last_part_of_last_line(run_local(dump_command(:versions)))
328
- end
329
- if file.present?
330
- DumpRake::Env.with_clean_env(:like => file) do
331
- local.upload
332
- remote.restore
333
- end
334
- end
335
- end
336
- end
337
- end
338
-
339
- after 'deploy:update_code' do
340
- from, to = %W[#{shared_path}/dump #{release_path}/dump]
341
- run "mkdir -p #{from}; rm -rf #{to}; ln -s #{from} #{to}"
342
- end
343
- end
1
+ require 'dump/capistrano'