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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe407e16e7e4429e38fbfb9ee56e1918e7f6d40a8fdc8f3999d419134ffd8417
4
- data.tar.gz: 868152d983a5833d63ca1cc8d442b900ae4e892a6e18505cf61cdd7898ad3092
3
+ metadata.gz: 6a182f54bea0a027d35316cdf368c0c3c98a706bdc3bfbc176190fb7928a98df
4
+ data.tar.gz: 21ad918da1375bff9004661fcc6f2a3a951fe075b2d9baa722230137d0df7648
5
5
  SHA512:
6
- metadata.gz: af4b3aa6aee1709a2cef4295c32abda5fb247777306ff0a7bcb523310c82036d97f12e993c8aebe631868d6d886cb3d738bbb38829070c5bbf3ef38c80942a6f
7
- data.tar.gz: 8c6f937b0cda51db90afd5119677be8bffe7870e4ba29d7bc1c02c7e011ba1f169110f680a04d78d07d3d28165d474e156cdba03cf95bfe8d5c7a321d51a8d42
6
+ metadata.gz: 566f88fff0e931d3c9df3cb3a5f121be2e9f43ab8ba6ed7e5f33db3168e84f5b92b8c8b34cee36ef2304d4c478ee1fffbbcf64b3d6864fe6b0cddd2017e64bab
7
+ data.tar.gz: a2ccc8a72bfb597a600acfdffe0e1df4800e5bf34c0dc66d21fbf6d12c9c0f4163585a025cb37ea67f0d79adcfeef6ab901a18be5dddc099d17b0848c3bb7f60
@@ -15,16 +15,23 @@ on:
15
15
 
16
16
  jobs:
17
17
  test:
18
-
19
18
  runs-on: ubuntu-latest
19
+ container:
20
+ image: welaika/wordmove:latest
20
21
 
21
22
  steps:
22
23
  - uses: actions/checkout@v2
23
- - name: Set up Ruby
24
- uses: ruby/setup-ruby@v1
24
+ - name: Cache gems
25
+ uses: actions/cache@v2
25
26
  with:
26
- ruby-version: 2.6
27
+ path: .vendor/bundle
28
+ key: wordmove-${{ hashFiles('wordmove.gemspec') }}
29
+ - name: Install bundler
30
+ run: |
31
+ echo $(pwd)
32
+ bundle config set path .vendor/bundle
33
+ gem install bundler:2.3.3
27
34
  - name: Install dependencies
28
- run: bundle install
35
+ run : bundle install
29
36
  - name: Run tests
30
37
  run: bundle exec rake
data/.rubocop.yml CHANGED
@@ -1,7 +1,8 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 2.7.1
3
3
  DisplayCopNames: true
4
4
  DisplayStyleGuide: true
5
+ NewCops: enable
5
6
 
6
7
  Exclude:
7
8
  - 'bin/*'
@@ -27,10 +28,6 @@ Metrics/CyclomaticComplexity:
27
28
  Metrics/PerceivedComplexity:
28
29
  Max: 10
29
30
 
30
- Style/StringLiterals:
31
- Enabled: false
32
- EnforcedStyle: double_quotes
33
-
34
31
  Style/Documentation:
35
32
  Enabled: false
36
33
 
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.5
1
+ 2.7.1
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --plugin activesupport-concern
data/CONTRIBUTING.md CHANGED
@@ -77,6 +77,21 @@ or run the executable directly
77
77
  bin/wordmove --version
