wordmove 5.2.0 → 6.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +12 -5
  3. data/.rubocop.yml +2 -5
  4. data/.ruby-version +1 -1
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +15 -0
  7. data/Rakefile +4 -3
  8. data/exe/wordmove +2 -1
  9. data/lib/wordmove/actions/adapt_local_db.rb +103 -0
  10. data/lib/wordmove/actions/adapt_remote_db.rb +90 -0
  11. data/lib/wordmove/actions/backup_local_db.rb +58 -0
  12. data/lib/wordmove/actions/delete_local_file.rb +34 -0
  13. data/lib/wordmove/actions/delete_remote_file.rb +43 -0
  14. data/lib/wordmove/actions/filter_and_setup_tasks_to_run.rb +42 -0
  15. data/lib/wordmove/actions/ftp/backup_remote_db.rb +56 -0
  16. data/lib/wordmove/actions/ftp/cleanup_after_adapt.rb +72 -0
  17. data/lib/wordmove/actions/ftp/download_remote_db.rb +71 -0
  18. data/lib/wordmove/actions/ftp/get_directory.rb +67 -0
  19. data/lib/wordmove/actions/ftp/helpers.rb +91 -0
  20. data/lib/wordmove/actions/ftp/pull_wordpress.rb +56 -0
  21. data/lib/wordmove/actions/ftp/push_wordpress.rb +54 -0
  22. data/lib/wordmove/actions/ftp/put_and_import_dump_remotely.rb +83 -0
  23. data/lib/wordmove/actions/ftp/put_directory.rb +67 -0
  24. data/lib/wordmove/actions/get_file.rb +38 -0
  25. data/lib/wordmove/actions/helpers.rb +142 -0
  26. data/lib/wordmove/actions/put_file.rb +48 -0
  27. data/lib/wordmove/actions/run_after_pull_hook.rb +26 -0
  28. data/lib/wordmove/actions/run_after_push_hook.rb +26 -0
  29. data/lib/wordmove/actions/run_before_pull_hook.rb +26 -0
  30. data/lib/wordmove/actions/run_before_push_hook.rb +26 -0
  31. data/lib/wordmove/actions/run_local_command.rb +34 -0
  32. data/lib/wordmove/actions/setup_context_for_db.rb +78 -0
  33. data/lib/wordmove/actions/ssh/backup_remote_db.rb +51 -0
  34. data/lib/wordmove/actions/ssh/cleanup_after_adapt.rb +56 -0
  35. data/lib/wordmove/actions/ssh/download_remote_db.rb +78 -0
  36. data/lib/wordmove/actions/ssh/get_directory.rb +76 -0
  37. data/lib/wordmove/actions/ssh/helpers.rb +128 -0
  38. data/lib/wordmove/actions/ssh/pull_wordpress.rb +56 -0
  39. data/lib/wordmove/actions/ssh/push_wordpress.rb +54 -0
  40. data/lib/wordmove/actions/ssh/put_and_import_dump_remotely.rb +77 -0
  41. data/lib/wordmove/actions/ssh/put_directory.rb +76 -0
  42. data/lib/wordmove/actions/ssh/run_remote_command.rb +39 -0
  43. data/lib/wordmove/assets/dump.php.erb +6 -6
  44. data/lib/wordmove/assets/import.php.erb +7 -7
  45. data/lib/wordmove/assets/wordmove_schema_global.yml +2 -0
  46. data/lib/wordmove/assets/wordmove_schema_remote.yml +2 -2
  47. data/lib/wordmove/cli.rb +152 -91
  48. data/lib/wordmove/db_paths_config.rb +44 -0
  49. data/lib/wordmove/doctor/movefile.rb +8 -8
  50. data/lib/wordmove/doctor/mysql.rb +18 -15
  51. data/lib/wordmove/doctor/rsync.rb +2 -2
  52. data/lib/wordmove/doctor/ssh.rb +3 -3
  53. data/lib/wordmove/doctor/wpcli.rb +4 -4
  54. data/lib/wordmove/environments_list.rb +4 -4
  55. data/lib/wordmove/exceptions.rb +13 -0
  56. data/lib/wordmove/generators/movefile.rb +7 -5
  57. data/lib/wordmove/generators/movefile_adapter.rb +11 -5
  58. data/lib/wordmove/guardian.rb +5 -5
  59. data/lib/wordmove/hook.rb +15 -16
  60. data/lib/wordmove/logger.rb +11 -10
  61. data/lib/wordmove/movefile.rb +63 -59
  62. data/lib/wordmove/organizers/ftp/pull.rb +52 -0
  63. data/lib/wordmove/organizers/ftp/push.rb +53 -0
  64. data/lib/wordmove/organizers/ssh/pull.rb +52 -0
  65. data/lib/wordmove/organizers/ssh/push.rb +53 -0
  66. data/lib/wordmove/version.rb +1 -1
  67. data/lib/wordmove/wordpress_directory.rb +76 -8
  68. data/lib/wordmove/wpcli.rb +85 -0
  69. data/lib/wordmove.rb +33 -11
  70. data/wordmove.gemspec +37 -30
  71. metadata +141 -43
  72. data/lib/wordmove/deployer/base.rb +0 -193
  73. data/lib/wordmove/deployer/ftp.rb +0 -160
  74. data/lib/wordmove/deployer/ssh/default_sql_adapter.rb +0 -47
  75. data/lib/wordmove/deployer/ssh/wpcli_sql_adapter.rb +0 -55
  76. data/lib/wordmove/deployer/ssh.rb +0 -169
  77. data/lib/wordmove/sql_adapter/default.rb +0 -68
  78. data/lib/wordmove/sql_adapter/wpcli.rb +0 -54
  79. data/lib/wordmove/wordpress_directory/path.rb +0 -11
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordmove
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 6.0.0.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Verna
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: exe
14
14
  cert_chain: []
