Fixing compatibility issues with middleman v4.0.0.beta.1

master
Emilio Forrer 2015-02-22 15:52:52 -06:00
parent 000cabda96
commit 9eece01aef
10 changed files with 110 additions and 55 deletions

View File

@ -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

View File

@ -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
```

View File

@ -4,5 +4,5 @@ require 'middleman-deploy/commands'
::Middleman::Extensions.register(:deploy) do
require 'middleman-deploy/extension'
::Middleman::Deploy
::Middleman::Deploy::Extension
end

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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'

View File

@ -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)