# # Example capfile for upgrading a Django project # (c) Ville Säävuori , 2007 # http://www.unessa.net/en/hoyci/ # set :project_user, "example" set :project_db, "example" set :project_db_pass, "myelitepasswd" set :project_path, "/home/example/example" set :inpath, "cd #{ project_path }" role :exampleproject, "me@example.dlt" ############################################################################# desc "Upgrades the project on the remote server." task :upgrade_project do # getting the current revision number run "svn info #{project_path} | grep ^Revision" do |channel, stream, data| set :rev, data.split(' ')[1] end # updating new files sudo "svn update #{project_path}" run "svn info #{project_path} | grep ^Revision" do |channel, stream, data| set :this_rev, data.split(' ')[1] end if rev != this_rev # if there is a upgrade.sql in data directory, we'll uprade db, too check_do_db = <<-CMD if [[ -f #{project_path}/data/upgrade.sql ]]; then echo "true"; else echo "false"; fi CMD run check_do_db do |channel, stream, data| puts "Data: #{data}" set :do_db, data.strip end # if there is a local upgrade sql, we'll update the remote db if FileTest.exists?("data/upgrade.sql") # Upgrading database # 1) uploads upgrade.sql to server # 2) makes copy of old db and saves it to databasename.sql.rev_n # 3) imports upgrade.sql to the database # 4) deletes the upgrade script (locally and remotely) # 1 put(File.read('data/upgrade.sql'), "upgrade_#{project_user}.sql") # 2 run "mysqldump -u #{project_user} -p#{project_db_pass} #{project_db} > ~/#{project_db}_tmp.sql" sudo "mv #{project_db}_tmp.sql #{project_path}/data/#{project_db}.sql.rev_#{rev}" # 3 run "mysql -u #{project_user} -p#{project_db_pass} #{project_db} < upgrade_#{project_user}.sql" # 4 run "rm -f upgrade_#{project_user}.sql" File.delete("data/upgrade.sql") else puts "Db not upgraded." end # we don't have a settings.py in subversion so that we can use local # settings.py with no extra hassles. have to rename it here sudo "mv #{project_path}/example/production-settings.py #{project_path}/example/settings.py" sudo "chown -R example:example #{project_path}" run "sudo /etc/init.d/apache2 reload" puts "Upgraded #{project_user} from revision #{rev} to #{this_rev}." else puts "Did not upgrade project. Revision still at #{rev}" end end task :downgrade_project do # Homework! :) end