15
- date: 2020-12-13 00:00:00.000000000 Z
15
+ date: 2021-12-27 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activesupport
@@ -20,20 +20,14 @@ dependencies:
20
20
  requirements:
21
21
  - - "~>"
22
22
  - !ruby/object:Gem::Version
23
- version: '5.1'
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 5.1.1
23
+ version: '6.1'
27
24
  type: :runtime
28
25
  prerelease: false
29
26
  version_requirements: !ruby/object:Gem::Requirement
30
27
  requirements:
31
28
  - - "~>"
32
29
  - !ruby/object:Gem::Version
33
- version: '5.1'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 5.1.1
30
+ version: '6.1'
37
31
  - !ruby/object:Gem::Dependency
38
32
  name: colorize
39
33
  requirement: !ruby/object:Gem::Requirement
@@ -63,81 +57,109 @@ dependencies:
63
57
  - !ruby/object:Gem::Version
64
58
  version: 2.7.5
65
59
  - !ruby/object:Gem::Dependency
66
- name: kwalify
60
+ name: dry-configurable
67
61
  requirement: !ruby/object:Gem::Requirement
68
62
  requirements:
69
63
  - - "~>"
70
64
  - !ruby/object:Gem::Version
71
- version: '0'
65
+ version: 0.13.0
72
66
  type: :runtime
73
67
  prerelease: false
74
68
  version_requirements: !ruby/object:Gem::Requirement
75
69
  requirements:
76
70
  - - "~>"
77
71
  - !ruby/object:Gem::Version
78
- version: '0'
72
+ version: 0.13.0
79
73
  - !ruby/object:Gem::Dependency
80
- name: photocopier
74
+ name: kwalify
81
75
  requirement: !ruby/object:Gem::Requirement
82
76
  requirements:
83
- - - ">="
77
+ - - "~>"
84
78
  - !ruby/object:Gem::Version
