diff --git a/.document b/.document deleted file mode 100644 index c79f1f2..0000000 --- a/.document +++ /dev/null @@ -1,3 +0,0 @@ -LICENSE.md -README.md -lib/**/*.rb \ No newline at end of file diff --git a/.gitignore b/.gitignore index 47c308e..cedb34b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,8 @@ -*.gem -*.rbc -.bundle -.config -.yardoc -Gemfile.lock -InstalledFiles -_yardoc -coverage -doc/ -lib/bundler/man -pkg -rdoc -spec/reports -test/tmp -test/version_tmp -tmp -bin \ No newline at end of file +# Ignore bundler lock file +/Gemfile.lock + +# Ignore pkg folder +/pkg + +# Ignore coverage folder +/coverage diff --git a/.rubocop.yml b/.rubocop.yml deleted file mode 100644 index fb802f8..0000000 --- a/.rubocop.yml +++ /dev/null @@ -1,11 +0,0 @@ -AllCops: - Include: - - 'Gemfile' - Exclude: - - 'script/**/*' - - 'vendor/**/*' - - 'bin/**/*' -Documentation: - Enabled: false -ClassAndModuleChildren: - Enabled: false diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c3e0bfc..0000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: ruby -sudo: false -cache: bundler -bundler_args: --without development -rvm: - - ruby-head - - ruby - - jruby-head - - jruby - - 2.1.0 - - 2.0.0 - - 1.9.3 - - rbx-2 -before_script: bundle update -matrix: - fast_finish: true - allow_failures: - - rvm: ruby-head - - rvm: ruby - - rvm: jruby-head - - rvm: jruby - - rvm: rbx-2 -notifications: - email: false -env: - - CODECLIMATE_REPO_TOKEN=5eee8e8624962f963a52a1d2313dc7407e3b8006291e3704346c786642cc073b diff --git a/.yardopts b/.yardopts deleted file mode 100644 index b95bfb1..0000000 --- a/.yardopts +++ /dev/null @@ -1,6 +0,0 @@ ---markup markdown -- -CHANGELOG.md -CONTRIBUTING.md -LICENSE.md -README.md \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 3ac195b..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,12 +0,0 @@ -Next Release -============ -* Your contribution here. - -2.0.0-alpha (02/08/2015) -================== -* [Fixing compatibility issues with middleman v4.0.0.beta.1](https://github.com/middleman-contrib/middleman-deploy/pull/87) - [@emilioforrer](https://github.com/emilioforrer). - -1.0.0 (16/07/2014) -================== -* [Respect user details of git repo](https://github.com/middleman-contrib/middleman-deploy/pull/70) - [@Gee-Bee](https://github.com/gee-bee). -* [Prevent bad commits deploying](https://github.com/middleman-contrib/middleman-deploy/pull/77) - [@karlfreeman](https://github.com/mconnell). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 41890ea..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,44 +0,0 @@ -## Contributing -In the spirit of [free software][free-sw], **everyone** is encouraged to help -improve this project. - -[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html - -Here are some ways *you* can contribute: - -* by using alpha, beta, and prerelease versions -* by reporting bugs -* by suggesting new features -* by writing or editing documentation -* by writing specifications -* by writing code (**no patch is too small**: fix typos, add comments, clean up - inconsistent whitespace) -* by refactoring code -* by closing [issues][] -* by reviewing patches - -[issues]: https://github.com/karlfreeman/middleman-deploy/issues - -## Submitting an Issue -We use the [GitHub issue tracker][issues] to track bugs and features. Before -submitting a bug report or feature request, check to make sure it hasn't -already been submitted. When submitting a bug report, please include a [Gist][] -that includes a stack trace and any details that may be necessary to reproduce -the bug, including your gem version, Ruby version, and operating system. -Ideally, a bug report should include a pull request with failing specs. - -[gist]: https://gist.github.com/ - -## Submitting a Pull Request -1. [Fork the repository.][fork] -2. [Create a topic branch.][branch] -3. Add specs for your unimplemented feature or bug fix. -4. Run `bundle exec rake cucumber`. If your specs pass, return to step 3. -5. Implement your feature or bug fix. -6. Run `bundle exec rake cucumber`. If your specs fail, return to step 5. -7. Add, commit, and push your changes. -9. [Submit a pull request.][pr] - -[fork]: http://help.github.com/fork-a-repo/ -[branch]: http://learn.github.com/p/branching.html -[pr]: http://help.github.com/send-pull-requests/ diff --git a/LICENSE.md b/COPYING similarity index 52% rename from LICENSE.md rename to COPYING index cdef21c..3f6427a 100644 --- a/LICENSE.md +++ b/COPYING @@ -1,6 +1,4 @@ -Copyright (c) 2012-2014 Tom Vaughan, Karl Freeman - -MIT License +Copyright (c) 2012 Tom Vaughan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -10,13 +8,13 @@ distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Gemfile b/Gemfile index 21791c5..ab9ed9d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,11 +1,19 @@ source 'https://rubygems.org' +# Specify your gem's dependencies in middleman-deploy.gemspec gemspec -group :test do - gem 'rake', '~> 10.0' - gem 'cucumber', '~> 1.3' - gem 'aruba', '~> 0.5' - gem 'fivemat' - gem 'codeclimate-test-reporter' +group :development do + gem "rake" + gem "rdoc" + gem "yard" +end + +group :test do + gem "compass" + gem "cucumber" + gem "fivemat" + gem "aruba" + gem "rspec" + gem "simplecov" end diff --git a/README.md b/README.md index 17ca28f..5d4c794 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,18 @@ -# Middleman Deploy +# middleman-deploy [![Gem Version](https://badge.fury.io/rb/middleman-deploy.png)](http://badge.fury.io/rb/middleman-deploy) -Deploy your [Middleman](http://middlemanapp.com/) build via **rsync**, **ftp**, **sftp**, or **git** (e.g. [gh-pages on github](https://help.github.com/articles/creating-project-pages-manually)). +Deploys a [middleman](http://middlemanapp.com/) built site via **rsync**, +**ftp**, **sftp**, or **git** (e.g. gh-pages on github). ## Installation +Add this to the Gemfile of the repository of your middleman site: + ```ruby -gem 'middleman-deploy', '~> 1.0' +gem "middleman-deploy" ``` +and run `bundle install`. + ## Usage ``` @@ -15,25 +20,37 @@ $ middleman build [--clean] $ middleman deploy [--build-before] ``` +To automatically run `middleman build` during `middleman deploy`, turn on the +`build_before` option while activating the deploy extension: + +```ruby +activate :deploy do |deploy| + # ... + deploy.build_before = true # default: false +end +``` + ## Possible Configurations -Middleman-deploy can deploy a site via rsync, ftp, sftp, or git. Checkout [the wiki](https://github.com/tvaughan/middleman-deploy/wiki/_pages) for advanced set-up options. +Middleman-deploy can deploy a site via rsync, ftp, sftp, or git. -### Rsync +Checkout [the wiki](https://github.com/tvaughan/middleman-deploy/wiki/_pages) for advanced set-up options. + +### rsync Make sure that `rsync` is installed, and activate the extension by adding the following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.deploy_method = :rsync - deploy.host = 'www.example.com' - deploy.path = '/srv/www/site' + deploy.method = :rsync + deploy.host = "www.example.com" + deploy.path = "/srv/www/site" # Optional Settings - # deploy.user = 'tvaughan' # no default + # deploy.user = "tvaughan" # no default # deploy.port = 5309 # ssh port, default: 22 # deploy.clean = true # remove orphaned files on remote host, default: false - # deploy.flags = '-rltgoDvzO --no-p --del' # add custom flags, default: -avz + # deploy.flags = "-rltgoDvzO --no-p --del" # add custom flags, default: -avz end ``` @@ -44,12 +61,11 @@ following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.deploy_method = :git + deploy.method = :git # Optional Settings - # deploy.remote = 'custom-remote' # remote name or git url, default: origin - # deploy.branch = 'custom-branch' # default: gh-pages + # deploy.remote = "custom-remote" # remote name or git url, default: origin + # deploy.branch = "custom-branch" # default: gh-pages # deploy.strategy = :submodule # commit strategy: can be :force_push or :submodule, default: :force_push - # deploy.commit_message = 'custom-message' # commit message (can be empty), default: Automated commit at `timestamp` by middleman-deploy `version` end ``` @@ -70,11 +86,11 @@ Activate the extension by adding the following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.deploy_method = :ftp - deploy.host = 'ftp.example.com' - deploy.path = '/srv/www/site' - deploy.user = 'tvaughan' - deploy.password = 'secret' + deploy.method = :ftp + deploy.host = "ftp.example.com" + deploy.path = "/srv/www/site" + deploy.user = "tvaughan" + deploy.password = "secret" end ``` @@ -84,25 +100,13 @@ Activate the extension by adding the following to `config.rb`: ```ruby activate :deploy do |deploy| - deploy.deploy_method = :sftp - deploy.host = 'sftp.example.com' - deploy.port = 22 - deploy.path = '/srv/www/site' + 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 -end -``` - -### Run Automatically - -To automatically run `middleman build` during `middleman deploy`, turn on the -`build_before` option while activating the deploy extension: - -```ruby -activate :deploy do |deploy| - # ... - deploy.build_before = true # default: false + # deploy.user = "tvaughan" # no default + # deploy.password = "secret" # no default end ``` @@ -115,15 +119,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.deploy_method = :rsync - deploy.host = 'www.example.com' - deploy.path = '/srv/www/production-site' + deploy.method = :rsync + deploy.host = "www.example.com" + deploy.path = "/srv/www/production-site" end else activate :deploy do |deploy| - deploy.deploy_method = :rsync - deploy.host = 'staging.example.com' - deploy.path = '/srv/www/staging-site' + deploy.method = :rsync + deploy.host = "staging.example.com" + deploy.path = "/srv/www/staging-site" end end ``` @@ -133,7 +137,7 @@ end namespace :deploy do def deploy(env) puts "Deploying to #{env}" - system "TARGET=#{env} bundle exec middleman deploy" + exec "TARGET=#{env} bundle exec middleman deploy" end task :staging do @@ -146,41 +150,28 @@ namespace :deploy do end ``` -``` -$ rake deploy:staging -$ rake deploy:production -``` + $ rake deploy:staging + $ rake deploy:production -## Badges +## Breaking Changes -[![Gem Version](http://img.shields.io/gem/v/middleman-deploy.svg)][gem] -[![Build Status](http://img.shields.io/travis/karlfreeman/middleman-deploy.svg)][travis] -[![Code Quality](http://img.shields.io/codeclimate/github/karlfreeman/middleman-deploy.svg)][codeclimate] -[![Code Coverage](http://img.shields.io/codeclimate/coverage/github/karlfreeman/middleman-deploy.svg)][codeclimate] -[![Gittip](http://img.shields.io/gittip/karlfreeman.svg)][gittip] +* `v0.1.0` + - Removed the `--clean` command-line option. This option only applied to + the rsync deploy method. The idea going forward is that command-line + options must apply to all deploy methods. Options that are specific to a + deploy method will only be available in `config.rb`. + - Removed `deploy` from the `after_build` hook. This caused a `deploy` to + be run each time `build` was called. This workflow never made + sense. `deploy` was added to the `after_build` hook simply because it + was available. -## Supported Ruby Versions +## Thanks! -This library aims to support and is [tested against][travis] the following Ruby -implementations: +A **BIG** thanks to +[everyone who has contributed](https://github.com/tvaughan/middleman-deploy/graphs/contributors)! +Almost all pull requests are accepted. -- Ruby 2.1.0 -- Ruby 2.0.0 -- Ruby 1.9.3 -- [JRuby][jruby] -- [Rubinius][rubinius] +## Other -# Credits - -A **BIG** thanks to [everyone who has contributed](https://github.com/karlfreeman/middleman-deploy/graphs/contributors)! Almost all pull requests are accepted. - -Inspiration: - -- The rsync task in [Octopress](https://github.com/imathis/octopress) - -[gem]: https://rubygems.org/gems/middleman-deploy -[travis]: http://travis-ci.org/karlfreeman/middleman-deploy -[codeclimate]: https://codeclimate.com/github/karlfreeman/middleman-deploy -[gittip]: https://www.gittip.com/karlfreeman -[jruby]: http://www.jruby.org -[rubinius]: http://rubini.us +Inspired by the rsync task in +[Octopress](https://github.com/imathis/octopress). diff --git a/Rakefile b/Rakefile index bd08477..a211efa 100644 --- a/Rakefile +++ b/Rakefile @@ -1,25 +1,14 @@ require 'bundler' -Bundler.setup Bundler::GemHelper.install_tasks require 'cucumber/rake/task' + Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t| - exempt_tags = ['--tags ~@wip'] - t.cucumber_opts = "--color #{exempt_tags.join(' ')} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}" + t.cucumber_opts = "--color --tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}" end -begin - require 'yard' - YARD::Rake::YardocTask.new -rescue LoadError -end +require 'rake/clean' -begin - require 'rubocop/rake_task' - desc 'Run rubocop' - RuboCop::RakeTask.new(:rubocop) -rescue LoadError -end +task :test => ["cucumber"] -task default: :cucumber -task test: :cucumber +task :default => :test \ No newline at end of file diff --git a/USAGE b/USAGE new file mode 100644 index 0000000..c2f49ab --- /dev/null +++ b/USAGE @@ -0,0 +1,56 @@ +You should follow one of the four examples below to setup the deploy +extension in config.rb. + +# To deploy the build directory to a remote host via rsync: +activate :deploy do |deploy| + deploy.method = :rsync + # host and path *must* be set + deploy.host = "www.example.com" + deploy.path = "/srv/www/site" + # user is optional (no default) + deploy.user = "tvaughan" + # port is optional (default is 22) + deploy.port = 5309 + # clean is optional (default is false) + deploy.clean = true + # flags is optional (default is -avze) + deploy.flags = "-rltgoDvzO --no-p --del -e" +end + +# To deploy to a remote branch via git (e.g. gh-pages on github): +activate :deploy do |deploy| + deploy.method = :git + # remote is optional (default is "origin") + # run `git remote -v` to see a list of possible remotes + deploy.remote = "some-other-remote-name" + + # branch is optional (default is "gh-pages") + # run `git branch -a` to see a list of possible branches + deploy.branch = "some-other-branch-name" + + # strategy is optional (default is :force_push) + deploy.strategy = :submodule +end + +# To deploy the build directory to a remote host via ftp: +activate :deploy do |deploy| + deploy.method = :ftp + # host, user, passwword and path *must* be set + deploy.host = "ftp.example.com" + deploy.path = "/srv/www/site" + deploy.user = "tvaughan" + deploy.password = "secret" +end + +# To deploy the build directory to a remote host via sftp: +activate :deploy do |deploy| + deploy.method = :sftp + # host, user, passwword and path *must* be set + deploy.host = "sftp.example.com" + deploy.port = 22 + deploy.path = "/srv/www/site" + # user is optional (no default) + deploy.user = "tvaughan" + # password is optional (no default) + deploy.password = "secret" +end diff --git a/features/support/env.rb b/features/support/env.rb index 41f7c3f..3352ebf 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,8 +1,6 @@ +require "simplecov" +SimpleCov.start PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__))) -require 'middleman-core' -require 'middleman-core/step_definitions' - -require 'codeclimate-test-reporter' -CodeClimate::TestReporter.start - +require "middleman-core" +require "middleman-core/step_definitions" require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-deploy') diff --git a/features/test.feature b/features/test.feature deleted file mode 100644 index 77daad0..0000000 --- a/features/test.feature +++ /dev/null @@ -1,6 +0,0 @@ -Feature: test - - Scenario: whilst testing - Given the Server is running at "test-app" - When I go to "/index.html" - Then I should see "

