capistrano-forkcms 2.0.4 → 3.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01a1470d79a72c626f0b4d7f320fb9c36da374f3
4
- data.tar.gz: aa70ae7807a44ce30ad23bf4dd7ad80be1900bf9
3
+ metadata.gz: 18c6553a0978a49147150fe626a9e7f2924872bc
4
+ data.tar.gz: 8ad29409a350f8a642933877ed6ff57c4d74fbc9
5
5
  SHA512:
6
- metadata.gz: 3b2e3f53e445fd88fb27b6e1c2e8f6ce16857e673d8cb4b6769f7fec2d3c532a1ebd62bc56acc02847cc83df120fd68a60468f1b1550407ff5a8e7f025600526
7
- data.tar.gz: dbd2d5aac1e63a445f12d27f180148aa5399579726184facb2b610d04a32be62456586d7995b56e1544de3fbfb3549fccde2bde0a31bc066b6de047b87beb6df
6
+ metadata.gz: 0840f3aeafba8b18ac3ac8224bc1f4cc10ca8336eda6bf56fed05fb7f7b7eb229c52321d4c9a3bfaa2cce2f8b52808aef520266ee87b8b3948990ebcaf4494b0
7
+ data.tar.gz: f38e4063de7956cbc0817ca99aad19dea55bcca5f35b864be6c0a40dc220e8adb97c20eb61f25c4523f286a912c12f7b96f19d6269fe1d72ed1e7477dab350f0
data/README.md CHANGED
@@ -24,7 +24,7 @@ Require the module in your Capfile:
24
24
 
25
25
  require "capistrano/forkcms"
26
26
 
27
- The plugin comes with two tasks:
27
+ The plugin comes with some tasks:
28
28
 
29
29
  * `forkcms:configure:composer`, which will configure the `capistrano/composer` plugin.
30
30
  * `forkcms:opcache:reset`, which will reset the opcache.
@@ -43,6 +43,11 @@ Configuration options:
43
43
  required when `:opcache_reset_strategy` is `fcgi`.
44
44
  * `opcache_reset_base_url`, the public url of your website. Required when `:opcache_reset_strategy` is `file`
45
45
 
46
+ ### `:opcache_reset_strategy`
47
+
48
+ If you are using `file` as the strategy, you will need to alter the .htaccess-file to allow 'php-opcache-reset.php' to be accessed directly.
49
+
50
+ Add `RewriteRule ^php-opcache-reset\.php$ - [L]` below `RewriteRule ^index\.php$ - [L]` in the .htaccess-file
46
51
 
47
52
  ## How to use with a fresh Fork install
48
53
 
@@ -58,7 +63,7 @@ require 'capistrano/scm/git'
58
63
  install_plugin Capistrano::SCM::Git
59
64
  require 'capistrano/forkcms'
60
65
 
61
- set :format_options, log_file: 'app/logs/capistrano.log'
66
+ set :format_options, log_file: 'var/logs/capistrano.log'
62
67
 
63
68
  Dir.glob('app/config/capistrano/tasks/*.rake').each { |r| import r }
64
69
  ```
@@ -113,6 +118,25 @@ set :opcache_reset_fcgi_connection_string, "$your-php-fpm-socket-or-connection-s
113
118
  set :branch, "staging"
114
119
  ```
115
120
 
121
+ ## Migrations
122
+
123
+ Built in migrations allow you to easily update your database or locale when deploying a new codebase.
124
+
125
+ ### General
126
+
127
+ Each migration is contained in its own folder in the main `migrations` folder (e.g. `migrations/new-editor-feature`).
128
+ When deploying, this gem will check if `new-editor-feature` has been executed before. If it hasn't, it will be executed and saved.
129
+
130
+ ### Locale
131
+
132
+ To create a migration for the locale, create a file called `locale.xml` in your migration folder (e.g. `migrations/new-editor-feature/locale.xml`).
133
+ This file will be imported automatically using the `bin/console forkcms:locale:import` command.
134
+
135
+ ### Database
136
+
137
+ To create a migration for the database, create a file called `update.sql` in your migration folder (e.g. `migrations/new-editor-feature/update.sql`).
138
+ This file will be imported automatically using `mysql` so make sure you don't accidentally delete your database.
139
+
116
140
  ## Contributing
117
141
 
