diff --git a/CHANGELOG.md b/CHANGELOG.md index 48f652d..5a1bd4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,11 @@ master * Respect user details of git repo. #70 * Prevent bad commits deploying. (git) #77 + +development +=== + +2.0.0 +=== + +* Fixing compatibility issues with middleman v4.0.0.beta.1 diff --git a/README.md b/README.md index 6ddd1e4..17ca28f 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,9 @@ following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.method = :rsync - deploy.host = 'www.example.com' - deploy.path = '/srv/www/site' + deploy.deploy_method = :rsync + deploy.host = 'www.example.com' + deploy.path = '/srv/www/site' # Optional Settings # deploy.user = 'tvaughan' # no default # deploy.port = 5309 # ssh port, default: 22 @@ -44,7 +44,7 @@ following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.method = :git + deploy.deploy_method = :git # Optional Settings # deploy.remote = 'custom-remote' # remote name or git url, default: origin # deploy.branch = 'custom-branch' # default: gh-pages @@ -70,11 +70,11 @@ Activate the extension by adding the following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.method = :ftp - deploy.host = 'ftp.example.com' - deploy.path = '/srv/www/site' - deploy.user = 'tvaughan' - deploy.password = 'secret' + deploy.deploy_method = :ftp + deploy.host = 'ftp.example.com' + deploy.path = '/srv/www/site' + deploy.user = 'tvaughan' + deploy.password = 'secret' end ``` @@ -84,10 +84,10 @@ Activate the extension by adding the following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.method = :sftp - deploy.host = 'sftp.example.com' - deploy.port = 22 - deploy.path = '/srv/www/site' + deploy.deploy_method = :sftp + deploy.host = 'sftp.example.com' + deploy.port = 22 + deploy.path = '/srv/www/site' # Optional Settings # deploy.user = 'tvaughan' # no default # deploy.password = 'secret' # no default @@ -115,15 +115,15 @@ Deploy your site to more than one configuration using environment variables. case ENV['TARGET'].to_s.downcase when 'production' activate :deploy do |deploy| - deploy.method = :rsync - deploy.host = 'www.example.com' - deploy.path = '/srv/www/production-site' + deploy.deploy_method = :rsync + deploy.host = 'www.example.com' + deploy.path = '/srv/www/production-site' end else activate :deploy do |deploy| - deploy.method = :rsync - deploy.host = 'staging.example.com' - deploy.path = '/srv/www/staging-site' + deploy.deploy_method = :rsync + deploy.host = 'staging.example.com' + deploy.path = '/srv/www/staging-site' end end ``` diff --git a/lib/middleman-deploy.rb b/lib/middleman-deploy.rb index 796f4ca..124cd48 100644 --- a/lib/middleman-deploy.rb +++ b/lib/middleman-deploy.rb @@ -4,5 +4,5 @@ require 'middleman-deploy/commands' ::Middleman::Extensions.register(:deploy) do require 'middleman-deploy/extension' - ::Middleman::Deploy + ::Middleman::Deploy::Extension end diff --git a/lib/middleman-deploy/commands.rb b/lib/middleman-deploy/commands.rb index 345615a..549caab 100644 --- a/lib/middleman-deploy/commands.rb +++ b/lib/middleman-deploy/commands.rb @@ -8,24 +8,53 @@ require 'middleman-deploy/strategies' module Middleman module Cli # This class provides a "deploy" command for the middleman CLI. - class Deploy < Thor + class Deploy < Thor::Group include Thor::Actions check_unknown_options! namespace :deploy + class_option :environment, + aliases: '-e', + default: ENV['MM_ENV'] || ENV['RACK_ENV'] || 'production', + desc: 'The environment Middleman will run under' + + class_option :verbose, + type: :boolean, + default: false, + desc: 'Print debug messages' + + class_option :instrument, + type: :string, + default: false, + desc: 'Print instrument messages' + + class_option :build_before, + type: :boolean, + aliases: '-b', + desc: 'Run `middleman build` before the deploy step' + + def self.subcommand_help options + # TODO + end + # Tell Thor to exit with a nonzero exit code on failure def self.exit_on_failure? true end - desc 'deploy [options]', Middleman::Deploy::TAGLINE - method_option 'build_before', - type: :boolean, - aliases: '-b', - desc: 'Run `middleman build` before the deploy step' + def deploy + env = options['environment'] ? :production : options['environment'].to_s.to_sym + verbose = options['verbose'] ? 0 : 1 + instrument = options['instrument'] + + @app = ::Middleman::Application.new do + config[:mode] = :build + config[:environment] = env + ::Middleman::Logger.singleton(verbose, instrument) + end build_before(options) process end @@ -37,18 +66,19 @@ module Middleman if build_enabled # http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension - run('middleman build') || exit(1) + run("middleman build -e #{options['environment']}") || exit(1) end end def print_usage_and_die(message) - raise Error, "ERROR: #{message}\n#{Middleman::Deploy::README}" + raise StandardError, "ERROR: #{message}\n#{Middleman::Deploy::README}" end - def process - server_instance = ::Middleman::Application.server.inst - camelized_method = self.deploy_options.method.to_s.split('_').map { |word| word.capitalize}.join + + def process + server_instance = @app + camelized_method = self.deploy_options.deploy_method.to_s.split('_').map { |word| word.capitalize}.join method_class_name = "Middleman::Deploy::Methods::#{camelized_method}" method_instance = method_class_name.constantize.new(server_instance, self.deploy_options) @@ -59,19 +89,19 @@ module Middleman options = nil begin - options = ::Middleman::Application.server.inst.options + options = ::Middleman::Deploy.options rescue NoMethodError print_usage_and_die 'You need to activate the deploy extension in config.rb.' end - unless options.method + unless options.deploy_method print_usage_and_die 'The deploy extension requires you to set a method.' end - case options.method + case options.deploy_method when :rsync, :sftp unless options.host && options.path - print_usage_and_die "The #{options.method} method requires host and path to be set." + print_usage_and_die "The #{options.deploy_method} method requires host and path to be set." end when :ftp unless options.host && options.user && options.password && options.path @@ -83,6 +113,9 @@ module Middleman end end + # Add to CLI + Base.register(Middleman::Cli::Deploy, 'deploy', 'deploy [options]', Middleman::Deploy::TAGLINE) + # Alias "d" to "deploy" Base.map('d' => 'deploy') end diff --git a/lib/middleman-deploy/extension.rb b/lib/middleman-deploy/extension.rb index 8ad1e16..c10606b 100644 --- a/lib/middleman-deploy/extension.rb +++ b/lib/middleman-deploy/extension.rb @@ -4,15 +4,30 @@ require 'middleman-core' # Extension namespace module Middleman module Deploy - class Options < Struct.new(:method, :host, :port, :user, :password, :path, :clean, :remote, :branch, :strategy, :build_before, :flags, :commit_message); end - class << self - def options - @@options - end + cattr_accessor :options + + class Extension < Extension + + option :deploy_method, nil + option :host, nil + option :port, nil + option :user, nil + option :password, nil + option :path, nil + option :clean, nil + option :remote, nil + option :branch, nil + option :strategy, nil + option :build_before, nil + option :flags, nil + option :commit_message, nil + + + + def initialize(app, options_hash = {}, &block) + super - def registered(app, options_hash = {}, &block) - options = Options.new(options_hash) yield options if block_given? # Default options for the rsync method. @@ -27,18 +42,13 @@ module Middleman options.build_before ||= false - @@options = options - - app.send :include, Helpers end - alias_method :included, :registered + def after_configuration + ::Middleman::Deploy.options = options + end + end - module Helpers - def options - ::Middleman::Deploy.options - end - end end end diff --git a/lib/middleman-deploy/methods/base.rb b/lib/middleman-deploy/methods/base.rb index b8e7627..6e33cf3 100644 --- a/lib/middleman-deploy/methods/base.rb +++ b/lib/middleman-deploy/methods/base.rb @@ -9,6 +9,10 @@ module Middleman @server_instance = server_instance end + def build_dir + self.server_instance.config.setting(:build_dir).value + end + def process raise NotImplementedError end diff --git a/lib/middleman-deploy/methods/ftp.rb b/lib/middleman-deploy/methods/ftp.rb index a930e83..fc42d94 100644 --- a/lib/middleman-deploy/methods/ftp.rb +++ b/lib/middleman-deploy/methods/ftp.rb @@ -22,7 +22,7 @@ module Middleman ftp = open_connection - Dir.chdir(self.server_instance.build_dir) do + Dir.chdir(self.build_dir) do filtered_files.each do |filename| if File.directory?(filename) upload_directory(ftp, filename) diff --git a/lib/middleman-deploy/methods/git.rb b/lib/middleman-deploy/methods/git.rb index 990797e..99a0449 100644 --- a/lib/middleman-deploy/methods/git.rb +++ b/lib/middleman-deploy/methods/git.rb @@ -7,7 +7,7 @@ module Middleman camelized_strategy = self.options.strategy.to_s.split('_').map { |word| word.capitalize}.join strategy_class_name = "Middleman::Deploy::Strategies::Git::#{camelized_strategy}" - strategy_instance = strategy_class_name.constantize.new(self.server_instance.build_dir, self.options.remote, self.options.branch, self.options.commit_message) + strategy_instance = strategy_class_name.constantize.new(self.build_dir, self.options.remote, self.options.branch, self.options.commit_message) strategy_instance.process end diff --git a/lib/middleman-deploy/methods/rsync.rb b/lib/middleman-deploy/methods/rsync.rb index 6316b35..770c5a3 100644 --- a/lib/middleman-deploy/methods/rsync.rb +++ b/lib/middleman-deploy/methods/rsync.rb @@ -21,7 +21,7 @@ module Middleman dest_url = "#{user}#{self.host}:#{self.path}" flags = self.flags || '-avz' - command = "rsync #{flags} '-e ssh -p #{self.port}' #{self.server_instance.build_dir}/ #{dest_url}" + command = "rsync #{flags} '-e ssh -p #{self.port}' #{self.build_dir}/ #{dest_url}" if self.clean command += ' --delete' diff --git a/lib/middleman-deploy/methods/sftp.rb b/lib/middleman-deploy/methods/sftp.rb index 2db6522..7ed2afa 100644 --- a/lib/middleman-deploy/methods/sftp.rb +++ b/lib/middleman-deploy/methods/sftp.rb @@ -12,7 +12,7 @@ module Middleman Net::SFTP.start(self.host, self.user, password: self.pass, port: self.port) do |sftp| sftp.mkdir(self.path) - Dir.chdir(self.server_instance.build_dir) do + Dir.chdir(self.build_dir) do filtered_files.each do |filename| if File.directory?(filename) upload_directory(sftp, filename)