capistrano-forkcms 2.0.4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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