dkdeploy-typo3-cms 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rubocop.yml +23 -0
- data/.travis.yml +12 -0
- data/Berksfile +3 -0
- data/Berksfile.lock +66 -0
- data/CHANGELOG.md +12 -0
- data/CONTRIBUTORS.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE +7 -0
- data/README.md +87 -0
- data/Rakefile +1 -0
- data/Vagrantfile +62 -0
- data/assets/dkdeploy-logo.png +0 -0
- data/config/vm/cookbooks/dkdeploy-typo3-cms/metadata.rb +12 -0
- data/config/vm/cookbooks/dkdeploy-typo3-cms/recipes/default.rb +71 -0
- data/dkdeploy-typo3-cms.gemspec +29 -0
- data/features/advanced_typo3.feature +156 -0
- data/features/caretaker_key_management.feature +36 -0
- data/features/clear_cache_on_rollback.feature +17 -0
- data/features/cli.feature +61 -0
- data/features/step_definitions/mysql.rb +75 -0
- data/features/step_definitions/typo3.rb +16 -0
- data/features/support/env.rb +11 -0
- data/features/typo3.feature +100 -0
- data/features/typoscript_upload_and_merge_config.feature +128 -0
- data/features/typoscript_upload_and_merge_pagets.feature +128 -0
- data/features/typoscript_upload_and_merge_userts.feature +128 -0
- data/features/update_database.feature +23 -0
- data/lib/capistrano/dkdeploy/typo3_cms.rb +37 -0
- data/lib/dkdeploy/typo3/cms.rb +1 -0
- data/lib/dkdeploy/typo3/cms/dsl.rb +27 -0
- data/lib/dkdeploy/typo3/cms/helpers/cli.rb +165 -0
- data/lib/dkdeploy/typo3/cms/helpers/erb.rb +25 -0
- data/lib/dkdeploy/typo3/cms/i18n.rb +111 -0
- data/lib/dkdeploy/typo3/cms/tasks/cache.rake +18 -0
- data/lib/dkdeploy/typo3/cms/tasks/caretaker_key_management.rake +60 -0
- data/lib/dkdeploy/typo3/cms/tasks/cli.rake +45 -0
- data/lib/dkdeploy/typo3/cms/tasks/typo3.rake +272 -0
- data/lib/dkdeploy/typo3/cms/tasks/typoscript.rake +288 -0
- data/lib/dkdeploy/typo3/cms/version.rb +16 -0
- data/spec/fixtures/application/Capfile +8 -0
- data/spec/fixtures/application/Gemfile +3 -0
- data/spec/fixtures/application/config/deploy.rb +8 -0
- data/spec/fixtures/application/config/deploy/dev.rb +41 -0
- data/spec/fixtures/application/htdocs/.hidden/.gitkeep +0 -0
- data/spec/fixtures/application/htdocs/catalog/index.html +1 -0
- data/spec/fixtures/application/htdocs/composer.json +24 -0
- data/spec/fixtures/application/htdocs/typo3/cli_dispatch.phpsh +2 -0
- data/spec/fixtures/application/htdocs/typo3conf/AdditionalConfiguration.php +3 -0
- data/spec/fixtures/application/htdocs/typo3conf/LocalConfiguration.php +28 -0
- data/spec/fixtures/application/htdocs/typo3conf/PackageStates.php +358 -0
- data/spec/fixtures/application/vendor/composer.phar +0 -0
- data/spec/fixtures/capistrano/configuration/additional_configuration_for_server.rb +1 -0
- data/spec/fixtures/capistrano/configuration/cli_break_after_one_run_in_release_path.rb +14 -0
- data/spec/fixtures/capistrano/configuration/cli_break_after_three_runs_in_release_path.rb +14 -0
- data/spec/fixtures/capistrano/configuration/cli_test_tasks.rb +19 -0
- data/spec/fixtures/capistrano/configuration/cli_test_tasks_with_path.rb +15 -0
- data/vendor/AdditionalConfiguration.php.erb +57 -0
- data/vendor/create_caretaker_instance_keys.php.erb +18 -0
- metadata +222 -0
@@ -0,0 +1,272 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'dkdeploy/typo3/cms/dsl'
|
4
|
+
require 'dkdeploy/typo3/cms/i18n'
|
5
|
+
require 'dkdeploy/helpers/common'
|
6
|
+
require 'dkdeploy/interaction_handler/password'
|
7
|
+
require 'phpass'
|
8
|
+
require 'shellwords'
|
9
|
+
|
10
|
+
require 'erb'
|
11
|
+
require 'dkdeploy/typo3/cms/helpers/erb'
|
12
|
+
|
13
|
+
include Dkdeploy::Typo3::Cms::Helpers::Erb
|
14
|
+
include Dkdeploy::Helpers::Common
|
15
|
+
include Dkdeploy::Typo3::DSL
|
16
|
+
|
17
|
+
namespace :typo3 do
|
18
|
+
namespace :cms do
|
19
|
+
desc 'Clear typo3temp directory'
|
20
|
+
task :clear_typo3temp do
|
21
|
+
on release_roles :app do
|
22
|
+
info I18n.t('tasks.clear_temp.clear', scope: :dkdeploy)
|
23
|
+
execute :rm, '-rf', File.join(release_path, 'typo3temp', '*')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Disable TYPO3 install tool'
|
28
|
+
task :disable_install_tool do
|
29
|
+
flag = File.join(current_path, 'typo3conf', 'ENABLE_INSTALL_TOOL')
|
30
|
+
|
31
|
+
on release_roles :app do
|
32
|
+
if test "[ -f #{flag} ]"
|
33
|
+
info I18n.t('tasks.install_tool.disable', scope: :dkdeploy)
|
34
|
+
execute :rm, flag
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc 'Enable TYPO3 install tool'
|
40
|
+
task :enable_install_tool do
|
41
|
+
on release_roles :app do
|
42
|
+
info I18n.t('tasks.install_tool.enable', scope: :dkdeploy)
|
43
|
+
execute :mkdir, '-p', File.join(current_path, 'typo3conf')
|
44
|
+
execute :touch, File.join(current_path, 'typo3conf', 'ENABLE_INSTALL_TOOL')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'Create TYPO3 database config file'
|
49
|
+
task :create_db_credentials do
|
50
|
+
on release_roles(:app), in: :sequence do |server|
|
51
|
+
db_settings = read_db_settings_for_context(self)
|
52
|
+
if db_settings.nil?
|
53
|
+
# No database settings found. Set database settings for current host
|
54
|
+
invoke_for_server server, 'db:upload_settings'
|
55
|
+
db_settings = read_db_settings_for_context(self)
|
56
|
+
end
|
57
|
+
|
58
|
+
config_file_content = <<CONFIG_FILE_CONTENT
|
59
|
+
<?php
|
60
|
+
$GLOBALS['TYPO3_CONF_VARS']['DB']['database'] = '#{db_settings.fetch('name')}';
|
61
|
+
$GLOBALS['TYPO3_CONF_VARS']['DB']['host'] = '#{db_settings.fetch('host')}';
|
62
|
+
$GLOBALS['TYPO3_CONF_VARS']['DB']['username'] = '#{db_settings.fetch('username')}';
|
63
|
+
$GLOBALS['TYPO3_CONF_VARS']['DB']['password'] = '#{db_settings.fetch('password')}';
|
64
|
+
$GLOBALS['TYPO3_CONF_VARS']['DB']['port'] = #{db_settings.fetch('port')};
|
65
|
+
CONFIG_FILE_CONTENT
|
66
|
+
|
67
|
+
upload! StringIO.new(config_file_content), File.join(shared_path, 'config', "db_settings.#{fetch(:stage)}.php")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
desc 'Download extension to local workspace'
|
72
|
+
task :fetch_extension, :extension do |_, args|
|
73
|
+
extension = ask_variable(args, :extension, 'tasks.fetch_extension.extension_name')
|
74
|
+
FileUtils.mkdir_p File.join('temp', 'extensions')
|
75
|
+
FileUtils.remove_dir File.join('temp', 'extensions', extension), true
|
76
|
+
source = File.join(current_path, 'typo3conf', 'ext', extension)
|
77
|
+
target = File.join('temp', 'extensions')
|
78
|
+
|
79
|
+
on primary(:backend) do
|
80
|
+
if test "[ -d #{File.join(current_path, 'typo3conf', 'ext', extension)} ]"
|
81
|
+
# download to temp
|
82
|
+
info I18n.t('tasks.fetch_extension.download', extension: extension, scope: :dkdeploy)
|
83
|
+
download! source, target, via: :scp, recursive: true
|
84
|
+
else
|
85
|
+
error I18n.t('tasks.fetch_extension.extension_not_found', extension: extension, scope: :dkdeploy)
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
run_locally do
|
91
|
+
# rsync to htdocs/typo3temp/ext
|
92
|
+
info I18n.t('tasks.fetch_extension.rsync', extension: extension, scope: :dkdeploy)
|
93
|
+
rsync_excludes = []
|
94
|
+
rsync_exclude_directories = %w(.git/ .svn/)
|
95
|
+
rsync_exclude_directories.each do |exclude|
|
96
|
+
rsync_excludes << '--exclude=' + exclude
|
97
|
+
end
|
98
|
+
execute :rsync, '-vrS', '--force', '-C', '--delete', rsync_excludes, File.join('temp', 'extensions', extension, '/'), File.join('htdocs', 'typo3conf', 'ext', extension, '/')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
desc 'Output a generated encryption key'
|
103
|
+
task :generate_encryption_key do
|
104
|
+
puts SecureRandom.hex(48)
|
105
|
+
end
|
106
|
+
|
107
|
+
desc 'Create encryption key file on server'
|
108
|
+
task :create_encryption_key_file, :encryption_key do |_, args|
|
109
|
+
encryption_key_file_path = File.join(shared_path, 'config')
|
110
|
+
encryption_key_file = File.join(encryption_key_file_path, 'encryption_key.php')
|
111
|
+
encryption_key = ask_variable(args, :encryption_key, 'tasks.encryption_key.enter_key') { |question| question.echo = '*' }
|
112
|
+
encryption_key.strip!
|
113
|
+
|
114
|
+
if encryption_key.empty? || encryption_key.length < 8
|
115
|
+
abort I18n.t('tasks.encryption_key.validation_error', scope: :dkdeploy)
|
116
|
+
end
|
117
|
+
|
118
|
+
encryption_key_file_content = "<?php $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '#{encryption_key}';"
|
119
|
+
|
120
|
+
on release_roles :app do ||
|
121
|
+
execute :mkdir, '-p', encryption_key_file_path
|
122
|
+
upload! StringIO.new(encryption_key_file_content), encryption_key_file
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
desc 'Create install tool password file on server'
|
127
|
+
task :create_install_tool_password_file, :password do |_, args|
|
128
|
+
install_tool_file_path = File.join(shared_path, 'config')
|
129
|
+
install_tool_file = File.join(install_tool_file_path, 'install_tool_password.php')
|
130
|
+
password = ask_variable(args, :password, 'tasks.install_tool_password.enter_password') { |question| question.echo = '*' }
|
131
|
+
password.strip!
|
132
|
+
|
133
|
+
if password.empty?
|
134
|
+
abort I18n.t('tasks.install_tool_password.validation_error', scope: :dkdeploy)
|
135
|
+
end
|
136
|
+
|
137
|
+
password = Phpass.new.hash password
|
138
|
+
password_file_content = "<?php $GLOBALS['TYPO3_CONF_VARS']['BE']['installToolPassword'] = '#{password}';"
|
139
|
+
|
140
|
+
on release_roles :app do ||
|
141
|
+
execute :mkdir, '-p', install_tool_file_path
|
142
|
+
upload! StringIO.new(password_file_content), install_tool_file
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
desc 'Add TYPO3 admin backend user'
|
147
|
+
task :add_admin_user, :typo3_username, :typo3_password do |_, args|
|
148
|
+
remote_db_file_path = File.join(shared_path, 'config')
|
149
|
+
remote_db_file = File.join(remote_db_file_path, "be-admin-user-#{fetch(:stage)}.sql")
|
150
|
+
typo3_username = ask_variable(args, :typo3_username, 'tasks.db.username')
|
151
|
+
typo3_password = ask_variable(args, :typo3_password, 'tasks.db.password') { |question| question.echo = '*' }
|
152
|
+
now = Time.now.to_i
|
153
|
+
|
154
|
+
sql_string = "INSERT INTO be_users (username, password, admin, tstamp, crdate)
|
155
|
+
VALUES ('#{typo3_username}', MD5('#{typo3_password}'), 1, #{now}, #{now});"
|
156
|
+
|
157
|
+
on primary :backend do
|
158
|
+
begin
|
159
|
+
db_settings = read_db_settings_for_context(self)
|
160
|
+
execute :mkdir, '-p', remote_db_file_path
|
161
|
+
execute :rm, '-rf', remote_db_file
|
162
|
+
|
163
|
+
upload! StringIO.new(sql_string), remote_db_file
|
164
|
+
execute :mysql,
|
165
|
+
"--default-character-set=#{db_settings.fetch('charset')}",
|
166
|
+
'-u', db_settings.fetch('username'),
|
167
|
+
'-p',
|
168
|
+
'-h', db_settings.fetch('host'), '-P', db_settings.fetch('port'), db_settings.fetch('name'),
|
169
|
+
'-e', "'source #{remote_db_file}'",
|
170
|
+
interaction_handler: Dkdeploy::InteractionHandler::Password.new(db_settings.fetch('password'))
|
171
|
+
ensure
|
172
|
+
execute :rm, '-rf', remote_db_file
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
desc 'Create configured directories for TYPO3 extensions'
|
178
|
+
task :fix_folder_structure do
|
179
|
+
typo3_console 'install:fixfolderstructure'
|
180
|
+
end
|
181
|
+
|
182
|
+
desc 'Clear TYPO3 caches'
|
183
|
+
task :clear_cache do |task|
|
184
|
+
typo3_console 'cache:flush', true
|
185
|
+
task.reenable
|
186
|
+
end
|
187
|
+
|
188
|
+
desc 'update_tables'
|
189
|
+
task :update_database do
|
190
|
+
again = nil
|
191
|
+
capture_typo3_console_in_loop 10, 'database:updateschema', 'safe,*.prefix'.shellescape, '--verbose' do |output,_,context|
|
192
|
+
context.info output
|
193
|
+
again = !output.include?('No schema updates were performed for update types')
|
194
|
+
end
|
195
|
+
|
196
|
+
if again # if again ist true we ran loop 10 times and need to issue a warning
|
197
|
+
run_locally do
|
198
|
+
warn I18n.t('tasks.typo3.cms.update_database.still_updates_available', scope: :dkdeploy)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# Deactivate Task. Wait for https://github.com/TYPO3-Console/typo3_console/pull/288
|
204
|
+
# desc 'add_static_db_content'
|
205
|
+
# task :add_static_db_content do
|
206
|
+
# typo3_console 'database:importstaticdata'
|
207
|
+
# end
|
208
|
+
|
209
|
+
desc 'Update translations for core and extensions (l10n)'
|
210
|
+
task :update_translations, :typo3_languages_to_translate do |_, args|
|
211
|
+
typo3_languages_to_translate = ask_variable(args, :typo3_languages_to_translate, 'questions.typo3_languages_to_translate')
|
212
|
+
typo3_console 'language:update', typo3_languages_to_translate
|
213
|
+
end
|
214
|
+
|
215
|
+
desc 'Remove not needed extensions'
|
216
|
+
task :remove_extensions do
|
217
|
+
installed_extensions = (capture_typo3_console_in_loop 1, 'extension:list', '--active', '--raw').split("\n")
|
218
|
+
|
219
|
+
run_locally do
|
220
|
+
info installed_extensions.inspect
|
221
|
+
if installed_extensions.empty?
|
222
|
+
raise I18n.t('tasks.typo3.cms.v6.remove_extensions.no_extension_found', scope: :dkdeploy)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
on roles :app do
|
227
|
+
# Get extensions from typo3conf/ext directory
|
228
|
+
remote_list = capture(:ls, '-x', File.join(current_path, 'typo3conf', 'ext')).split
|
229
|
+
|
230
|
+
extensions_to_remove = (remote_list - installed_extensions)
|
231
|
+
unless extensions_to_remove.empty?
|
232
|
+
info I18n.t('tasks.typo3.cms.v6.remove_extensions.info', scope: :dkdeploy, removed_extensions: extensions_to_remove.join(', '))
|
233
|
+
extensions_to_remove.each do |extension|
|
234
|
+
execute :rm, '-rf', "#{release_path}/typo3conf/ext/#{extension}"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
desc 'Generate AdditionalConfiguration.php.erb for your project'
|
241
|
+
task :generate_additional_configuration_template, :additional_configuration_template do |_, args|
|
242
|
+
configuration_template = ask_variable(args, :additional_configuration_template, 'questions.additional_configuration_template')
|
243
|
+
run_locally do
|
244
|
+
if test("[ -f #{configuration_template} ]")
|
245
|
+
info I18n.t('tasks.typo3.cms.v6.generate_additional_configuration_template.info', scope: :dkdeploy, local_configuration_template: configuration_template)
|
246
|
+
exit 0
|
247
|
+
else
|
248
|
+
execute :mkdir, '-p', File.dirname(configuration_template)
|
249
|
+
File.write configuration_template, File.read(default_template_file)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
desc 'Sets up the TYPO3 6+ specific configuration for each stage'
|
255
|
+
task :setup_additional_configuration, :additional_configuration_template do |_, args|
|
256
|
+
configuration_template = ask_variable(args, :additional_configuration_template, 'questions.additional_configuration_template')
|
257
|
+
remote_configuration_file = File.join(release_path, 'typo3conf', 'AdditionalConfiguration.php')
|
258
|
+
unless File.exist?(configuration_template)
|
259
|
+
run_locally do
|
260
|
+
raise I18n.t('tasks.typo3.cms.v6.setup_additional_configuration.upload_info', configuration_template: configuration_template, scope: :dkdeploy)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
on roles :app do |server|
|
265
|
+
# Variable "server" need for the template rendering. "server.fetch(:additional_configuration_file)"
|
266
|
+
merged_template = ERB.new File.read(configuration_template), nil, '>'
|
267
|
+
upload! StringIO.new(merged_template.result(binding)), remote_configuration_file, scp: true
|
268
|
+
info I18n.t('tasks.typo3.cms.v6.setup_additional_configuration.upload_info', scope: :dkdeploy, remote_configuration_file: remote_configuration_file)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
@@ -0,0 +1,288 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'dkdeploy/typo3/cms/i18n'
|
3
|
+
require 'dkdeploy/helpers/common'
|
4
|
+
|
5
|
+
include Dkdeploy::Helpers::Common
|
6
|
+
|
7
|
+
namespace :typo3 do
|
8
|
+
namespace :cms do
|
9
|
+
namespace :typoscript do
|
10
|
+
desc "Uploads TypoScript config files from local paths prefixed by variable 'copy_source'"
|
11
|
+
task :upload_configs, :copy_source, :typoscript_config_paths, :typoscript_config_file do |_, args|
|
12
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
13
|
+
paths = ask_array_variable(args, :typoscript_config_paths, 'tasks.typoscript.config_paths') { |question| question.default = '' }
|
14
|
+
config_file = ask_variable(args, :typoscript_config_file, 'tasks.typoscript.config_file') { |question| question.default = 'config.txt' }
|
15
|
+
|
16
|
+
paths.each do |path|
|
17
|
+
local_path = File.join(prefix, path)
|
18
|
+
local_config_file = File.join(local_path, config_file)
|
19
|
+
remote_path = File.join(current_path, path)
|
20
|
+
remote_config_file = File.join(remote_path, config_file)
|
21
|
+
|
22
|
+
unless File.exist? local_config_file
|
23
|
+
run_locally do
|
24
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: local_config_file, scope: :dkdeploy)
|
25
|
+
end
|
26
|
+
next
|
27
|
+
end
|
28
|
+
|
29
|
+
on release_roles :app do
|
30
|
+
execute :mkdir, '-p', remote_path
|
31
|
+
info I18n.t('tasks.typoscript.uploading', local_file: local_config_file, remote_file: remote_config_file, scope: :dkdeploy)
|
32
|
+
upload! local_config_file, remote_config_file
|
33
|
+
info I18n.t('tasks.typoscript.uploaded', local_file: local_config_file, remote_file: remote_config_file, scope: :dkdeploy)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Uploads PageTS files from local paths prefixed by variable 'copy_source'"
|
39
|
+
task :upload_pagets, :copy_source, :typoscript_pagets_paths, :typoscript_pagets_file do |_, args|
|
40
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
41
|
+
paths = ask_array_variable(args, :typoscript_pagets_paths, 'tasks.typoscript.pagets_paths') { |question| question.default = '' }
|
42
|
+
pagets_file = ask_variable(args, :typoscript_pagets_file, 'tasks.typoscript.pagets_file') { |question| question.default = 'PageTS.txt' }
|
43
|
+
|
44
|
+
paths.each do |path|
|
45
|
+
local_path = File.join(prefix, path)
|
46
|
+
local_pagets_file = File.join(local_path, pagets_file)
|
47
|
+
remote_path = File.join(current_path, path)
|
48
|
+
remote_pagets_file = File.join(remote_path, pagets_file)
|
49
|
+
|
50
|
+
unless File.exist? local_pagets_file
|
51
|
+
run_locally do
|
52
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: local_pagets_file, scope: :dkdeploy)
|
53
|
+
end
|
54
|
+
next
|
55
|
+
end
|
56
|
+
|
57
|
+
on release_roles :app do
|
58
|
+
execute :mkdir, '-p', remote_path
|
59
|
+
info I18n.t('tasks.typoscript.uploading', local_file: local_pagets_file, remote_file: remote_pagets_file, scope: :dkdeploy)
|
60
|
+
upload! local_pagets_file, remote_pagets_file
|
61
|
+
info I18n.t('tasks.typoscript.uploaded', local_file: local_pagets_file, remote_file: remote_pagets_file, scope: :dkdeploy)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Uploads UserTS files from local paths prefixed by variable 'copy_source'"
|
67
|
+
task :upload_userts, :copy_source, :typoscript_userts_paths, :typoscript_userts_file do |_, args|
|
68
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
69
|
+
paths = ask_array_variable(args, :typoscript_userts_paths, 'tasks.typoscript.userts_paths') { |question| question.default = '' }
|
70
|
+
userts_file = ask_variable(args, :typoscript_userts_file, 'tasks.typoscript.userts_file') { |question| question.default = 'UserTS.txt' }
|
71
|
+
|
72
|
+
paths.each do |path|
|
73
|
+
local_path = File.join(prefix, path)
|
74
|
+
local_userts_file = File.join(local_path, userts_file)
|
75
|
+
remote_path = File.join(current_path, path)
|
76
|
+
remote_userts_file = File.join(remote_path, userts_file)
|
77
|
+
|
78
|
+
unless File.exist? local_userts_file
|
79
|
+
run_locally do
|
80
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: local_userts_file, scope: :dkdeploy)
|
81
|
+
end
|
82
|
+
next
|
83
|
+
end
|
84
|
+
|
85
|
+
on release_roles :app do
|
86
|
+
execute :mkdir, '-p', remote_path
|
87
|
+
info I18n.t('tasks.typoscript.uploading', local_file: local_userts_file, remote_file: remote_userts_file, scope: :dkdeploy)
|
88
|
+
upload! local_userts_file, remote_userts_file
|
89
|
+
info I18n.t('tasks.typoscript.uploaded', local_file: local_userts_file, remote_file: remote_userts_file, scope: :dkdeploy)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Uploads all config files from given base path'
|
95
|
+
task :upload_config_from_base_path, :copy_source, :typoscript_config_base_path, :typoscript_config_file do |_, args|
|
96
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
97
|
+
base_path = ask_variable(args, :typoscript_config_base_path, 'tasks.typoscript.typoscript_config_base_path') { |question| question.default = '.' }
|
98
|
+
config_file = ask_variable(args, :typoscript_config_file, 'tasks.typoscript.config_file') { |question| question.default = 'config.txt' }
|
99
|
+
|
100
|
+
config_files = Dir[File.join(prefix, base_path, '**', config_file).to_s].map { |path_for_config_file| Pathname.new(path_for_config_file).relative_path_from(Pathname.new(prefix)).dirname.to_s }
|
101
|
+
|
102
|
+
next if config_files.empty?
|
103
|
+
|
104
|
+
set :copy_source, prefix
|
105
|
+
set :typoscript_config_paths, config_files
|
106
|
+
set :typoscript_config_file, config_file
|
107
|
+
invoke 'typo3:cms:typoscript:upload_configs'
|
108
|
+
end
|
109
|
+
|
110
|
+
desc 'Uploads all PageTS files from given base path'
|
111
|
+
task :upload_pagets_from_base_path, :copy_source, :typoscript_pagets_base_path, :typoscript_pagets_file do |_, args|
|
112
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
113
|
+
base_path = ask_variable(args, :typoscript_pagets_base_path, 'tasks.typoscript.typoscript_pagets_base_path') { |question| question.default = '.' }
|
114
|
+
pagets_file = ask_variable(args, :typoscript_pagets_file, 'tasks.typoscript.pagets_file') { |question| question.default = 'PageTS.txt' }
|
115
|
+
|
116
|
+
pagets_files = Dir[File.join(prefix, base_path, '**', pagets_file).to_s].map { |path_for_pagets_file| Pathname.new(path_for_pagets_file).relative_path_from(Pathname.new(prefix)).dirname.to_s }
|
117
|
+
next if pagets_files.empty?
|
118
|
+
|
119
|
+
set :copy_source, prefix
|
120
|
+
set :typoscript_pagets_paths, pagets_files
|
121
|
+
set :typoscript_pagets_file, pagets_file
|
122
|
+
invoke 'typo3:cms:typoscript:upload_pagets'
|
123
|
+
end
|
124
|
+
|
125
|
+
desc 'Uploads all UserTS files from given base path'
|
126
|
+
task 'upload_userts_from_base_path', :copy_source, :typoscript_userts_base_path, :typoscript_userts_file do |_, args|
|
127
|
+
prefix = ask_variable(args, :copy_source, 'tasks.typoscript.copy_source') { |question| question.default = 'htdocs' }
|
128
|
+
base_path = ask_variable(args, :typoscript_userts_base_path, 'tasks.typoscript.typoscript_userts_base_path') { |question| question.default = '.' }
|
129
|
+
userts_file = ask_variable(args, :typoscript_userts_file, 'tasks.typoscript.userts_file') { |question| question.default = 'UserTS.txt' }
|
130
|
+
|
131
|
+
userts_files = Dir[File.join(prefix, base_path, '**', userts_file).to_s].map { |path_for_userts_file| Pathname.new(path_for_userts_file).relative_path_from(Pathname.new(prefix)).dirname.to_s }
|
132
|
+
next if userts_files.empty?
|
133
|
+
|
134
|
+
set :copy_source, prefix
|
135
|
+
set :typoscript_userts_paths, userts_files
|
136
|
+
set :typoscript_userts_file, userts_file
|
137
|
+
invoke 'typo3:cms:typoscript:upload_userts'
|
138
|
+
end
|
139
|
+
|
140
|
+
desc 'Merge remote TypoScript config files'
|
141
|
+
task :merge_configs, :typoscript_config_paths, :typoscript_config_file do |_, args|
|
142
|
+
paths = ask_array_variable(args, :typoscript_config_paths, 'tasks.typoscript.config_paths')
|
143
|
+
config_file = ask_variable(args, :typoscript_config_file, 'tasks.typoscript.config_file') { |question| question.default = 'config.txt' }
|
144
|
+
|
145
|
+
paths.each do |path|
|
146
|
+
path = File.join(release_path, path)
|
147
|
+
|
148
|
+
target_config_file_with_stage_name = config_file.split('.').join(".#{fetch(:stage)}.")
|
149
|
+
source_config_file = File.join(path, 'Stages', target_config_file_with_stage_name)
|
150
|
+
target_config_file = File.join(path, config_file)
|
151
|
+
|
152
|
+
on release_roles :app do
|
153
|
+
unless test "[ -d #{path} ]"
|
154
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: path, scope: :dkdeploy)
|
155
|
+
next
|
156
|
+
end
|
157
|
+
|
158
|
+
unless test "[ -f #{source_config_file} ]"
|
159
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: source_config_file, scope: :dkdeploy)
|
160
|
+
next
|
161
|
+
end
|
162
|
+
|
163
|
+
execute :echo, "''", '>>', target_config_file
|
164
|
+
execute :cat, source_config_file, '>>', target_config_file
|
165
|
+
info I18n.t('tasks.typoscript.merged', source_file: source_config_file, target_file: target_config_file, scope: :dkdeploy)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
desc 'Merge remote PageTS files'
|
171
|
+
task :merge_pagets, :typoscript_pagets_paths, :typoscript_pagets_file do |_, args|
|
172
|
+
paths = ask_array_variable(args, :typoscript_pagets_paths, 'tasks.typoscript.pagets_paths')
|
173
|
+
pagets_file = ask_variable(args, :typoscript_pagets_file, 'tasks.typoscript.pagets_file') { |question| question.default = 'PageTS.txt' }
|
174
|
+
|
175
|
+
paths.each do |path|
|
176
|
+
path = File.join(release_path, path)
|
177
|
+
|
178
|
+
target_pagets_file_with_stage_name = pagets_file.split('.').join(".#{fetch(:stage)}.")
|
179
|
+
source_pagets_file = File.join(path, 'Stages', target_pagets_file_with_stage_name)
|
180
|
+
target_pagets_file = File.join(path, pagets_file)
|
181
|
+
|
182
|
+
on release_roles :app do
|
183
|
+
unless test "[ -d #{path} ]"
|
184
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: path, scope: :dkdeploy)
|
185
|
+
next
|
186
|
+
end
|
187
|
+
|
188
|
+
unless test "[ -f #{source_pagets_file} ]"
|
189
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: source_pagets_file, scope: :dkdeploy)
|
190
|
+
next
|
191
|
+
end
|
192
|
+
|
193
|
+
execute :echo, "''", '>>', target_pagets_file
|
194
|
+
execute :cat, source_pagets_file, '>>', target_pagets_file
|
195
|
+
info I18n.t('tasks.typoscript.merged', source_file: source_pagets_file, target_file: target_pagets_file, scope: :dkdeploy)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
desc 'Merge remote UserTS files'
|
201
|
+
task :merge_userts, :typoscript_userts_paths, :typoscript_userts_file do |_, args|
|
202
|
+
paths = ask_array_variable(args, :typoscript_userts_paths, 'tasks.typoscript.userts_paths')
|
203
|
+
userts_file = ask_variable(args, :typoscript_userts_file, 'tasks.typoscript.userts_file') { |question| question.default = 'UserTS.txt' }
|
204
|
+
|
205
|
+
paths.each do |path|
|
206
|
+
path = File.join(release_path, path)
|
207
|
+
|
208
|
+
target_userts_file_with_stage_name = userts_file.split('.').join(".#{fetch(:stage)}.")
|
209
|
+
source_userts_file = File.join(path, 'Stages', target_userts_file_with_stage_name)
|
210
|
+
target_userts_file = File.join(path, userts_file)
|
211
|
+
|
212
|
+
on release_roles :app do
|
213
|
+
unless test "[ -d #{path} ]"
|
214
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: path, scope: :dkdeploy)
|
215
|
+
next
|
216
|
+
end
|
217
|
+
|
218
|
+
unless test "[ -f #{source_userts_file} ]"
|
219
|
+
info I18n.t('tasks.typoscript.skipping', file_or_directory: source_userts_file, scope: :dkdeploy)
|
220
|
+
next
|
221
|
+
end
|
222
|
+
|
223
|
+
execute :echo, "''", '>>', target_userts_file
|
224
|
+
execute :cat, source_userts_file, '>>', target_userts_file
|
225
|
+
info I18n.t('tasks.typoscript.merged', source_file: source_userts_file, target_file: target_userts_file, scope: :dkdeploy)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
desc 'Merge all remote config files for a given base path'
|
231
|
+
task :merge_config_in_base_path, :typoscript_config_base_path, :typoscript_config_file do |_, args|
|
232
|
+
base_path = ask_variable(args, :typoscript_config_base_path, 'tasks.typoscript.typoscript_config_base_path') { |question| question.default = '.' }
|
233
|
+
config_file = ask_variable(args, :typoscript_config_file, 'tasks.typoscript.config_file') { |question| question.default = 'config.txt' }
|
234
|
+
|
235
|
+
list_of_files = ''
|
236
|
+
target_config_file_with_stage_name = config_file.split('.').join(".#{fetch(:stage)}.")
|
237
|
+
on primary :app do
|
238
|
+
list_of_files = capture :find, File.join(release_path, base_path), '-type f', "-name '#{target_config_file_with_stage_name}'"
|
239
|
+
end
|
240
|
+
|
241
|
+
next if list_of_files.empty?
|
242
|
+
config_files = list_of_files.split.map { |file| Pathname.new(file).relative_path_from(Pathname.new(release_path)).dirname.dirname.to_s }
|
243
|
+
|
244
|
+
set :typoscript_config_paths, config_files
|
245
|
+
set :typoscript_config_file, config_file
|
246
|
+
invoke 'typo3:cms:typoscript:merge_configs'
|
247
|
+
end
|
248
|
+
|
249
|
+
desc 'Merge all remote PageTS files for a given base path'
|
250
|
+
task :merge_pagets_in_base_path, :typoscript_pagets_base_path, :typoscript_pagets_file do |_, args|
|
251
|
+
base_path = ask_variable(args, :typoscript_pagets_base_path, 'tasks.typoscript.typoscript_pagets_base_path') { |question| question.default = '.' }
|
252
|
+
pagets_file = ask_variable(args, :typoscript_pagets_file, 'tasks.typoscript.pagets_file') { |question| question.default = 'PageTS.txt' }
|
253
|
+
|
254
|
+
list_of_files = ''
|
255
|
+
target_pagets_file_with_stage_name = pagets_file.split('.').join(".#{fetch(:stage)}.")
|
256
|
+
on primary :app do
|
257
|
+
list_of_files = capture :find, File.join(release_path, base_path), '-type f', "-name '#{target_pagets_file_with_stage_name}'"
|
258
|
+
end
|
259
|
+
|
260
|
+
next if list_of_files.empty?
|
261
|
+
pagets_files = list_of_files.split.map { |file| Pathname.new(file).relative_path_from(Pathname.new(release_path)).dirname.dirname.to_s }
|
262
|
+
|
263
|
+
set :typoscript_pagets_paths, pagets_files
|
264
|
+
set :typoscript_pagets_file, pagets_file
|
265
|
+
invoke 'typo3:cms:typoscript:merge_pagets'
|
266
|
+
end
|
267
|
+
|
268
|
+
desc 'Merge all remote UserTS files for a given bbase path'
|
269
|
+
task :merge_userts_in_base_path, :typoscript_userts_base_path, :typoscript_userts_file do |_, args|
|
270
|
+
base_path = ask_variable(args, :typoscript_userts_base_path, 'tasks.typoscript.typoscript_userts_base_path') { |question| question.default = '.' }
|
271
|
+
userts_file = ask_variable(args, :typoscript_userts_file, 'tasks.typoscript.userts_file') { |question| question.default = 'UserTS.txt' }
|
272
|
+
|
273
|
+
list_of_files = ''
|
274
|
+
target_userts_file_with_stage_name = userts_file.split('.').join(".#{fetch(:stage)}.")
|
275
|
+
on primary :app do
|
276
|
+
list_of_files = capture :find, File.join(release_path, base_path), '-type f', "-name '#{target_userts_file_with_stage_name}'"
|
277
|
+
end
|
278
|
+
|
279
|
+
next if list_of_files.empty?
|
280
|
+
userts_files = list_of_files.split.map { |file| Pathname.new(file).relative_path_from(Pathname.new(release_path)).dirname.dirname.to_s }
|
281
|
+
|
282
|
+
set :typoscript_userts_paths, userts_files
|
283
|
+
set :typoscript_userts_file, userts_file
|
284
|
+
invoke 'typo3:cms:typoscript:merge_userts'
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|