Test

" \ No newline at end of file diff --git a/fixtures/test-app/config.rb b/fixtures/test-app/config.rb deleted file mode 100644 index e69de29..0000000 diff --git a/fixtures/test-app/source/index.html.erb b/fixtures/test-app/source/index.html.erb deleted file mode 100644 index d87d360..0000000 --- a/fixtures/test-app/source/index.html.erb +++ /dev/null @@ -1 +0,0 @@ -

Test

\ No newline at end of file diff --git a/lib/middleman-deploy.rb b/lib/middleman-deploy.rb index 124cd48..78b96d4 100644 --- a/lib/middleman-deploy.rb +++ b/lib/middleman-deploy.rb @@ -1,8 +1,8 @@ -require 'middleman-core' +require "middleman-core" -require 'middleman-deploy/commands' +require "middleman-deploy/commands" ::Middleman::Extensions.register(:deploy) do - require 'middleman-deploy/extension' - ::Middleman::Deploy::Extension + require "middleman-deploy/extension" + ::Middleman::Deploy end diff --git a/lib/middleman-deploy/commands.rb b/lib/middleman-deploy/commands.rb index c781949..4f274a3 100644 --- a/lib/middleman-deploy/commands.rb +++ b/lib/middleman-deploy/commands.rb @@ -1,83 +1,60 @@ -require 'middleman-core/cli' -require 'middleman-core/rack' if Middleman::VERSION.to_i > 3 -require 'middleman-deploy/pkg-info' -require 'middleman-deploy/extension' -require 'middleman-deploy/methods' -require 'middleman-deploy/strategies' +require "middleman-core/cli" + +require "middleman-deploy/extension" +require "middleman-deploy/methods" +require "middleman-deploy/strategies" +require "middleman-deploy/pkg-info" module Middleman module Cli + # This class provides a "deploy" command for the middleman CLI. - class Deploy < Thor::Group + class Deploy < Thor 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 protected - def build_before(options = {}) - build_enabled = options.fetch('build_before', deploy_options.build_before) + def build_before(options={}) + build_enabled = options.fetch('build_before', self.deploy_options.build_before) if build_enabled # http://forum.middlemanapp.com/t/problem-with-the-build-task-in-an-extension - run("middleman build -e #{options['environment']}") || exit(1) + run('middleman build') || exit(1) end end def print_usage_and_die(message) - fail StandardError, "ERROR: #{message}\n#{Middleman::Deploy::README}" + usage_path = File.join(File.dirname(__FILE__), '..', '..', 'USAGE') + usage_message = File.read(usage_path) + + raise Error, "ERROR: #{message}\n#{usage_message}" end def process - server_instance = @app - camelized_method = deploy_options.deploy_method.to_s.split('_').map(&:capitalize).join + server_instance = ::Middleman::Application.server.inst + + camelized_method = self.deploy_options.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, deploy_options) + method_instance = method_class_name.constantize.new(server_instance, self.deploy_options) method_instance.process end @@ -86,23 +63,23 @@ module Middleman options = nil begin - options = ::Middleman::Deploy.options + options = ::Middleman::Application.server.inst.options rescue NoMethodError - print_usage_and_die 'You need to activate the deploy extension in config.rb.' + print_usage_and_die "You need to activate the deploy extension in config.rb." end - unless options.deploy_method - print_usage_and_die 'The deploy extension requires you to set a method.' + unless options.method + print_usage_and_die "The deploy extension requires you to set a method." end - case options.deploy_method + case options.method when :rsync, :sftp unless options.host && options.path - print_usage_and_die "The #{options.deploy_method} method requires host and path to be set." + print_usage_and_die "The #{options.method} method requires host and path to be set." end when :ftp unless options.host && options.user && options.password && options.path - print_usage_and_die 'The ftp deploy method requires host, path, user, and password to be set.' + print_usage_and_die "The ftp deploy method requires host, path, user, and password to be set." end end @@ -110,10 +87,7 @@ 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') + Base.map({ "d" => "deploy" }) end end diff --git a/lib/middleman-deploy/extension.rb b/lib/middleman-deploy/extension.rb index b7f59cb..9882b06 100644 --- a/lib/middleman-deploy/extension.rb +++ b/lib/middleman-deploy/extension.rb @@ -1,35 +1,20 @@ # Require core library -require 'middleman-core' +require "middleman-core" # Extension namespace module Middleman module Deploy - @options + + class Options < Struct.new(:whatisthis, :method, :host, :port, :user, :password, :path, :clean, :remote, :branch, :strategy, :build_before, :flags); end class << self - attr_reader :options - attr_writer :options - end - - 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 options + @@options + end + def registered(app, options_hash={}, &block) + options = Options.new(options_hash) yield options if block_given? # Default options for the rsync method. @@ -37,17 +22,26 @@ module Middleman options.clean ||= false # Default options for the git method. - options.remote ||= 'origin' - options.branch ||= 'gh-pages' - options.strategy ||= :force_push - options.commit_message ||= nil + options.remote ||= "origin" + options.branch ||= "gh-pages" + options.strategy ||= :force_push options.build_before ||= false + + @@options = options + + app.send :include, Helpers end - def after_configuration - ::Middleman::Deploy.options = options + alias :included :registered + + 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 e4e2aae..982d5f2 100644 --- a/lib/middleman-deploy/methods/base.rb +++ b/lib/middleman-deploy/methods/base.rb @@ -4,18 +4,15 @@ module Middleman class Base attr_reader :options, :server_instance - def initialize(server_instance, options = {}) + def initialize(server_instance, options={}) @options = options @server_instance = server_instance end - def build_dir - server_instance.config.setting(:build_dir).value + def process + raise NotImplementedError end - def process - fail NotImplementedError - end end end end diff --git a/lib/middleman-deploy/methods/ftp.rb b/lib/middleman-deploy/methods/ftp.rb index 619abe2..e2bba10 100644 --- a/lib/middleman-deploy/methods/ftp.rb +++ b/lib/middleman-deploy/methods/ftp.rb @@ -5,9 +5,10 @@ module Middleman module Deploy module Methods class Ftp < Base + attr_reader :host, :port, :pass, :path, :user - def initialize(server_instance, options = {}) + def initialize(server_instance, options={}) super(server_instance, options) @host = self.options.host @@ -18,15 +19,15 @@ module Middleman end def process - puts "## Deploying via ftp to #{user}@#{host}:#{path}" + puts "## Deploying via ftp to #{self.user}@#{self.host}:#{self.path}" ftp = open_connection - Dir.chdir(build_dir) do + Dir.chdir(self.server_instance.build_dir) do filtered_files.each do |filename| if File.directory?(filename) upload_directory(ftp, filename) - else + else upload_binary(ftp, filename) end end @@ -35,7 +36,7 @@ module Middleman ftp.close end - protected + protected def filtered_files files = Dir.glob('**/*', File::FNM_DOTMATCH) @@ -45,7 +46,7 @@ module Middleman def handle_exception(exception, ftp, filename) reply = exception.message - err_code = reply[0, 3].to_i + err_code = reply[0,3].to_i if err_code == 550 if File.binary?(filename) @@ -57,9 +58,9 @@ module Middleman end def open_connection - ftp = Net::FTP.new(host) - ftp.login(user, pass) - ftp.chdir(path) + ftp = Net::FTP.new(self.host) + ftp.login(self.user, self.pass) + ftp.chdir(self.path) ftp.passive = true ftp @@ -76,10 +77,14 @@ module Middleman end def upload_directory(ftp, filename) - ftp.mkdir(filename) - puts "Created directory #{filename}" - rescue + begin + ftp.mkdir(filename) + puts "Created directory #{filename}" + rescue + end end + + end end end diff --git a/lib/middleman-deploy/methods/git.rb b/lib/middleman-deploy/methods/git.rb index 82bc2cc..b23627f 100644 --- a/lib/middleman-deploy/methods/git.rb +++ b/lib/middleman-deploy/methods/git.rb @@ -2,15 +2,17 @@ module Middleman module Deploy module Methods class Git < Base - def process - puts "## Deploying via git to remote=\"#{options.remote}\" and branch=\"#{options.branch}\"" - camelized_strategy = options.strategy.to_s.split('_').map(&:capitalize).join + def process + puts "## Deploying via git to remote=\"#{self.options.remote}\" and branch=\"#{self.options.branch}\"" + + 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(build_dir, options.remote, options.branch, options.commit_message) + strategy_instance = strategy_class_name.constantize.new(self.server_instance.build_dir, self.options.remote, self.options.branch) strategy_instance.process end + end end end diff --git a/lib/middleman-deploy/methods/rsync.rb b/lib/middleman-deploy/methods/rsync.rb index dcc8abb..c65454a 100644 --- a/lib/middleman-deploy/methods/rsync.rb +++ b/lib/middleman-deploy/methods/rsync.rb @@ -2,9 +2,10 @@ module Middleman module Deploy module Methods class Rsync < Base + attr_reader :clean, :flags, :host, :path, :port, :user - def initialize(server_instance, options = {}) + def initialize(server_instance, options={}) super(server_instance, options) @clean = self.options.clean @@ -17,17 +18,20 @@ module Middleman def process # Append "@" to user if provided. - user = "#{self.user}@" if user && !user.empty? + user = "#{self.user}@" if self.user && !self.user.empty? - dest_url = "#{user}#{host}:#{path}" + dest_url = "#{user}#{self.host}:#{self.path}" flags = self.flags || '-avz' - command = "rsync #{flags} '-e ssh -p #{port}' #{build_dir}/ #{dest_url}" + command = "rsync #{flags} '-e ssh -p #{self.port}' #{self.server_instance.build_dir}/ #{dest_url}" - command += ' --delete' if clean + if self.clean + command += " --delete" + end - puts "## Deploying via rsync to #{dest_url} port=#{port}" - exec command + puts "## Deploying via rsync to #{dest_url} port=#{self.port}" + run command end + end end end diff --git a/lib/middleman-deploy/methods/sftp.rb b/lib/middleman-deploy/methods/sftp.rb index 572c402..1783e4a 100644 --- a/lib/middleman-deploy/methods/sftp.rb +++ b/lib/middleman-deploy/methods/sftp.rb @@ -5,14 +5,15 @@ module Middleman module Deploy module Methods class Sftp < Ftp + def process - puts "## Deploying via sftp to #{user}@#{host}:#{path}" + puts "## Deploying via sftp to #{self.user}@#{self.host}:#{path}" # `nil` is a valid value for user and/or pass. - Net::SFTP.start(host, user, password: pass, port: port) do |sftp| - sftp.mkdir(path) + Net::SFTP.start(self.host, self.user, :password => self.pass, :port => self.port) do |sftp| + sftp.mkdir(self.path) - Dir.chdir(build_dir) do + Dir.chdir(self.server_instance.build_dir) do filtered_files.each do |filename| if File.directory?(filename) upload_directory(sftp, filename) @@ -24,17 +25,19 @@ module Middleman end end - protected + protected - def handle_exception(exception, filename, file_path) + def handle_exception(exception) reply = exception.message - err_code = reply[0, 3].to_i + err_code = reply[0,3].to_i - sftp.upload(filename, file_path) if err_code == 550 + if err_code == 550 + sftp.upload(filename, file_path) + end end def upload_directory(sftp, filename) - file_path = "#{path}/#{filename}" + file_path = "#{self.path}/#{filename}" begin sftp.mkdir(file_path) @@ -44,17 +47,19 @@ module Middleman end def upload_file(sftp, filename) - file_path = "#{path}/#{filename}" + file_path = "#{self.path}/#{filename}" begin sftp.upload(filename, file_path) rescue Exception => exception - handle_exception(exception, filename, file_path) + handle_exception(exception, file_path) end puts "Copied #{filename}" end + end end end end + diff --git a/lib/middleman-deploy/pkg-info.rb b/lib/middleman-deploy/pkg-info.rb index bde3750..92babf5 100644 --- a/lib/middleman-deploy/pkg-info.rb +++ b/lib/middleman-deploy/pkg-info.rb @@ -1,64 +1,7 @@ module Middleman module Deploy - PACKAGE = 'middleman-deploy' - VERSION = '2.0.0-alpha' - TAGLINE = 'Deploy a middleman built site over rsync, ftp, sftp, or git (e.g. gh-pages on github).' - README = %{ -You should follow one of the four examples below to setup the deploy -extension in config.rb. - -# To deploy the build directory to a remote host via rsync: -activate :deploy do |deploy| - deploy.method = :rsync - # host and path *must* be set - deploy.host = "www.example.com" - deploy.path = "/srv/www/site" - # user is optional (no default) - deploy.user = "tvaughan" - # port is optional (default is 22) - deploy.port = 5309 - # clean is optional (default is false) - deploy.clean = true - # flags is optional (default is -avze) - deploy.flags = "-rltgoDvzO --no-p --del -e" -end - -# To deploy to a remote branch via git (e.g. gh-pages on github): -activate :deploy do |deploy| - deploy.method = :git - # remote is optional (default is "origin") - # run `git remote -v` to see a list of possible remotes - deploy.remote = "some-other-remote-name" - - # branch is optional (default is "gh-pages") - # run `git branch -a` to see a list of possible branches - deploy.branch = "some-other-branch-name" - - # strategy is optional (default is :force_push) - deploy.strategy = :submodule -end - -# To deploy the build directory to a remote host via ftp: -activate :deploy do |deploy| - deploy.method = :ftp - # host, user, passwword and path *must* be set - deploy.host = "ftp.example.com" - deploy.path = "/srv/www/site" - deploy.user = "tvaughan" - deploy.password = "secret" -end - -# To deploy the build directory to a remote host via sftp: -activate :deploy do |deploy| - deploy.method = :sftp - # host, user, passwword and path *must* be set - deploy.host = "sftp.example.com" - deploy.port = 22 - deploy.path = "/srv/www/site" - # user is optional (no default) - deploy.user = "tvaughan" - # password is optional (no default) - deploy.password = "secret" -end} + PACKAGE = "middleman-deploy" + VERSION = "0.2.2" + TAGLINE = "Deploy a middleman built site over rsync, ftp, sftp, or git (e.g. gh-pages on github)." end end diff --git a/lib/middleman-deploy/strategies/git/base.rb b/lib/middleman-deploy/strategies/git/base.rb index f0a667b..5304a92 100644 --- a/lib/middleman-deploy/strategies/git/base.rb +++ b/lib/middleman-deploy/strategies/git/base.rb @@ -3,22 +3,19 @@ module Middleman module Strategies module Git class Base - attr_accessor :branch, :build_dir, :remote, :commit_message, :user_name, :user_email + attr_accessor :branch, :build_dir, :remote - def initialize(build_dir, remote, branch, commit_message) - self.branch = branch - self.build_dir = build_dir - self.remote = remote - self.commit_message = commit_message - self.user_name = `git config --get user.name` - self.user_email = `git config --get user.email` + def initialize(build_dir, remote, branch) + self.branch = branch + self.build_dir = build_dir + self.remote = remote end def process - fail NotImplementedError + raise NotImplementedError end - protected + protected def add_signature_to_commit_message(base_message) signature = "#{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}" @@ -29,26 +26,21 @@ module Middleman def checkout_branch # if there is a branch with that name, switch to it, otherwise create a new one and switch to it - if `git branch`.split("\n").any? { |b| b =~ /#{branch}/i } - `git checkout #{branch}` + if `git branch`.split("\n").any? { |b| b =~ /#{self.branch}/i } + `git checkout #{self.branch}` else - `git checkout -b #{branch}` + `git checkout -b #{self.branch}` end end - def commit_branch(options = '') - message = commit_message ? commit_message : add_signature_to_commit_message('Automated commit') + def commit_branch(options='') + message = add_signature_to_commit_message('Automated commit') - run_or_fail('git add -A') - run_or_fail("git commit --allow-empty -am \"#{message}\"") - run_or_fail("git push #{options} origin #{branch}") + `git add -A` + `git commit --allow-empty -am "#{message}"` + `git push #{options} origin #{self.branch}` end - private - - def run_or_fail(command) - system(command) || fail("ERROR running: #{command}") - end end end end diff --git a/lib/middleman-deploy/strategies/git/force_push.rb b/lib/middleman-deploy/strategies/git/force_push.rb index 5c1348c..786dacb 100644 --- a/lib/middleman-deploy/strategies/git/force_push.rb +++ b/lib/middleman-deploy/strategies/git/force_push.rb @@ -3,34 +3,29 @@ module Middleman module Strategies module Git class ForcePush < Base + def process - Dir.chdir(build_dir) do + Dir.chdir(self.build_dir) do add_remote_url checkout_branch commit_branch('-f') end end - private + private def add_remote_url url = get_remote_url - unless File.exist?('.git') + unless File.exists?('.git') `git init` `git remote add origin #{url}` - `git config user.name "#{user_name}"` - `git config user.email "#{user_email}"` else # check if the remote repo has changed unless url == `git config --get remote.origin.url`.chop `git remote rm origin` `git remote add origin #{url}` end - # check if the user name has changed - `git config user.name "#{user_name}"` unless user_name == `git config --get user.name` - # check if the user email has changed - `git config user.email "#{user_email}"` unless user_email == `git config --get user.email` end end @@ -51,6 +46,7 @@ module Middleman url end + end end end diff --git a/lib/middleman-deploy/strategies/git/submodule.rb b/lib/middleman-deploy/strategies/git/submodule.rb index e974226..39ee75f 100644 --- a/lib/middleman-deploy/strategies/git/submodule.rb +++ b/lib/middleman-deploy/strategies/git/submodule.rb @@ -3,8 +3,9 @@ module Middleman module Strategies module Git class Submodule < Base + def process - Dir.chdir(build_dir) do + Dir.chdir(self.build_dir) do checkout_branch pull_submodule commit_branch @@ -13,13 +14,13 @@ module Middleman commit_submodule end - private + private def commit_submodule current_branch = `git rev-parse --abbrev-ref HEAD` message = add_signature_to_commit_message('Deployed') - `git add #{build_dir}` + `git add #{self.build_dir}` `git commit --allow-empty -m "#{message}"` `git push origin #{current_branch}` end @@ -27,14 +28,15 @@ module Middleman def pull_submodule `git fetch` `git stash` - `git rebase #{remote}/#{branch}` + `git rebase #{self.remote}/#{self.branch}` `git stash pop` - if $CHILD_STATUS.exitstatus == 1 - puts "Can't deploy! Please resolve conflicts. Then process to manual commit and push on #{branch} branch." + if $?.exitstatus == 1 + puts "Can't deploy! Please resolve conflicts. Then process to manual commit and push on #{self.branch} branch." exit end end + end end end diff --git a/lib/middleman_extension.rb b/lib/middleman_extension.rb index c810845..233dc74 100644 --- a/lib/middleman_extension.rb +++ b/lib/middleman_extension.rb @@ -1 +1 @@ -require 'middleman-deploy' +require "middleman-deploy" \ No newline at end of file diff --git a/middleman-deploy.gemspec b/middleman-deploy.gemspec index 1c50a7c..6695512 100644 --- a/middleman-deploy.gemspec +++ b/middleman-deploy.gemspec @@ -1,32 +1,27 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'middleman-deploy/pkg-info' +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "middleman-deploy/pkg-info" -Gem::Specification.new do |spec| - spec.name = Middleman::Deploy::PACKAGE - spec.version = Middleman::Deploy::VERSION - spec.authors = ['Tom Vaughan', 'Karl Freeman'] - spec.email = ['thomas.david.vaughan@gmail.com', 'karlfreeman@gmail.com'] - spec.summary = Middleman::Deploy::TAGLINE - spec.description = Middleman::Deploy::TAGLINE - spec.homepage = 'https://github.com/karlfreeman/middleman-deploy' - spec.license = 'MIT' +Gem::Specification.new do |s| + s.name = Middleman::Deploy::PACKAGE + s.version = Middleman::Deploy::VERSION + s.platform = Gem::Platform::RUBY + s.authors = ["Tom Vaughan"] + s.email = ["thomas.david.vaughan@gmail.com"] + s.homepage = "http://github.com/tvaughan/middleman-deploy" + s.summary = Middleman::Deploy::TAGLINE + s.description = Middleman::Deploy::TAGLINE + s.license = "MIT" - spec.files = `git ls-files -z`.split("\x0") - spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) - spec.require_paths = ['lib'] - spec.required_ruby_version = '>= 1.9.3' + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = ["lib"] - spec.add_dependency 'middleman-core', '>= 3.2' - spec.add_dependency 'ptools' - spec.add_dependency 'net-sftp' + # The version of middleman-core your extension depends on + s.add_runtime_dependency("middleman-core", [">= 3.0.0"]) - spec.add_development_dependency 'bundler', '~> 1.5' - spec.add_development_dependency 'rake', '~> 10.0' - spec.add_development_dependency 'kramdown', '>= 0.14' - spec.add_development_dependency 'rubocop', '~> 0.19' - spec.add_development_dependency 'pry' - spec.add_development_dependency 'yard' + # Additional dependencies + s.add_runtime_dependency("ptools") + s.add_runtime_dependency("net-sftp") end