85
- version: 1.4.0
79
+ version: 0.7.2
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
86
84
  - - "~>"
87
85
  - !ruby/object:Gem::Version
88
- version: '1.4'
86
+ version: 0.7.2
87
+ - !ruby/object:Gem::Dependency
88
+ name: light-service
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: 0.17.0
89
94
  type: :runtime
90
95
  prerelease: false
91
96
  version_requirements: !ruby/object:Gem::Requirement
92
97
  requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: 0.17.0
101
+ - !ruby/object:Gem::Dependency
102
+ name: photocopier
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '1.4'
93
108
  - - ">="
94
109
  - !ruby/object:Gem::Version
95
110
  version: 1.4.0
111
+ type: :runtime
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
96
115
  - - "~>"
97
116
  - !ruby/object:Gem::Version
98
117
  version: '1.4'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 1.4.0
99
121
  - !ruby/object:Gem::Dependency
100
- name: thor
122
+ name: dry-cli
101
123
  requirement: !ruby/object:Gem::Requirement
102
124
  requirements:
103
125
  - - "~>"
104
126
  - !ruby/object:Gem::Version
105
- version: 0.20.3
127
+ version: 0.7.0
106
128
  type: :runtime
107
129
  prerelease: false
108
130
  version_requirements: !ruby/object:Gem::Requirement
109
131
  requirements:
110
132
  - - "~>"
111
133
  - !ruby/object:Gem::Version
112
- version: 0.20.3
134
+ version: 0.7.0
113
135
  - !ruby/object:Gem::Dependency
114
- name: bundler
136
+ name: dry-files
115
137
  requirement: !ruby/object:Gem::Requirement
116
138
  requirements:
117
139
  - - "~>"
118
140
  - !ruby/object:Gem::Version
119
- version: '2.0'
120
- type: :development
141
+ version: 0.1.0
142
+ type: :runtime
121
143
  prerelease: false
122
144
  version_requirements: !ruby/object:Gem::Requirement
123
145
  requirements:
124
146
  - - "~>"
125
147
  - !ruby/object:Gem::Version
126
- version: '2.0'
148
+ version: 0.1.0
127
149
  - !ruby/object:Gem::Dependency
128
- name: priscilla
150
+ name: bundler
129
151
  requirement: !ruby/object:Gem::Requirement
130
152
  requirements:
131
153
  - - "~>"
132
154
  - !ruby/object:Gem::Version
133
- version: '1.0'
155
+ version: 2.3.3
134
156
  type: :development
135
157
  prerelease: false
136
158
  version_requirements: !ruby/object:Gem::Requirement
137
159
  requirements:
138
160
  - - "~>"
139
161
  - !ruby/object:Gem::Version
140
- version: '1.0'
162
+ version: 2.3.3
141
163
  - !ruby/object:Gem::Dependency
142
164
  name: pry-byebug
143
165
  requirement: !ruby/object:Gem::Requirement
@@ -186,28 +208,70 @@ dependencies:
186
208
  requirements:
187
209
  - - "~>"
188
210
  - !ruby/object:Gem::Version
189
- version: 0.76.0
211
+ version: 1.24.0
212
+ type: :development
213
+ prerelease: false
214
+ version_requirements: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - "~>"
217
+ - !ruby/object:Gem::Version
218
+ version: 1.24.0
219
+ - !ruby/object:Gem::Dependency
220
+ name: rubocop-rspec
221
+ requirement: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - "~>"
224
+ - !ruby/object:Gem::Version
225
+ version: 2.6.0
190
226
  type: :development
191
227
  prerelease: false
192
228
  version_requirements: !ruby/object:Gem::Requirement
193
229
  requirements:
194
230
  - - "~>"
195
231
  - !ruby/object:Gem::Version
196
- version: 0.76.0
232
+ version: 2.6.0
197
233
  - !ruby/object:Gem::Dependency
198
234
  name: simplecov