78
78
  ```
79
79
 
80
+ #### Documenting
81
+
82
+ A large part of the code is documented using https://yardoc.org/.
83
+
84
+ Please, stick with this practice when you're implementing new code. If you want to preview yard
85
+ documentation locally
86
+
87
+ ```
88
+ yard server -r
89
+ ```
90
+
91
+ then visit the served HTML at http://localhost:8808.
92
+
93
+ YARD documentation is automatically published by rubygems site at each release.
94
+
80
95
  ### Maintainer tasks
81
96
 
82
97
  ToDo:
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
  require 'rubocop/rake_task'
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec)
6
- task default: :spec
7
6
  RuboCop::RakeTask.new(:rubocop)
7
+
8
8
  task default: :rubocop
9
+ task default: :spec
data/exe/wordmove CHANGED
@@ -3,4 +3,5 @@
3
3
  $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
4
 
5
5
  require 'wordmove'
6
- Wordmove::CLI.start
6
+
7
+ Dry::CLI.new(Wordmove::CLI::Commands).call
@@ -0,0 +1,103 @@
1
+ module Wordmove
2
+ module Actions
3
+ #
4
+ # Adapt the local DB for the remote destination.
5
+ # "To adapt" in Wordmove jargon means to transform URLs strings into the database. This action
6
+ # will substitute local URLs with remote ones, in order to make the DB to work correctly once
7
+ # pushed to the remote wordpress installation.
8
+ #
9
+ class AdaptLocalDb
10
+ extend ::LightService::Action
11
+ include Wordmove::Actions::Helpers
12
+ include Wordmove::Wpcli
13
+
14
+ expects :local_options,
15
+ :remote_options,
16
+ :cli_options,
17
+ :logger,
18
+ :photocopier,
19
+ :db_paths
20
+
21
+ # @!method execute
22
+ # @param local_options [Hash] Local host options fetched from
23
+ # movefile (with symbolized keys)
24
+ # @param remote_options [Hash] Remote host options fetched from
25
+ # movefile (with symbolized keys)
26
+ # @param cli_options [Hash] Command line options
27
+ # @param logger [Wordmove::Logger]
28
+ # @param photocopier [Photocopier::SSH|Photocopier::FTP]
29
+ # @param db_paths [BbPathsConfig] Configuration object for database
30
+ # @!scope class
31
+ # @return [LightService::Context] Action's context
32
+ executed do |context| # rubocop:disable Metrics/BlockLength
33
+ next context if context.database_task == false
34
+
35
+ context.logger.task 'Adapt local DB'
36
+
37
+ unless wp_in_path?
38
+ raise UnmetPeerDependencyError, 'WP-CLI is not installed or not in your $PATH'
39
+ end
40
+
41
+ next context if simulate?(cli_options: context.cli_options)
42
+
43
+ result = Wordmove::Actions::RunLocalCommand.execute(
44
+ cli_options: context.cli_options,
45
+ logger: context.logger,
46
+ command: mysql_dump_command(
47
+ env_db_options: context.local_options[:database],
48
+ save_to_path: context.db_paths.local.path
49
+ )
50
+ )
51
+ context.fail_and_return!(result.message) if result.failure?
52
+
53
+ if context.cli_options[:no_adapt]
54
+ context.logger.warn 'Skipping DB adapt'
55
+ else
56
+ result = Wordmove::Actions::RunLocalCommand.execute(
57
+ cli_options: context.cli_options,
58
+ logger: context.logger,
59
+ command: wpcli_search_replace_command(context, :vhost)
60
+ )
61
+ context.fail_and_return!(result.message) if result.failure?
62
+
63
+ result = Wordmove::Actions::RunLocalCommand.execute(
64
+ cli_options: context.cli_options,
65
+ logger: context.logger,
66
+ command: wpcli_search_replace_command(context, :wordpress_path)
67
+ )
68
+ context.fail_and_return!(result.message) if result.failure?
69
+ end
70
+
71
+ result = Wordmove::Actions::RunLocalCommand.execute(
72
+ cli_options: context.cli_options,
73
+
74
+ logger: context.logger,
75
+ command: mysql_dump_command(
76
+ env_db_options: context.local_options[:database],
77
+ save_to_path: context.db_paths.local.adapted_path
78
+ )
79
+ )
80
+ context.fail_and_return!(result.message) if result.failure?
81
+
82
+ if context.photocopier.is_a? Photocopier::SSH
83
+ result = Wordmove::Actions::RunLocalCommand.execute(
84
+ cli_options: context.cli_options,
85
+ logger: context.logger,
86
+ command: compress_command(file_path: context.db_paths.local.adapted_path)
87
+ )
88
+ context.fail_and_return!(result.message) if result.failure?
89
+ end
90
+
91
+ result = Wordmove::Actions::RunLocalCommand.execute(
92
+ cli_options: context.cli_options,
93
+ logger: context.logger,
94
+ command: mysql_import_command(
95
+ dump_path: context.db_paths.local.path,
96
+ env_db_options: context.local_options[:database]
97
+ )
98
+ )
99
+ context.fail_and_return!(result.message) if result.failure?
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,90 @@
1
+ module Wordmove
2
+ module Actions
3
+ #
4
+ # Adapt the remote DB for the local destination.
5
+ # "To adapt" in Wordmove jargon means to transform URLs strings into the database. This action
6
+ # will substitute remote URLs with local ones, in order to make the DB to work correctly once
7
+ # pulled to the local wordpress installation.
8
+ #
9
+ # @note This action is not responsible to download the remote DB nor to backup any DB at all.
10
+ # It expects to find a dump of the remote DB into +context.db_paths.local.gzipped_path+
11
+ # (SSH) or +context.db_paths.local.path+ (FTP), otherwise it will fail and stop the
12
+ # procedure.
13
+ #
14
+ class AdaptRemoteDb
15
+ extend ::LightService::Action
16
+ include Wordmove::Actions::Helpers
17
+ include Wordmove::Wpcli
18
+
19
+ expects :local_options,
20
+ :cli_options,
21
+ :logger,
22
+ :db_paths
23
+
24
+ # @!method execute
25
+ # @param local_options [Hash] Local host options fetched from
26
+ # movefile (with symbolized keys)
27
+ # @param cli_options [Hash] Command line options
28
+ # @param logger [Wordmove::Logger]
29
+ # @param db_paths [BbPathsConfig] Configuration object for database
30
+ # @!scope class
31
+ # @return [LightService::Context] Action's context
32
+ executed do |context| # rubocop:disable Metrics/BlockLength
33
+ next context if context.database_task == false
34
+
35
+ context.logger.task 'Adapt remote DB'
36
+
37
+ unless wp_in_path?
38
+ raise UnmetPeerDependencyError, 'WP-CLI is not installed or not in your $PATH'
39
+ end
40
+
41
+ next context if simulate?(cli_options: context.cli_options)
42
+
43
+ if File.exist?(context.db_paths.local.gzipped_path)
44
+ Wordmove::Actions::RunLocalCommand.execute(
45
+ cli_options: context.cli_options,
46
+ logger: context.logger,
47
+ command: uncompress_command(file_path: context.db_paths.local.gzipped_path)
48
+ )
49
+ end
50
+
51
+ unless File.exist?(context.db_paths.local.path)
52
+ context.fail_and_return!(
53
+ "Cannot find the dump file to adapt in #{context.db_paths.local.path}"
54
+ )
55
+ end
56
+
57
+ result = Wordmove::Actions::RunLocalCommand.execute(
58
+ cli_options: context.cli_options,
59
+ logger: context.logger,
60
+ command: mysql_import_command(
61
+ dump_path: context.db_paths.local.path,
62
+ env_db_options: context.local_options[:database]
63
+ )
64
+ )
65
+ context.fail_and_return!(result.message) if result.failure?
66
+
67
+ if context.cli_options[:no_adapt]
68
+ context.logger.warn 'Skipping DB adapt'
69
+ next context
70
+ end
71
+
72
+ result = Wordmove::Actions::RunLocalCommand.execute(
73
+ cli_options: context.cli_options,
74
+ logger: context.logger,
75
+ command: wpcli_search_replace_command(context, :vhost)
76
+ )
77
+ context.fail_and_return!(result.message) if result.failure?
78
+
79
+ result = Wordmove::Actions::RunLocalCommand.execute(
80
+ cli_options: context.cli_options,
81
+ logger: context.logger,
82
+ command: wpcli_search_replace_command(context, :wordpress_path)
83
+ )
84
+ context.fail_and_return!(result.message) if result.failure?
85
+
86
+ context.logger.success 'Local DB adapted'
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,58 @@
1
+ module Wordmove
2
+ module Actions
3
+ #
4
+ # Take a backup of the local database and save it in +wp-content/+ folder.
5
+ #
6
+ class BackupLocalDb
7
+ extend ::LightService::Action
8
+ include Wordmove::Actions::Helpers
9
+
10
+ expects :local_options
11
+ expects :cli_options
12
+ expects :db_paths
13
+ expects :logger
14
+
15
+ # @!method execute
16
+ # @param local_options [Hash] Local host options fetched from
17
+ # movefile (with symbolized keys)
18
+ # @param cli_options [Hash] Command line options
19
+ # @param db_paths [BbPathsConfig] Configuration object for database
20
+ # @param logger [Wordmove::Logger]
21
+ # @!scope class
22
+ # @return [LightService::Context] Action's context
23
+ executed do |context|
24
+ next context if context.database_task == false
25
+
26
+ context.logger.task 'Backup local DB'
27
+
28
+ if simulate?(cli_options: context.cli_options)
29
+ context.logger.info 'A backup of the local DB would have been saved into ' \
30
+ "#{context.db_paths.backup.local.gzipped_path}, " \
31
+ 'but you\'re simulating'
32
+ next context
33
+ end
34
+
35
+ result = Wordmove::Actions::RunLocalCommand.execute(
36
+ cli_options: context.cli_options,
37
+ logger: context.logger,
38
+ command: mysql_dump_command(
39
+ env_db_options: context.local_options[:database],
40
+ save_to_path: context.db_paths.backup.local.path
41
+ )
42
+ )
43
+ context.fail_and_return!(result.message) if result.failure?
44
+
45
+ result = Wordmove::Actions::RunLocalCommand.execute(
46
+ cli_options: context.cli_options,
47
+ logger: context.logger,
48
+ command: compress_command(file_path: context.db_paths.backup.local.path)
49
+ )
50
+ context.fail_and_return!(result.message) if result.failure?
51
+
52
+ context.logger.success(
53
+ "Backup saved at #{context.db_paths.backup.local.gzipped_path}"
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ module Wordmove
2
+ module Actions
3
+ # Delete a local file situated at the given path.
4
+ # Command won't be run if +--simulate+ flag is present on CLI.
5
+ # @note This action is *not* meant to be organized, but as a standalone one.
6
+ class DeleteLocalFile
7
+ extend LightService::Action
8
+ include Wordmove::Actions::Helpers
9
+
10
+ expects :file_path,
11
+ :logger,
12
+ :cli_options
13
+
14
+ # @!method execute
15
+ # @param file_path [String]
16
+ # @param logger [Wordmove::Logger]
17
+ # @param cli_options [Hash] Command line options (with symbolized keys)
18
+ # @!scope class
19
+ # @return [LightService::Context] Action's context
20
+ executed do |context|
21
+ context.logger.task_step true, "delete: '#{context.file_path}'"
22
+
23
+ next context if simulate?(cli_options: context.cli_options)
24
+
25
+ unless File.exist?(context.file_path)
26
+ context.logger.info "File #{context.file_path} does not exist. Nothing done."
27
+ next context
28
+ end
29
+
30
+ File.delete(context.file_path)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,43 @@
1
+ module Wordmove
2
+ module Actions
3
+ # Delete a remote file
4
+ # @note This action is *not* meant to be organized, but as a standalone one.
5
+ class DeleteRemoteFile
6
+ extend LightService::Action
7
+ include Wordmove::Actions::Helpers
8
+
9
+ expects :photocopier,
10
+ :logger,
11
+ :cli_options,
12
+ :remote_file
13
+
14
+ # @!method execute
15
+ # @param photocopier [Photocopier]
16
+ # @param logger [Wordmove::Logger]
17
+ # @param cli_options [Hash] Command line options (with symbolized keys)
18
+ # @param remote_file ((String) remote file path)
19
+ # @!scope class
20
+ # @return [LightService::Context] Action's context
21
+ executed do |context|
22
+ command = 'delete'
23
+
24
+ context.logger.task_step false, "#{command}: #{context.remote_file}"
25
+
26
+ next context if simulate?(cli_options: context.cli_options)
27
+
28
+ _stdout, stderr, exit_code = context.photocopier.send(command, context.remote_file)
29
+
30
+ next context if exit_code&.zero?
31
+
32
+ # When +context.photocopier+ is a +Photocopier::FTP+ instance, +delte+ will always
33
+ # return +nil+; so it's impossible to correctly fail the context when using
34
+ # FTP protocol. The problem is how +Net::FTP+ ruby class behaves.
35
+ # IMO this is an acceptable tradeoff.
36
+ unless exit_code.nil?
37
+ context.fail! "Error code #{exit_code} returned while deleting file "\
38
+ "#{context.remote_file}: #{stderr}"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,42 @@
1
+ module Wordmove
2
+ module Actions
3
+ # Given the command line options and given the denied-by-config actions,
4
+ # selects the actions to be run altering the context.
5
+ class FilterAndSetupTasksToRun
6
+ extend ::LightService::Action
7
+ include Wordmove::Actions::Helpers
8
+ include Wordmove::Actions::Ssh::Helpers
9
+ include WordpressDirectory::RemoteHelperMethods
10
+
11
+ expects :guardian,
12
+ :cli_options
13
+ promises :folder_tasks,
14
+ :database_task,
15
+ :wordpress_task
16
+
17
+ # @!method execute
18
+ # @param guardian [Wordmove::Guardian]
19
+ # @param cli_options [Hash]
20
+ # @!scope class
21
+ # @return [LightService::Context] Action's context
22
+ executed do |context|
23
+ all_tasks = Wordmove::CLI::PullPushShared::WORDPRESS_OPTIONS
24
+
25
+ requested_tasks = all_tasks.select do |task|
26
+ context.cli_options[task] ||
27
+ (context.cli_options[:all] && context.cli_options[task] != false)
28
+ end
29
+
30
+ allowed_tasks = requested_tasks.select { |task| context.guardian.allows task }
31
+
32
+ # Since we `promises` the following variables, we cannot set them as `nil`
33
+ context.database_task = allowed_tasks.delete(:db) || false
34
+ context.wordpress_task = allowed_tasks.delete(:wordpress) || false
35
+ # :db and :wordpress were just removed, so we consider
36
+ # the reminders as folder tasks. It's a weak assumption
37
+ # though.
38
+ context.folder_tasks = allowed_tasks
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,56 @@
1
+ module Wordmove
2
+ module Actions
3
+ module Ftp
4
+ # Bakups an already downloaded remote DB dump
5
+ class BackupRemoteDb
6
+ extend ::LightService::Action
7
+ include Wordmove::Actions::Helpers
8
+
9
+ expects :remote_options,
10
+ :cli_options,
11
+ :logger,
12
+ :photocopier,
13
+ :db_paths
14
+
15
+ # @!method execute
16
+ # @param remote_options [Hash] Options for the remote host fetched from the movefile
17
+ # @param cli_options [Hash] Command line options (with symbolized keys)
18
+ # @param logger [Wordmove::Logger]
19
+ # @param photocopier [Photocopier::FTP]
20
+ # @param db_paths [BbPathsConfig] Configuration object for database
21
+ # @!scope class
22
+ # @return [LightService::Context] Action's context
23
+ executed do |context|
24
+ next context if context.database_task == false
25
+
26
+ context.logger.task 'Backup remote DB'
27
+
28
+ if simulate?(cli_options: context.cli_options)
29
+ context.logger.info 'A backup of the remote DB would have been saved into ' \
30
+ "#{context.db_paths.backup.remote.gzipped_path}, " \
31
+ 'but you\'re simulating'
32
+ next context
33
+ end
34
+
35
+ begin
36
+ result = Wordmove::Actions::RunLocalCommand.execute(
37
+ logger: context.logger,
38
+ cli_options: context.cli_options,
39
+ command: compress_command(file_path: context.db_paths.local.path)
40
+ )
41
+ raise(result.message) if result.failure?
42
+
43
+ FileUtils.mv(
44
+ context.db_paths.local.gzipped_path,
45
+ context.db_paths.backup.remote.gzipped_path
46
+ )
47
+
48
+ context.logger.success("Backup saved at #{context.db_paths.backup.remote.gzipped_path}")
49
+ rescue Errno::ENOENT, RuntimeError => e
50
+ context.fail_and_return!("Remote DB backup failed with: <#{e.message}>. Aborting.")
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,72 @@
1
+ module Wordmove
2
+ module Actions
3
+ module Ftp
4
+ # Cleanup file created during DB push/pull operations
5
+ class CleanupAfterAdapt
6
+ extend ::LightService::Action
7
+ include Wordmove::Actions::Helpers
8
+
9
+ expects :db_paths,
10
+ :cli_options,
11
+ :logger,
12
+ :photocopier
13
+
14
+ # @!method execute
15
+ # @param logger [Wordmove::Logger]
16
+ # @param cli_options [Hash] Command line options (with symbolized keys)
17
+ # @param db_paths [BbPathsConfig] Configuration object for database
18
+ # @param photocopier [Photocopier::FTP]
19
+ # @!scope class
20
+ # @return [LightService::Context] Action's context
21
+ executed do |context| # rubocop:disable Metrics/BlockLength
22
+ next context if context.database_task == false
23
+
24
+ context.logger.task 'Cleanup'
25
+
26
+ if simulate?(cli_options: context.cli_options)
27
+ context.logger.info 'No cleanup during simulation'
28
+ next context
29
+ end
30
+
31
+ result = Wordmove::Actions::DeleteLocalFile.execute(
32
+ logger: context.logger,
33
+ cli_options: context.cli_options,
34
+ file_path: context.db_paths.local.path
35
+ )
36
+
37
+ if result.failure?
38
+ context.logger.warning 'Failed to delete local file ' \
39
+ "#{context.db_paths.local.path} because: " \
40
+ "#{result.message}" \
41
+ '. Manual intervention required'
42
+ end
43
+
44
+ [
45
+ context.db_paths.ftp.remote.dump_script_path,
46
+ context.db_paths.ftp.remote.import_script_path,
47
+ context.db_paths.remote.path,
48
+ context.db_paths.ftp.remote.dumped_path
49
+ ].each do |file|
50
+ begin
51
+ result = Wordmove::Actions::DeleteRemoteFile.execute(
52
+ photocopier: context.photocopier,
53
+ logger: context.logger,
54
+ cli_options: context.cli_options,
55
+ remote_file: file
56
+ )
57
+ rescue Net::FTPPermError => _e
58
+ context.logger.info "#{file} doesn't exist remotely. Nothing to cleanup"
59
+ end
60
+
61
+ if result.failure? # rubocop:disable Style/Next
62
+ context.logger.warning 'Failed to delete remote file ' \
63
+ "#{file} because: " \
64
+ "#{result.message}" \
65
+ '. Manual intervention required'
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end