#!/usr/bin/env ruby require 'rubygems' require 'thor' require 'penchant' require 'fileutils' class PenchantCLI < Thor include Thor::Actions source_root File.expand_path('../..', __FILE__) SCRIPT_DIR = 'script' CLONE_DIR = '..' desc "install", "Copy the common scripts to the project" method_options :dir => SCRIPT_DIR def install directory 'template/script', options[:dir] Dir[File.join(options[:dir], '**/*')].each { |file| File.chmod(0755, file) } if File.directory?('.git') Penchant::Hooks.install! else puts "No git repository detected here. Skipping git hook installation..." end if !File.file?('Gemfile') && !File.file?('Gemfile.penchant') FileUtils.touch('Gemfile.penchant') prepend_to_file 'Gemfile.penchant', <<-RB source :rubygems RB install_gemfile_penchant end end desc "update", "Update the installed scripts" method_options :dir => SCRIPT_DIR def update install end desc "convert", "Make an existing project Penchant-isized" method_options :dir => SCRIPT_DIR def convert install FileUtils.mv 'Gemfile', 'Gemfile.penchant' install_gemfile_penchant end method_options :deployment => false method_options :switch_back => false method_options :no_auto_update => false method_options :local => false desc "gemfile ENV", "Switch the gemfile environment, or rebuild the current environment if not given" def gemfile(env = get_current_env) check_git_hooks! if env if options[:switch_back] puts "[penchant] Switching back, fallback: #{env}..." Penchant::Gemfile.switch_back!(env) else puts "[penchant] Rebunding for #{env} environment#{options[:deployment] ? ", deployment mode" : ''}..." Penchant::Gemfile.do_full_env_switch!(env, options[:deployment]) end end gemfile = Penchant::Gemfile.new if !gemfile.has_gemfile? puts "No Gemfile or Gemfile.penchant, exiting." exit 1 end command = %{bundle} command << " --local" if options[:local] system command # it's asking for bundle update, we know what we're doing if $?.exitstatus == 6 and !options[:no_auto_update] command = %{bundle update} command << " --local" if options[:local] system command end end desc "gemfile-env", "Get the gemfile environment" def gemfile_env puts get_current_env end desc "bootstrap [DIR = #{CLONE_DIR}]", "Download all referred-to git repos to the specified directory" def bootstrap(dir = CLONE_DIR) Penchant::Gemfile.defined_git_repos.each do |repo| puts "Cloning #{repo} to #{dir}" repo.clone_to(dir) end end def method_missing(method, *args) if Penchant::Gemfile.available_environments.include?(method) gemfile(method, *args) else super(method, *args) end end no_tasks do def get_current_env gemfile = Penchant::Gemfile.new out = [ gemfile.environment ] out << "deployment" if gemfile.deployment? out.join(' ') end def check_git_hooks! if !Penchant::Hooks.installed? puts "[penchant] git hooks not installed. Run script/install-git-hooks." puts end end def install_gemfile_penchant prepend_to_file 'Gemfile.penchant', <<-RB # ensure git hooks are always installed ensure_git_hooks! # everything in the :local env is assumed to be a sibling directory of this one defaults_for env(:local), :path => '../%s' # reference a github repository with gem 'my-gem', :github => 'username' # also supports modern bundler user/repo syntax property(:github) { |name| parts = name.split('/') url = case parts.length when 1 "git://github.com/\#{name}/%s.git" when 2 "git://github.com/\#{parts.first}/\#{parts.last}.git" end { :git => url } } RB gemfile(:remote) end end default_task :gemfile end PenchantCLI.start