199
235
  requirement: !ruby/object:Gem::Requirement
200
236
  requirements:
201
237
  - - "~>"
202
238
  - !ruby/object:Gem::Version
203
- version: 0.17.1
239
+ version: 0.21.2
204
240
  type: :development
205
241
  prerelease: false
206
242
  version_requirements: !ruby/object:Gem::Requirement
207
243
  requirements:
208
244
  - - "~>"
209
245
  - !ruby/object:Gem::Version
210
- version: 0.17.1
246
+ version: 0.21.2
247
+ - !ruby/object:Gem::Dependency
248
+ name: yard
249
+ requirement: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ type: :development
255
+ prerelease: false
256
+ version_requirements: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ - !ruby/object:Gem::Dependency
262
+ name: yard-activesupport-concern
263
+ requirement: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: '0'
268
+ type: :development
269
+ prerelease: false
270
+ version_requirements: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
211
275
  description: Wordmove deploys your WordPress websites at the speed of light.
212
276
  email:
213
277
  - stefano.verna@welaika.com
@@ -231,6 +295,7 @@ files:
231
295
  - ".ruby-gemset"
232
296
  - ".ruby-version"
233
297
  - ".vscode/launch.json"
298
+ - ".yardopts"
234
299
  - CHANGELOG.md
235
300
  - CONTRIBUTING.md
236
301
  - Gemfile
@@ -259,17 +324,47 @@ files:
259
324
  - deploy/deploy.sh
260
325
  - exe/wordmove
261
326
  - lib/wordmove.rb
327
+ - lib/wordmove/actions/adapt_local_db.rb
328
+ - lib/wordmove/actions/adapt_remote_db.rb
329
+ - lib/wordmove/actions/backup_local_db.rb
330
+ - lib/wordmove/actions/delete_local_file.rb
331
+ - lib/wordmove/actions/delete_remote_file.rb
332
+ - lib/wordmove/actions/filter_and_setup_tasks_to_run.rb
333
+ - lib/wordmove/actions/ftp/backup_remote_db.rb
334
+ - lib/wordmove/actions/ftp/cleanup_after_adapt.rb
335
+ - lib/wordmove/actions/ftp/download_remote_db.rb
336
+ - lib/wordmove/actions/ftp/get_directory.rb
337
+ - lib/wordmove/actions/ftp/helpers.rb
338
+ - lib/wordmove/actions/ftp/pull_wordpress.rb
339
+ - lib/wordmove/actions/ftp/push_wordpress.rb
340
+ - lib/wordmove/actions/ftp/put_and_import_dump_remotely.rb
341
+ - lib/wordmove/actions/ftp/put_directory.rb
342
+ - lib/wordmove/actions/get_file.rb
343
+ - lib/wordmove/actions/helpers.rb
344
+ - lib/wordmove/actions/put_file.rb
345
+ - lib/wordmove/actions/run_after_pull_hook.rb
346
+ - lib/wordmove/actions/run_after_push_hook.rb
347
+ - lib/wordmove/actions/run_before_pull_hook.rb
348
+ - lib/wordmove/actions/run_before_push_hook.rb
349
+ - lib/wordmove/actions/run_local_command.rb
350
+ - lib/wordmove/actions/setup_context_for_db.rb
351
+ - lib/wordmove/actions/ssh/backup_remote_db.rb
352
+ - lib/wordmove/actions/ssh/cleanup_after_adapt.rb
353
+ - lib/wordmove/actions/ssh/download_remote_db.rb
354
+ - lib/wordmove/actions/ssh/get_directory.rb
355
+ - lib/wordmove/actions/ssh/helpers.rb
356
+ - lib/wordmove/actions/ssh/pull_wordpress.rb
357
+ - lib/wordmove/actions/ssh/push_wordpress.rb
358
+ - lib/wordmove/actions/ssh/put_and_import_dump_remotely.rb
359
+ - lib/wordmove/actions/ssh/put_directory.rb
360
+ - lib/wordmove/actions/ssh/run_remote_command.rb
262
361
  - lib/wordmove/assets/dump.php.erb
