wordmove 5.2.0 → 6.0.0.alpha.2

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 (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