118
142
  Bug reports and pull requests are welcome on GitHub at [https://github.com/tijsverkoyen/capistrano-forkcms](https://github.com/tijsverkoyen/capistrano-forkcms).
@@ -120,4 +144,4 @@ Bug reports and pull requests are welcome on GitHub at [https://github.com/tijsv
120
144
 
121
145
  ## License
122
146
 
123
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
147
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -17,10 +17,15 @@ namespace :deploy do
17
17
  after :starting, 'cachetool:install_executable'
18
18
  after :publishing, 'forkcms:symlink:document_root'
19
19
  after :publishing, 'forkcms:opcache:reset'
20
+ after :updated, 'forkcms:migrations:execute'
21
+ before :reverted, 'forkcms:migrations:rollback'
20
22
  end
21
23
 
22
24
 
23
25
  # Load the tasks
24
26
  load File.expand_path('../../tasks/configure.rake', __FILE__)
27
+ load File.expand_path('../../tasks/database.rake', __FILE__)
28
+ load File.expand_path('../../tasks/maintenance.rake', __FILE__)
29
+ load File.expand_path('../../tasks/migrations.rake', __FILE__)
25
30
  load File.expand_path('../../tasks/opcache.rake', __FILE__)
26
31
  load File.expand_path('../../tasks/symlink.rake', __FILE__)
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Forkcms
3
- VERSION = '2.0.4'
3
+ VERSION = '3.0.0'
4
4
  end
5
5
  end
@@ -21,25 +21,4 @@ namespace :forkcms do
21
21
  SSHKit.config.command_map[:cachetool] = "#{fetch :php_bin_path} #{fetch :deploy_to}/shared/cachetool.phar"
22
22
  end
23
23
  end
24
-
25
- namespace :symlink do
26
- desc <<-DESC
27
- Links the document root to the current folder
28
- The document root is the folder that the webserver will serve, it should link to the current path.
29
- DESC
30
- task :document_root do
31
- on roles(:web) do
32
- if test("[ -L #{fetch :document_root} ]") && capture("readlink -- #{fetch :document_root}") == "#{current_path}/"
33
- # all is well, the symlink is correct
34
- elsif test("[ -d #{fetch :document_root} ]") || test("[ -f #{fetch :document_root} ]")
35
- error "Document root #{fetch :document_root} already exists."
36
- error 'To link it, issue the following command:'
37
- error "ln -sf #{current_path}/ #{fetch :document_root}"
38
- else
39
- execute :mkdir, '-p', File.dirname(fetch(:document_root))
40
- execute :ln, '-sf', "#{current_path}/", fetch(:document_root)
41
- end
42
- end
43
- end
44
- end
45
24
  end
@@ -0,0 +1,92 @@
1
+ namespace :forkcms do
2
+ namespace :database do
3
+ backup_file = 'mysql_backup.sql'
4
+
5
+ desc 'Create a backup of the database'
6
+ task :backup do
7
+ on roles(:web) do
8
+ flags = get_mysql_connection_flags
9
+ execute :mysqldump, "#{flags} --skip-lock-tables > #{release_path}/#{backup_file}"
10
+ end
11
+ end
12
+
13
+ desc 'Restore the database from a backup file'
14
+ task :restore do
15
+ on roles(:web) do
16
+ if not test "[[ -f #{release_path}/#{backup_file} ]]"
17
+ error "No backup file found, create a backup first"
18
+ else
19
+ Rake::Task["forkcms:database:execute"].invoke("#{release_path}/#{backup_file}")
20
+ end
21
+ end
22
+ end
23
+
24
+ desc 'Execute an SQL file'
25
+ task :execute, [:file] do |t, arguments|
26
+ on roles(:web) do
27
+ if not test "[[ -f #{arguments[:file]} ]]"
28
+ raise "File at #{arguments[:file]} does not exist"
29
+ end
30
+
31
+ # Execute the file
32
+ flags = get_mysql_connection_flags
33
+ execute :mysql,"#{flags} < #{arguments[:file]}"
34
+ end
35
+ end
36
+
37
+ private
38
+ def get_parameters
39
+ parameter_path = "#{shared_path}/app/config/parameters.yml"
40
+ if not test "[[ -f #{parameter_path} ]]"
41
+ raise "parameters.yml not found, it should be at #{parameter_path}"
42
+ end
43
+
44
+ # Fetch the content of the parameters
45
+ parameters_content = capture "cat #{parameter_path}"
46
+ # It seems we use invalid yml in our config files
47
+ # Therefore we need to fix some issues with it.
48
+ parameters_content = parameters_content.gsub(/:(\s*)%(.*)/, ':\1"%\2"')
49
+
50
+ parameters_content = YAML::load(parameters_content)
51
+
52
+ # Return them
53
+ return parameters_content.fetch('parameters')
54
+ end
55
+
56
+ def get_mysql_connection_flags
57
+ # Fetch our parameters to reach the database
58
+ parameters = get_parameters
59
+
60
+ # Abort if no parameters are found
61
+ if parameters == nil
62
+ return
63
+ end
64
+
65
+ # Define our mapping
66
+ mapping = {
67
+ 'host' => parameters.fetch('database.host'),
68
+ 'port' => parameters.fetch('database.port'),
69
+ 'user' => parameters.fetch('database.user'),
70
+ 'password' => parameters.fetch('database.password'),
71
+ }
72
+
73
+ # Set the default flags
74
+ flags = "--default-character-set='utf8' "
75
+
76
+ # Append each mapped property to our flags
77
+ mapping.each do |key, value|
78
+ raise "\"#{key}\" is not set in the parameters.yml file" if value.nil?
79
+
80
+ flags << "--#{key}=#{value} "
81
+ end
82
+
83
+ # Append our database
84
+ database = parameters.fetch('database.name')
85
+ raise "\"database.name\" is not set in the parameters.yml file" if database.nil?
86
+
87
+ flags << "#{database}"
88
+
89
+ return flags
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,37 @@
1
+ namespace :forkcms do
2
+ namespace :maintenance do
3
+ desc 'Enable maintenance mode'
4
+ task :enable do
5
+ on roles(:web) do
6
+ create_maintenance_folder
7
+ execute :rm, '-rf', "#{fetch :document_root} && ln -sf #{shared_path}/maintenance #{fetch :document_root}"
8
+ end
9
+ end
10
+
11
+ desc 'Disable maintenance mode'
12
+ task :disable do
13
+ on roles(:web) do
14
+ execute :rm, '-rf', "#{fetch :document_root} && ln -sf #{current_path} #{fetch :document_root}"
15
+ end
16
+ end
17
+
18
+ private
19
+ # Creates the maintenance folder based on the local maintenance folder to display when migrating
20
+ def create_maintenance_folder
21
+ # Stop if the maintenance folder exists
22
+ return if capture("if [ -d #{shared_path}/maintenance ]; then echo 'yes'; fi").chomp == 'yes'
23
+
24
+ lib_path = File.dirname(__FILE__)
25
+ local_maintenance_path = "#{lib_path}/../../maintenance"
26
+
27
+ # Create a maintenance folder containing the index page from our gem
28
+ execute :mkdir, "-p #{shared_path}/maintenance"
29
+
30
+ # copy the contents of the index.html file to our shared folder
31
+ upload! File.open(local_maintenance_path + '/index.html'), "#{shared_path}/maintenance/index.html"
32
+
33
+ # copy the contents of the .htaccess file to our shared folder
34
+ upload! File.open(local_maintenance_path + '/.htaccess'), "#{shared_path}/maintenance/.htaccess"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,115 @@
1
+ namespace :forkcms do
2
+ namespace :migrations do
3
+ desc 'Prepare the server for running Fork CMS migrations'
4
+ task :prepare do
5
+ on roles(:web) do
6
+ create_migrations_file
7
+ end
8
+ end
9
+
10
+ desc 'Execute pending migrations'
11
+ task :execute do
12
+ on roles(:web) do
13
+ # Prepare for migrations if it's not done already
14
+ Rake::Task["forkcms:migrations:prepare"].invoke()
15
+
16
+ # Abort if no migrations are found
17
+ migration_folders = get_migration_folders
18
+ next if migration_folders.length == 0
19
+
20
+ migrations_to_execute = get_migrations_to_execute
21
+
22
+ # Abort if no new migrations are found
23
+ next if migrations_to_execute.length == 0
24
+
25
+ # As migrations can take a while we show a maintenance page
26
+ Rake::Task["forkcms:maintenance:enable"].invoke()
27
+
28
+ # Back up the database, just in case
29
+ Rake::Task["forkcms:database:backup"].invoke()
30
+
31
+ # Execute all migrations
32
+ migrations_to_execute.each do |dirname|
33
+ migration_path = "#{release_path}/migrations/#{dirname}"
34
+ migration_files = capture("ls -1 #{migration_path}").split(/\r?\n/)
35
+
36
+ migration_files.each do |filename|
37
+ # Execute a MySQL file
38
+ if filename.index('update.sql') != nil
39
+ Rake::Task["forkcms:database:execute"].invoke("#{migration_path}/#{filename}")
40
+
41
+ next
42
+ end
43
+
44
+ # Update the locale through the console command
45
+ if filename.index('locale.xml') != nil
46
+ execute :php, "#{release_path}/bin/console forkcms:locale:import -f #{migration_path}/#{filename}"
47
+
48
+ next
49
+ end
50
+ end
51
+ end
52
+
53
+ # All migrations were executed successfully and we didn't roll back so put them in the executed_migrations file
54
+ migrations_to_execute.each do |dirname|
55
+ execute :echo , "#{dirname} | tee -a #{shared_path}/executed_migrations"
56
+ end
57
+
58
+ # Disable maintenance mode, everything is done
59
+ Rake::Task["forkcms:maintenance:disable"].invoke()
60
+ end
61
+ end
62
+
63
+ desc 'Rollback the migrations'
64
+ task :rollback do
65
+ # Restore the database backup so we undo any executed migrations
66
+ Rake::Task["forkcms:database:restore"].invoke()
67
+
68
+ # Disable the maintenance page so the site is accessible again
69
+ Rake::Task["forkcms:maintenance:disable"].invoke()
70
+ end
71
+
72
+ private
73
+
74
+ # Creates a migration file to hold our executed migrations
75
+ def create_migrations_file
76
+ # Stop if the migrations file exists
77
+ return if test "[[ -f #{shared_path}/executed_migrations ]]"
78
+
79
+ # Create an empty executed_migrations file
80
+ upload! StringIO.new(''), "#{shared_path}/executed_migrations"
81
+
82
+ # If we just created the executed_migrations file, add all existing migrations
83
+ execute_initial_migration
84
+ end
85
+
86
+ # Put all items in the migrations folder in the executed_migrations file
87
+ def execute_initial_migration
88
+ migration_folders = get_migration_folders
89
+
90
+ migration_folders.each do |dirname|
91
+ run "echo #{dirname} | tee -a #{shared_path}/executed_migrations"
92
+ end
93
+ end
94
+
95
+ # Gets the new migrations to execute
96
+ def get_migrations_to_execute
97
+ executed_migrations = capture("cat #{shared_path}/executed_migrations").chomp.split(/\r?\n/)
98
+ migrations_to_execute = Array.new
99
+ migration_folders = get_migration_folders
100
+
101
+ # Fetch all migration directories that aren't executed yet
102
+ migration_folders.each do |dirname|
103
+ if executed_migrations.index(dirname) == nil
104
+ migrations_to_execute.push(dirname)
105
+ end
106
+ end
107
+
108
+ return migrations_to_execute
109
+ end
110
+
111
+ def get_migration_folders
112
+ return capture("if [ -e #{release_path}/migrations ]; then ls -1 #{release_path}/migrations; fi").split(/\r?\n/)
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,10 @@
1
+ # All url's will see the maintenance page (index.html)
2
+ # This way they are back to there original page after maintenance is finished.
3
+ <IfModule mod_rewrite.c>
4
+ # nice urls
5
+ RewriteEngine On
6
+ RewriteBase /
7
+
8
+ # handle urls
9
+ RewriteRule . index.html [NC,L]
10
+ </IfModule>
@@ -0,0 +1,75 @@
1
+ <!DOCTYPE HTML>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Maintenance break!</title>
6
+ <style type="text/css">
7
+ body
8
+ {
9
+ background-color: #ebf3f9;
10
+ margin: 0;
11
+ padding: 0;
12
+ border: 0;
13
+ font-family: Arial;
14
+ }
15
+ h1
16
+ {
17
+ color: #333333;
18
+ font-size: 20px;
19
+ line-height: 0;
20
+ margin-bottom: 30px;
21
+ }
22
+ p
23
+ {
24
+ color: #666666;
25
+ font-size: 13px;
26
+ }
27
+ #container
28
+ {
29
+ position: absolute;
30
+ left: 50%;
31
+ top: 50%;
32
+ width: 340px;
33
+ height: 471px;
34
+ margin-left: -200px;
35
+ margin-top: -250px;
36
+ }
37
+ #balloon
38
+ {
39
+ background-color: #FFF;
40
+ width: 340px;
41
+ padding: 30px;
42
+ border: 1px solid #c3c3c3;
43
+ -webkit-border-radius: 3px;
44
+ -moz-border-radius: 3px;
45
+ border-radius: 3px;
46
+ }
47
+ #triangle
48
+ {
49
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAVCAYAAAA0GqweAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA7VpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wUmlnaHRzPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcFJpZ2h0czpNYXJrZWQ9IkZhbHNlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTg3MUZFMDQzMzFEMEEzNUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzJDQTBBQzJBNzM2MTFFMUI1MEM5QzEwRkFDRTlENTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzJDQTBBQzFBNzM2MTFFMUI1MEM5QzEwRkFDRTlENTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGNzdGMTE3NDA3MjA2ODExOTJCMEZDMUY0NjNBQjdBMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozN0Q5NjczNzYxNDgxMUUwOTA4Q0VFMzEzNEJGNDExMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpGPG08AAAC+SURBVHjazNYxDsMgDAVQF4VrcNRW6jmZWDgEQ9svdSBRCLZxEv4A5rO8CfGIMX5CCOS9p5lSSqGUErmc8xsDitlwsLnf+TUTssbB5v79FMgtDp2r7m9F7uG2wNuQLdwe8HLkEa4FvAzZwx0BT0dycD3gaUgujgM0R0pwXKAZUoqTAIeRGpwUqEZqcRqgGDmC0wLZyFHcCLCLtMCNAptIKxyyGLy7QGJ/4meOWOGsgCskFiucJbBGkhUO+QowAHLmWpHUFvdBAAAAAElFTkSuQmCC);
50
+ margin-left: 180px;
51
+ margin-top: -1px;
52
+ width: 40px;
53
+ height: 21px;
54
+ }
55
+ #bottom
56
+ {
57
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEPCAYAAABsj5JaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA7VpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wUmlnaHRzPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcFJpZ2h0czpNYXJrZWQ9IkZhbHNlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTg3MUZFMDQzMzFEMEEzNUUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzJDQTBBQkVBNzM2MTFFMUI1MEM5QzEwRkFDRTlENTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzJDQTBBQkRBNzM2MTFFMUI1MEM5QzEwRkFDRTlENTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGNzdGMTE3NDA3MjA2ODExOTJCMEZDMUY0NjNBQjdB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);
58
+ width: 400px;
59
+ height: 271px;
60
+ margin-top: 10px;
61
+ }
62
+
63
+ </style>
64
+ </head>
65
+ <body>
66
+ <div id="container">
67
+ <div id="balloon">
68
+ <h1>Maintenance break!</h1>
69
+ <p>Our web wizards are doing some maintenance magic on the site. Go grab a cup of coffee, we'll be back up and running asap.</p>
70
+ </div>
71
+ <div id="triangle">&nbsp;</div>
72
+ <div id="bottom">&nbsp;</div>
73
+ </div>
74
+ </body>
75
+ </html>
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-forkcms
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tijs Verkoyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2017-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.14'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.14'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: capistrano
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.8'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.8'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: capistrano-composer
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.0.6
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.0.6
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: capistrano-cachetool
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
89
  version: '1.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.0'