263
362
  - lib/wordmove/assets/import.php.erb
264
363
  - lib/wordmove/assets/wordmove_schema_global.yml
265
364
  - lib/wordmove/assets/wordmove_schema_local.yml
266
365
  - lib/wordmove/assets/wordmove_schema_remote.yml
267
366
  - lib/wordmove/cli.rb
268
- - lib/wordmove/deployer/base.rb
269
- - lib/wordmove/deployer/ftp.rb
270
- - lib/wordmove/deployer/ssh.rb
271
- - lib/wordmove/deployer/ssh/default_sql_adapter.rb
272
- - lib/wordmove/deployer/ssh/wpcli_sql_adapter.rb
367
+ - lib/wordmove/db_paths_config.rb
273
368
  - lib/wordmove/doctor.rb
274
369
  - lib/wordmove/doctor/movefile.rb
275
370
  - lib/wordmove/doctor/mysql.rb
@@ -285,18 +380,21 @@ files:
285
380
  - lib/wordmove/hook.rb
286
381
  - lib/wordmove/logger.rb
287
382
  - lib/wordmove/movefile.rb
288
- - lib/wordmove/sql_adapter/default.rb
289
- - lib/wordmove/sql_adapter/wpcli.rb
383
+ - lib/wordmove/organizers/ftp/pull.rb
384
+ - lib/wordmove/organizers/ftp/push.rb
385
+ - lib/wordmove/organizers/ssh/pull.rb
386
+ - lib/wordmove/organizers/ssh/push.rb
290
387
  - lib/wordmove/version.rb
291
388
  - lib/wordmove/wordpress_directory.rb
292
- - lib/wordmove/wordpress_directory/path.rb
389
+ - lib/wordmove/wpcli.rb
293
390
  - pkg/wordmove-0.0.1.gem
294
391
  - pkg/wordmove-0.0.2.gem
295
392
  - wordmove.gemspec
296
393
  homepage: https://github.com/welaika/wordmove
297
394
  licenses:
298
395
  - MIT
299
- metadata: {}
396
+ metadata:
397
+ rubygems_mfa_required: 'true'
300
398
  post_install_message: |2
301
399
  Starting from version 3.0.0 `database.charset` option is no longer accepted.
302
400
  Pass the '--default-charecter-set' flag into `database.mysqldump_options` or to
@@ -315,11 +413,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
315
413
  version: 2.6.0
316
414
  required_rubygems_version: !ruby/object:Gem::Requirement
317
415
  requirements:
318
- - - ">="
416
+ - - ">"
319
417
  - !ruby/object:Gem::Version
320
- version: '0'
418
+ version: 1.3.1
321
419
  requirements: []
322
- rubygems_version: 3.0.3
420
+ rubygems_version: 3.1.2
323
421
  signing_key:
324
422
  specification_version: 4
325
423
  summary: Wordmove, Capistrano for Wordpress
