capifony 2.1.7 → 2.1.8
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.
- data/CHANGELOG +18 -0
- data/bin/capifony +5 -2
- data/lib/capifony.rb +15 -5
- data/lib/symfony1.rb +60 -575
- data/lib/symfony1/database.rb +118 -0
- data/lib/symfony1/deploy.rb +56 -0
- data/lib/symfony1/doctrine.rb +76 -0
- data/lib/symfony1/propel.rb +57 -0
- data/lib/symfony1/shared.rb +50 -0
- data/lib/symfony1/symfony.rb +187 -0
- data/lib/symfony1/web.rb +13 -0
- data/lib/symfony2.rb +26 -528
- data/lib/symfony2/database.rb +127 -0
- data/lib/symfony2/deploy.rb +86 -0
- data/lib/symfony2/doctrine.rb +118 -0
- data/lib/symfony2/output.rb +44 -0
- data/lib/symfony2/propel.rb +80 -0
- data/lib/symfony2/symfony.rb +118 -0
- data/lib/symfony2/web.rb +69 -0
- metadata +38 -8
@@ -0,0 +1,127 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "zlib"
|
3
|
+
|
4
|
+
namespace :database do
|
5
|
+
namespace :dump do
|
6
|
+
desc "Dumps remote database"
|
7
|
+
task :remote do
|
8
|
+
filename = "#{application}.remote_dump.#{Time.now.to_i}.sql.gz"
|
9
|
+
file = "/tmp/#{filename}"
|
10
|
+
sqlfile = "#{application}_dump.sql"
|
11
|
+
config = ""
|
12
|
+
|
13
|
+
run "cat #{current_path}/app/config/parameters.yml" do |ch, st, data|
|
14
|
+
config = load_database_config data, symfony_env_prod
|
15
|
+
end
|
16
|
+
|
17
|
+
case config['database_driver']
|
18
|
+
when "pdo_mysql", "mysql"
|
19
|
+
run "mysqldump -u#{config['database_user']} --password='#{config['database_password']}' #{config['database_name']} | gzip -c > #{file}" do |ch, stream, data|
|
20
|
+
puts data
|
21
|
+
end
|
22
|
+
when "pdo_pgsql", "pgsql"
|
23
|
+
run "pg_dump -U #{config['database_user']} #{config['database_name']} | gzip -c > #{file}" do |ch, stream, data|
|
24
|
+
puts data
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
FileUtils.mkdir_p("backups")
|
30
|
+
get file, "backups/#{filename}"
|
31
|
+
begin
|
32
|
+
FileUtils.ln_sf(filename, "backups/#{application}.remote_dump.latest.sql.gz")
|
33
|
+
rescue NotImplementedError # hack for windows which doesnt support symlinks
|
34
|
+
FileUtils.cp_r("backups/#{filename}", "backups/#{application}.remote_dump.latest.sql.gz")
|
35
|
+
end
|
36
|
+
run "rm #{file}"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Dumps local database"
|
40
|
+
task :local do
|
41
|
+
filename = "#{application}.local_dump.#{Time.now.to_i}.sql.gz"
|
42
|
+
tmpfile = "backups/#{application}_dump_tmp.sql"
|
43
|
+
file = "backups/#{filename}"
|
44
|
+
config = load_database_config IO.read('app/config/parameters.yml'), symfony_env_local
|
45
|
+
sqlfile = "#{application}_dump.sql"
|
46
|
+
|
47
|
+
FileUtils::mkdir_p("backups")
|
48
|
+
case config['database_driver']
|
49
|
+
when "pdo_mysql", "mysql"
|
50
|
+
`mysqldump -u#{config['database_user']} --password=\"#{config['database_password']}\" #{config['database_name']} > #{tmpfile}`
|
51
|
+
when "pdo_pgsql", "pgsql"
|
52
|
+
`pg_dump -U #{config['database_user']} #{config['database_name']} > #{tmpfile}`
|
53
|
+
end
|
54
|
+
|
55
|
+
File.open(tmpfile, "r+") do |f|
|
56
|
+
gz = Zlib::GzipWriter.open(file)
|
57
|
+
while (line = f.gets)
|
58
|
+
gz << line
|
59
|
+
end
|
60
|
+
gz.flush
|
61
|
+
gz.close
|
62
|
+
end
|
63
|
+
|
64
|
+
begin
|
65
|
+
FileUtils.ln_sf(filename, "backups/#{application}.local_dump.latest.sql.gz")
|
66
|
+
rescue NotImplementedError # hack for windows which doesnt support symlinks
|
67
|
+
FileUtils.cp_r("backups/#{filename}", "backups/#{application}.local_dump.latest.sql.gz")
|
68
|
+
end
|
69
|
+
FileUtils.rm(tmpfile)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
namespace :move do
|
74
|
+
desc "Dumps remote database, downloads it to local, and populates here"
|
75
|
+
task :to_local do
|
76
|
+
filename = "#{application}.remote_dump.latest.sql.gz"
|
77
|
+
config = load_database_config IO.read('app/config/parameters.yml'), symfony_env_local
|
78
|
+
sqlfile = "#{application}_dump.sql"
|
79
|
+
|
80
|
+
database.dump.remote
|
81
|
+
|
82
|
+
f = File.new("backups/#{sqlfile}", "a+")
|
83
|
+
gz = Zlib::GzipReader.new(File.open("backups/#{filename}", "r"))
|
84
|
+
f << gz.read
|
85
|
+
f.close
|
86
|
+
|
87
|
+
case config['database_driver']
|
88
|
+
when "pdo_mysql", "mysql"
|
89
|
+
`mysql -u#{config['database_user']} --password=\"#{config['database_password']}\" #{config['database_name']} < backups/#{sqlfile}`
|
90
|
+
when "pdo_pgsql", "pgsql"
|
91
|
+
`psql -U #{config['database_user']} --password=\"#{config['database_password']}\" #{config['database_name']} < backups/#{sqlfile}`
|
92
|
+
end
|
93
|
+
FileUtils.rm("backups/#{sqlfile}")
|
94
|
+
end
|
95
|
+
|
96
|
+
desc "Dumps local database, loads it to remote, and populates there"
|
97
|
+
task :to_remote do
|
98
|
+
filename = "#{application}.local_dump.latest.sql.gz"
|
99
|
+
file = "backups/#{filename}"
|
100
|
+
sqlfile = "#{application}_dump.sql"
|
101
|
+
config = ""
|
102
|
+
|
103
|
+
database.dump.local
|
104
|
+
|
105
|
+
upload(file, "/tmp/#{filename}", :via => :scp)
|
106
|
+
run "gunzip -c /tmp/#{filename} > /tmp/#{sqlfile}"
|
107
|
+
|
108
|
+
run "cat #{shared_path}/config/databases.yml" do |ch, st, data|
|
109
|
+
config = load_database_config data, symfony_env_prod
|
110
|
+
end
|
111
|
+
|
112
|
+
case config['database_driver']
|
113
|
+
when "pdo_mysql", "mysql"
|
114
|
+
run "mysql -u#{config['database_user']} --password='#{config['database_password']}' #{config['database_name']} < /tmp/#{sqlfile}" do |ch, stream, data|
|
115
|
+
puts data
|
116
|
+
end
|
117
|
+
when "pdo_pgsql", "pgsql"
|
118
|
+
run "psql -U #{config['database_user']} --password='#{config['database_password']}' #{config['database_name']} < /tmp/#{sqlfile}" do |ch, stream, data|
|
119
|
+
puts data
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
run "rm /tmp/#{filename}"
|
124
|
+
run "rm /tmp/#{sqlfile}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# Overrided Capistrano tasks
|
2
|
+
namespace :deploy do
|
3
|
+
desc "Symlinks static directories and static files that need to remain between deployments"
|
4
|
+
task :share_childs do
|
5
|
+
if shared_children
|
6
|
+
pretty_print "--> Creating symlinks for shared directories"
|
7
|
+
|
8
|
+
shared_children.each do |link|
|
9
|
+
run "mkdir -p #{shared_path}/#{link}"
|
10
|
+
run "if [ -d #{release_path}/#{link} ] ; then rm -rf #{release_path}/#{link}; fi"
|
11
|
+
run "ln -nfs #{shared_path}/#{link} #{release_path}/#{link}"
|
12
|
+
end
|
13
|
+
|
14
|
+
puts_ok
|
15
|
+
end
|
16
|
+
|
17
|
+
if shared_files
|
18
|
+
pretty_print "--> Creating symlinks for shared files"
|
19
|
+
|
20
|
+
shared_files.each do |link|
|
21
|
+
link_dir = File.dirname("#{shared_path}/#{link}")
|
22
|
+
run "mkdir -p #{link_dir}"
|
23
|
+
run "touch #{shared_path}/#{link}"
|
24
|
+
run "ln -nfs #{shared_path}/#{link} #{release_path}/#{link}"
|
25
|
+
end
|
26
|
+
|
27
|
+
puts_ok
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Updates latest release source path"
|
32
|
+
task :finalize_update, :except => { :no_release => true } do
|
33
|
+
run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
|
34
|
+
|
35
|
+
pretty_print "--> Creating cache directory"
|
36
|
+
|
37
|
+
run "if [ -d #{latest_release}/#{cache_path} ] ; then rm -rf #{latest_release}/#{cache_path}; fi"
|
38
|
+
run "mkdir -p #{latest_release}/#{cache_path} && chmod -R 0777 #{latest_release}/#{cache_path}"
|
39
|
+
run "chmod -R g+w #{latest_release}/#{cache_path}"
|
40
|
+
|
41
|
+
puts_ok
|
42
|
+
|
43
|
+
share_childs
|
44
|
+
|
45
|
+
if fetch(:normalize_asset_timestamps, true)
|
46
|
+
stamp = Time.now.utc.strftime("%Y%m%d%H%M.%S")
|
47
|
+
asset_paths = asset_children.map { |p| "#{latest_release}/#{p}" }.join(" ")
|
48
|
+
|
49
|
+
if asset_paths.chomp.empty?
|
50
|
+
puts " No asset paths found, skipped".yellow
|
51
|
+
else
|
52
|
+
pretty_print "--> Normalizing asset timestamps"
|
53
|
+
|
54
|
+
run "find #{asset_paths} -exec touch -t #{stamp} {} ';'; true", :env => { "TZ" => "UTC" }
|
55
|
+
puts_ok
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
desc <<-DESC
|
61
|
+
Deploys and starts a `cold' application. This is useful if you have not \
|
62
|
+
deployed your application before.
|
63
|
+
DESC
|
64
|
+
task :cold do
|
65
|
+
update
|
66
|
+
start
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Deploys the application and runs the test suite"
|
70
|
+
task :testall do
|
71
|
+
update_code
|
72
|
+
create_symlink
|
73
|
+
run "cd #{latest_release} && phpunit -c #{app_path} src"
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Runs the Symfony2 migrations"
|
77
|
+
task :migrate do
|
78
|
+
if model_manager == "doctrine"
|
79
|
+
symfony.doctrine.migrations.migrate
|
80
|
+
else
|
81
|
+
if model_manager == "propel"
|
82
|
+
puts " Propel doesn't have built-in migration for now".yellow
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
namespace :symfony do
|
2
|
+
namespace :doctrine do
|
3
|
+
namespace :cache do
|
4
|
+
desc "Clears all metadata cache for a entity manager"
|
5
|
+
task :clear_metadata do
|
6
|
+
pretty_print "--> Clearing Doctrine metadata cache"
|
7
|
+
|
8
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:cache:clear-metadata --env=#{symfony_env_prod}"
|
9
|
+
puts_ok
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Clears all query cache for a entity manager"
|
13
|
+
task :clear_query do
|
14
|
+
pretty_print "--> Clearing Doctrine query cache"
|
15
|
+
|
16
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:cache:clear-query --env=#{symfony_env_prod}"
|
17
|
+
puts_ok
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Clears result cache for a entity manager"
|
21
|
+
task :clear_result do
|
22
|
+
pretty_print "--> Clearing Doctrine result cache"
|
23
|
+
|
24
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:cache:clear-result --env=#{symfony_env_prod}"
|
25
|
+
puts_ok
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :database do
|
30
|
+
desc "Creates the configured databases"
|
31
|
+
task :create, :roles => :db, :only => { :primary => true } do
|
32
|
+
pretty_print "--> Creating databases"
|
33
|
+
|
34
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:database:create --env=#{symfony_env_prod}"
|
35
|
+
puts_ok
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Drops the configured databases"
|
39
|
+
task :drop, :roles => :db, :only => { :primary => true } do
|
40
|
+
pretty_print "--> Dropping databases"
|
41
|
+
|
42
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:database:drop --env=#{symfony_env_prod}"
|
43
|
+
puts_ok
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
namespace :schema do
|
48
|
+
desc "Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output"
|
49
|
+
task :create do
|
50
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:schema:create --env=#{symfony_env_prod}"
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Drops the complete database schema of EntityManager Storage Connection or generate the corresponding SQL output"
|
54
|
+
task :drop do
|
55
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:schema:drop --env=#{symfony_env_prod}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
namespace :migrations do
|
60
|
+
desc "Executes a migration to a specified version or the latest available version"
|
61
|
+
task :migrate, :roles => :db, :only => { :primary => true } do
|
62
|
+
currentVersion = nil
|
63
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:migrations:status --env=#{symfony_env_prod}" do |ch, stream, out|
|
64
|
+
if stream == :out and out =~ /Current Version:[^$]+\(([\w]+)\)/
|
65
|
+
currentVersion = Regexp.last_match(1)
|
66
|
+
end
|
67
|
+
if stream == :out and out =~ /Current Version:\s*0\s*$/
|
68
|
+
currentVersion = 0
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
if currentVersion == nil
|
73
|
+
raise "Could not find current database migration version"
|
74
|
+
end
|
75
|
+
puts " Current database version: #{currentVersion}"
|
76
|
+
|
77
|
+
on_rollback {
|
78
|
+
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database back to version #{currentVersion}? (y/N)")
|
79
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:migrations:migrate #{currentVersion} --env=#{symfony_env_prod} --no-interaction"
|
80
|
+
end
|
81
|
+
}
|
82
|
+
|
83
|
+
if !interactive_mode || Capistrano::CLI.ui.agree("Do you really want to migrate #{symfony_env_prod}'s database? (y/N)")
|
84
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:migrations:migrate --env=#{symfony_env_prod} --no-interaction"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Views the status of a set of migrations"
|
89
|
+
task :status do
|
90
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:migrations:status --env=#{symfony_env_prod}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
namespace :mongodb do
|
95
|
+
namespace :schema do
|
96
|
+
desc "Allows you to create databases, collections and indexes for your documents"
|
97
|
+
task :create do
|
98
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:mongodb:schema:create --env=#{symfony_env_prod}"
|
99
|
+
end
|
100
|
+
|
101
|
+
desc "Allows you to drop databases, collections and indexes for your documents"
|
102
|
+
task :drop do
|
103
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} doctrine:mongodb:schema:drop --env=#{symfony_env_prod}"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
namespace :init do
|
110
|
+
desc "Mounts ACL tables in the database"
|
111
|
+
task :acl, :roles => :db, :only => { :primary => true } do
|
112
|
+
pretty_print "--> Mounting Doctrine ACL tables"
|
113
|
+
|
114
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} init:acl --env=#{symfony_env_prod}"
|
115
|
+
puts_ok
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'colored'
|
2
|
+
|
3
|
+
# Be less verbose by default
|
4
|
+
logger.level = Logger::IMPORTANT
|
5
|
+
|
6
|
+
STDOUT.sync
|
7
|
+
def pretty_print(msg)
|
8
|
+
if logger.level == Logger::IMPORTANT
|
9
|
+
pretty_errors
|
10
|
+
|
11
|
+
msg << '.' * (55 - msg.size)
|
12
|
+
print msg
|
13
|
+
else
|
14
|
+
puts msg.green
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def puts_ok
|
19
|
+
if logger.level == Logger::IMPORTANT
|
20
|
+
puts '✔'.green
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
$pretty_errors_defined = false
|
25
|
+
|
26
|
+
def pretty_errors
|
27
|
+
if !$pretty_errors_defined
|
28
|
+
$pretty_errors_defined = true
|
29
|
+
|
30
|
+
class << $stderr
|
31
|
+
@@firstLine = true
|
32
|
+
alias _write write
|
33
|
+
|
34
|
+
def write(s)
|
35
|
+
if @@firstLine
|
36
|
+
s = '✘' << "\n" << s
|
37
|
+
@@firstLine = false
|
38
|
+
end
|
39
|
+
|
40
|
+
_write(s.red)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
namespace :symfony do
|
2
|
+
namespace :propel do
|
3
|
+
namespace :database do
|
4
|
+
desc "Creates the configured databases"
|
5
|
+
task :create, :roles => :db, :only => { :primary => true } do
|
6
|
+
pretty_print "--> Creating databases"
|
7
|
+
|
8
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} propel:database:create --env=#{symfony_env_prod}"
|
9
|
+
puts_ok
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Drops the configured databases"
|
13
|
+
task :drop, :roles => :db, :only => { :primary => true } do
|
14
|
+
pretty_print "--> Dropping databases"
|
15
|
+
|
16
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} propel:database:drop --env=#{symfony_env_prod}"
|
17
|
+
puts_ok
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
namespace :build do
|
22
|
+
desc "Builds the Model classes"
|
23
|
+
task :model do
|
24
|
+
command = "propel:model:build"
|
25
|
+
if /2\.0\.[0-9]+.*/ =~ symfony_version
|
26
|
+
command = "propel:build-model"
|
27
|
+
end
|
28
|
+
|
29
|
+
pretty_print "--> Generating Propel classes"
|
30
|
+
|
31
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} #{command} --env=#{symfony_env_prod}"
|
32
|
+
puts_ok
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Builds SQL statements"
|
36
|
+
task :sql do
|
37
|
+
command = "propel:sql:build"
|
38
|
+
if /2\.0\.[0-9]+.*/ =~ symfony_version
|
39
|
+
command = "propel:build-sql"
|
40
|
+
end
|
41
|
+
|
42
|
+
pretty_print "--> Generating Propel SQL"
|
43
|
+
|
44
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} #{command} --env=#{symfony_env_prod}"
|
45
|
+
puts_ok
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Inserts SQL statements"
|
49
|
+
task :sql_load, :roles => :db, :only => { :primary => true } do
|
50
|
+
command = "propel:sql:insert"
|
51
|
+
if /2\.0\.[0-9]+.*/ =~ symfony_version
|
52
|
+
command = "propel:insert-sql"
|
53
|
+
end
|
54
|
+
|
55
|
+
pretty_print "--> Inserting Propel SQL"
|
56
|
+
|
57
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} #{command} --force --env=#{symfony_env_prod}"
|
58
|
+
puts_ok
|
59
|
+
end
|
60
|
+
|
61
|
+
desc "Builds the Model classes, SQL statements and insert SQL"
|
62
|
+
task :all_and_load do
|
63
|
+
pretty_print "--> Setting up Propel (classes, SQL)"
|
64
|
+
|
65
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} propel:build --insert-sql --env=#{symfony_env_prod}"
|
66
|
+
puts_ok
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Generates ACLs models"
|
70
|
+
task :acl do
|
71
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} propel:acl:init --env=#{symfony_env_prod}"
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "Inserts propel ACL tables"
|
75
|
+
task :acl_load, :roles => :db, :only => { :primary => true } do
|
76
|
+
run "cd #{latest_release} && #{php_bin} #{symfony_console} propel:acl:init --env=#{symfony_env_prod} --force"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|