97
97
  description: Capistrano ForkCMS - Easy deployment of ForkCMS 5+ apps with Ruby over
@@ -102,9 +102,9 @@ executables: []
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
- - ".gitignore"
106
- - ".rspec"
107
- - ".travis.yml"
105
+ - .gitignore
106
+ - .rspec
107
+ - .travis.yml
108
108
  - Gemfile
109
109
  - LICENSE.md
110
110
  - README.md
@@ -115,8 +115,13 @@ files:
115
115
  - lib/capistrano/forkcms/defaults.rb
116
116
  - lib/capistrano/forkcms/version.rb
117
117
  - lib/capistrano/tasks/configure.rake
118
+ - lib/capistrano/tasks/database.rake
119
+ - lib/capistrano/tasks/maintenance.rake
120
+ - lib/capistrano/tasks/migrations.rake
118
121
  - lib/capistrano/tasks/opcache.rake
119
122
  - lib/capistrano/tasks/symlink.rake
123
+ - lib/maintenance/.htaccess
124
+ - lib/maintenance/index.html
120
125
  homepage: https://github.com/tijsverkoyen/capistrano-forkcms
121
126
  licenses:
122
127
  - MIT
@@ -127,17 +132,17 @@ require_paths:
127
132
  - lib
128
133
  required_ruby_version: !ruby/object:Gem::Requirement
129
134
  requirements:
130
- - - ">="
135
+ - - '>='
131
136
  - !ruby/object:Gem::Version
132
137
  version: '0'
133
138
  required_rubygems_version: !ruby/object:Gem::Requirement
134
139
  requirements:
135
- - - ">="
140
+ - - '>='
136
141
  - !ruby/object:Gem::Version
137
142
  version: '0'
138
143
  requirements: []
139
144
  rubyforge_project:
140
- rubygems_version: 2.6.11
145
+ rubygems_version: 2.0.14.1
141
146
  signing_key:
142
147
  specification_version: 4
143
148
  summary: Fork CMS specific Capistrano tasks