Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

やる気を維持させるRailsスケルトン準備コード

以下の URL を参考にやるルーティンワークでやる気が削がれないための基本的な作業開始スクリプトをここにおいてみました。Ruby版です。

http://un-q.net/2006/09/railssubversion.html

#!/usr/bin/env ruby

def usage
  STDERR.print <<EOF
usage: #{$0} app_name repository
example: snv_rails wawawa svn+ssh://hostname/path/
EOF
  exit 1
end

# ファイル又はディレクトリを削除する特異メソッドをDirクラスに追加
class << Dir
  def rmdir_forced(delthem)
    if FileTest.directory?(delthem) then  # ディレクトリかどうかを判別
      Dir.foreach( delthem ) do |file|    # 中身を一覧
        next if /^\.+$/ =~ file           # 上位ディレクトリと自身を対象から外す
        rmdir_forced( delthem.sub(/\/+$/,"") + "/" + file )
      end
      Dir.rmdir(delthem) rescue ""        # 中身が空になったディレクトリを削除
    else
      File.delete(delthem)                # ディレクトリでなければ削除
    end
  end
end

rails_cmd = '/var/lib/gems/1.8/bin/rails'
svn_cmd ='/usr/bin/svn'

rails_app_name = ARGV.shift
repos = ARGV.shift
svn_target = "#{repos}/#{rails_app_name}.rails"

begin
  # 1. ディレクトリを作成して移動
  # mkdir とりあえず適当な名前; cd とりあえず適当な名前
  Dir::mkdir(rails_app_name) if !FileTest::exist?(rails_app_name)
  Dir::chdir(rails_app_name)

  # 2. trunk tag branchesを作成
  # mkdir trunk tag branches
  Dir::mkdir('trunk') if !FileTest::exist?('trunk')
  Dir::mkdir('tag') if !FileTest::exist?('tag')
  Dir::mkdir('branches') if !FileTest::exist?('branches')

  # 3. この構造をsvnにimport
  # svn import . svn+ssh://svnurl/リポジトリ名・・・ -m "initial"
  system("#{svn_cmd} import . #{svn_target} -m 'initial'")

  # 4. 一旦ディレクトリから離れて削除
  # cd ..;rm -rf とりあえず適当な名前
  Dir::chdir('..')
  Dir::rmdir_forced(rails_app_name)

  # 5. プロジェクト作成してディレクトリに入る
  # rails project_name; cd project_name
  system("#{rails_cmd} #{rails_app_name}")
  Dir::chdir(rails_app_name)

  # 6. トランクにimport する
  # svn import . svn+ssh://svnrul/リポジトリ名/trunk -m "import"
  system("#{svn_cmd} import . #{svn_target}/trunk/ -m 'import'")

  # 7. 作業ディレクトリに移動してチェックアウト
  # cd 作業ディレクトリ; svn co svn+ssh://svnurl/リポジトリ/trunk/ .
  # 今回は作業ディレクトリは前のを継続
  system("#{svn_cmd} co #{svn_target}/trunk/ .")

  # 8. ログファイル削除
  # svn ci -m "remove log file"
  # svn propset svn:ignore "*.log" log/
  # svn ci -m  "add ignore log/*"
  system("#{svn_cmd} ci -m 'remove log file'")
  system("#{svn_cmd} propset svn:ignore '*.log' log/")
  system("#{svn_cmd} ci -m 'add ignore log/*'")

  # 9. tmp以下を無視ファイルに指定
  # svn propset svn:ignore "*" tmp/sessions tmp/cache tmp/sockets
  # svn ci -m "add ignore tmp/"
  system("#{svn_cmd} propset svn:ignore '*' tmp/sessions tmp/cache tmp/sockets")
  system("#{svn_cmd} ci -m 'add ignore tmp/'")

  # 10. database.yml を database.yml.exampleへ
  # svn move config/database.yml config/database.yml.example
  # svn ci -m "database.yml -> database.yml.example"
  # 今回省略

  # 11. database.ymlを無視ファイルに指定
  # svn propset svn:ignore "database.yml" config/
  # svn ci -m "ignore database.yml"
  # cp config/database.yml.example config/database.yml
  # 今回省略
  
rescue
  puts "Error occured."
else

ensure

end

exit 0