@@ -1,193 +0,0 @@
1
- module Wordmove
2
- module Deployer
3
- class Base
4
- attr_reader :options
5
- attr_reader :logger
6
- attr_reader :environment
7
-
8
- class << self
9
- def deployer_for(cli_options)
10
- movefile = Wordmove::Movefile.new(cli_options[:config])
11
- movefile.load_dotenv(cli_options)
12
-
13
- options = movefile.fetch.merge! cli_options
14
- environment = movefile.environment(cli_options)
15
-
16
- return FTP.new(environment, options) if options[environment][:ftp]
17
-
18
- if options[environment][:ssh] && options[:global][:sql_adapter] == 'wpcli'
19
- return Ssh::WpcliSqlAdapter.new(environment, options)
20
- end
21
-
22
- if options[environment][:ssh] && options[:global][:sql_adapter] == 'default'
23
- return Ssh::DefaultSqlAdapter.new(environment, options)
24
- end
25
-
26
- raise NoAdapterFound, "No valid adapter found."
27
- end
28
-
29
- def current_dir
30
- '.'
31
- end
32
-
33
- def logger(secrets)
34
- Logger.new(STDOUT, secrets).tap { |l| l.level = Logger::DEBUG }
35
- end
36
- end
37
-
38
- def initialize(environment, options = {})
39
- @environment = environment.to_sym
40
- @options = options
41
-
42
- movefile_secrets = Wordmove::Movefile.new(options[:config]).secrets
43
- @logger = self.class.logger(movefile_secrets)
44
- end
45
-
46
- def push_db
47
- logger.task "Pushing Database"
48
- end
49
-
50
- def pull_db
51
- logger.task "Pulling Database"
52
- end
53
-
54
- def remote_get_directory; end
55
-
56
- def remote_put_directory; end
57
-
58
- def exclude_dir_contents(path)
59
- "#{path}/*"
60
- end
61
-
62
- def push_wordpress
63
- logger.task "Pushing wordpress core"
64
-
65
- local_path = local_options[:wordpress_path]
66
- remote_path = remote_options[:wordpress_path]
67
- exclude_wp_content = exclude_dir_contents(local_wp_content_dir.relative_path)
68
- exclude_paths = paths_to_exclude.push(exclude_wp_content)
69
-
70
- remote_put_directory(local_path, remote_path, exclude_paths)
71
- end
72
-
73
- def pull_wordpress
74
- logger.task "Pulling wordpress core"
75
-
76
- local_path = local_options[:wordpress_path]
77
- remote_path = remote_options[:wordpress_path]
78
- exclude_wp_content = exclude_dir_contents(remote_wp_content_dir.relative_path)
79
- exclude_paths = paths_to_exclude.push(exclude_wp_content)
80
-
81
- remote_get_directory(remote_path, local_path, exclude_paths)
82
- end
83
-
84
- protected
85
-
86
- def paths_to_exclude
87
- remote_options[:exclude] || []
88
- end
89
-
90
- def run(command)
91
- logger.task_step true, command
92
- return true if simulate?
93
-
94
- system(command)
95
- raise ShellCommandError, "Return code reports an error" unless $CHILD_STATUS.success?
96
- end
97
-
98
- def download(url, local_path)
99
- logger.task_step true, "download #{url} > #{local_path}"
100
-
101
- return true if simulate?
102
-
103
- File.open(local_path, 'w') do |file|
104
- file << URI.open(url).read
105
- end
106
- end
107
-
108
- def simulate?
109
- options[:simulate]
110
- end
111
-
112
- [
113
- WordpressDirectory::Path::WP_CONTENT,
114
- WordpressDirectory::Path::PLUGINS,
115
- WordpressDirectory::Path::MU_PLUGINS,
116
- WordpressDirectory::Path::THEMES,
117
- WordpressDirectory::Path::UPLOADS,
118
- WordpressDirectory::Path::LANGUAGES
119
- ].each do |type|
120
- %i[remote local].each do |location|
121
- define_method "#{location}_#{type}_dir" do
122
- options = send("#{location}_options")
123
- WordpressDirectory.new(type, options)
124
- end
125
- end
126
- end
127
-
128
- def mysql_dump_command(options, save_to_path)
129
- command = ["mysqldump"]
130
- command << "--host=#{Shellwords.escape(options[:host])}" if options[:host].present?
131
- command << "--port=#{Shellwords.escape(options[:port])}" if options[:port].present?
132
- command << "--user=#{Shellwords.escape(options[:user])}" if options[:user].present?
133
- if options[:password].present?
134
- command << "--password=#{Shellwords.escape(options[:password])}"
135
- end
136
- command << "--result-file=\"#{save_to_path}\""
137
- if options[:mysqldump_options].present?
138
- command << Shellwords.split(options[:mysqldump_options])
139
- end
140
- command << Shellwords.escape(options[:name])
141
- command.join(" ")
142
- end
143
-
144
- def mysql_import_command(dump_path, options)
145
- command = ["mysql"]
146
- command << "--host=#{Shellwords.escape(options[:host])}" if options[:host].present?
147
- command << "--port=#{Shellwords.escape(options[:port])}" if options[:port].present?
148
- command << "--user=#{Shellwords.escape(options[:user])}" if options[:user].present?
149
- if options[:password].present?
150
- command << "--password=#{Shellwords.escape(options[:password])}"
151
- end
152
- command << "--database=#{Shellwords.escape(options[:name])}"
153
- command << Shellwords.split(options[:mysql_options]) if options[:mysql_options].present?
154
- command << "--execute=\"SET autocommit=0;SOURCE #{dump_path};COMMIT\""
155
- command.join(" ")
156
- end
157
-
158
- def compress_command(path)
159
- command = ["gzip"]
160
- command << "-9"
161
- command << "-f"
162
- command << "\"#{path}\""
163
- command.join(" ")
164
- end
165
-
166
- def uncompress_command(path)
167
- command = ["gzip"]
168
- command << "-d"
169
- command << "-f"
170
- command << "\"#{path}\""
171
- command.join(" ")
172
- end
173
-
174
- def local_delete(path)
175
- logger.task_step true, "delete: '#{path}'"
176
- File.delete(path) unless simulate?
177
- end
178
-
179
- def save_local_db(local_dump_path)
180
- # dump local mysql into file
181
- run mysql_dump_command(local_options[:database], local_dump_path)
182
- end
183
-
184
- def remote_options
185
- options[environment].clone
186
- end
187
-
188
- def local_options
189
- options[:local].clone
190
- end
191
- end
192
- end
193
- end
@@ -1,160 +0,0 @@
1
- module Wordmove
2
- module Deployer
3
- class FTP < Base
4
- def initialize(environment, options)
5
- super(environment, options)
6
- ftp_options = remote_options[:ftp]
7
- @copier = Photocopier::FTP.new(ftp_options).tap { |c| c.logger = logger }
8
- end
9
-
10
- def push_db
11
- super
12
-
13
- return true if simulate?
14
-
15
- local_dump_path = local_wp_content_dir.path("dump.sql")
16
- remote_dump_path = remote_wp_content_dir.path("dump.sql")
17
- local_backup_path = local_wp_content_dir.path("remote-backup-#{Time.now.to_i}.sql")
18
-
19
- download_remote_db(local_backup_path)
20
- save_local_db(local_dump_path)
21
-
22
- # gsub sql
23
- adapt_sql(local_dump_path, local_options, remote_options)
24
- # upload it
25
- remote_put(local_dump_path, remote_dump_path)
26
-
27
- import_remote_dump
28
-
29
- # remove dump remotely
30
- remote_delete(remote_dump_path)
31
- # and locally
32
- local_delete(local_dump_path)
33
- end
34
-
35
- def pull_db
36
- super
37
-
38
- return true if simulate?
39
-
40
- local_dump_path = local_wp_content_dir.path("dump.sql")
41
- local_backup_path = local_wp_content_dir.path("local-backup-#{Time.now.to_i}.sql")
42
-
43
- save_local_db(local_backup_path)
44
- download_remote_db(local_dump_path)
45
-
46
- # gsub sql
47
- adapt_sql(local_dump_path, remote_options, local_options)
48
- # import locally
49
- run mysql_import_command(local_dump_path, local_options[:database])
50
-
51
- # and locally
52
- if options[:debug]
53
- logger.debug "Remote dump located at: #{local_dump_path}"
54
- else
55
- local_delete(local_dump_path)
56
- end
57
- end
58
-
59
- private
60
-
61
- %w[uploads themes plugins mu_plugins languages].each do |task|
62
- define_method "push_#{task}" do
63
- logger.task "Pushing #{task.titleize}"
64
- local_path = send("local_#{task}_dir").path
65
- remote_path = send("remote_#{task}_dir").path
66
- remote_put_directory(local_path, remote_path, paths_to_exclude)
67
- end
68
-
69
- define_method "pull_#{task}" do
70
- logger.task "Pulling #{task.titleize}"
71
- local_path = send("local_#{task}_dir").path
72
- remote_path = send("remote_#{task}_dir").path
73
- remote_get_directory(remote_path, local_path, paths_to_exclude)
74
- end
75
- end
76
-
77
- %w[get get_directory put_directory delete].each do |command|
78
- define_method "remote_#{command}" do |*args|
79
- logger.task_step false, "#{command}: #{args.join(' ')}"
80
- @copier.send(command, *args) unless simulate?
81
- end
82
- end
83
-
84
- def remote_put(thing, path)
85
- if File.exist?(thing)
86
- logger.task_step false, "copying #{thing} to #{path}"
87
- else
88
- logger.task_step false, "write #{path}"
89
- end
90
- @copier.put(thing, path) unless simulate?
91
- end
92
-
93
- def escape_php(string)
94
- return '' unless string
95
-
96
- # replaces \ with \\
97
- # replaces ' with \'
98
- string.gsub('\\', '\\\\\\').gsub(/[']/, '\\\\\'')
99
- end
100
-
101
- def generate_dump_script(db, password)
102
- template = ERB.new File.read(File.join(File.dirname(__FILE__), "../assets/dump.php.erb"))
103
- template.result(binding)
104
- end
105
-
106
- def generate_import_script(db, password)
107
- template = ERB.new File.read(File.join(File.dirname(__FILE__), "../assets/import.php.erb"))
108
- template.result(binding)
109
- end
110
-
111
- def download_remote_db(local_dump_path)
112
- remote_dump_script = remote_wp_content_dir.path("dump.php")
113
- # generate a secure one-time password
114
- one_time_password = SecureRandom.hex(40)
115
- # generate dump script
116
- dump_script = generate_dump_script(remote_options[:database], one_time_password)
117
- # upload the dump script
118
- remote_put(dump_script, remote_dump_script)
119
- # download the resulting dump (using the password)
120
- dump_url = "#{remote_wp_content_dir.url('dump.php')}?shared_key=#{one_time_password}"
121
- download(dump_url, local_dump_path)
122
- # cleanup remotely
123
- remote_delete(remote_dump_script)
124
- remote_delete(remote_wp_content_dir.path("dump.mysql"))
125
- end
126
-
127
- def import_remote_dump
128
- temp_path = local_wp_content_dir.path("log.html")
129
- remote_import_script_path = remote_wp_content_dir.path("import.php")
130
- # generate a secure one-time password
131
- one_time_password = SecureRandom.hex(40)
132
- # generate import script
133
- import_script = generate_import_script(remote_options[:database], one_time_password)
134
- # upload import script
135
- remote_put(import_script, remote_import_script_path)
136
- # run import script
137
- import_url = [
138
- remote_wp_content_dir.url('import.php').to_s,
139
- "?shared_key=#{one_time_password}",
140
- "&start=1&foffset=0&totalqueries=0&fn=dump.sql"
141
- ].join
142
- download(import_url, temp_path)
143
- if options[:debug]
144
- logger.debug "Operation log located at: #{temp_path}"
145
- else
146
- local_delete(temp_path)
147
- end
148
- # remove script remotely
149
- remote_delete(remote_import_script_path)
150
- end
151
-
152
- def adapt_sql(save_to_path, local, remote)
153
- return if options[:no_adapt]
154
-
155
- logger.task_step true, "Adapt dump"
156
- SqlAdapter::Default.new(save_to_path, local, remote).adapt! unless simulate?
157
- end
158
- end
159
- end
160
- end