言語ネゴシエーション/github を使った公開

(5385d) 更新


このページの内容は非常に古いです(Rails 1.x.x)。最新の Rails では洗練された国際化の機構が標準で入っているため、下記は読むだけ無駄な内容になっています。

ソフトウェア/rails/言語ネゴシエーション

git リポジトリ(ローカル)の作成

時代は subversion ではなく git なのだそうで。

http://www.kaeruspoon.net/articles/477 とか、
http://www.kaeruspoon.net/articles/479 とか、
http://www.netfort.gr.jp/~dancer/diary/200812.html.ja とか、
http://blog.champierre.com/archives/670
http://www.tempus.org/n-miyo/git-course-trans-ja/svn.ja.html
あたりを参考に。

まずは git のインストール。

LANG:console
$ sudo aptitude install git-core
 以下の新規パッケージがインストールされます:
   git-core liberror-perl{a} rsync{a} 
 先に進みますか? [Y/n/?] Y
 liberror-perl (0.17-1) を設定しています ...
 git-core (1:1.6.3.1-1) を設定しています ...
 rsync (3.0.5-1) を設定しています ...
$ git --version
 git version 1.6.3.1
$ git config --global user.name "Osamu TAKEUCHI"
$ git config --global user.email "osamu@big.jp"
$ git config --global color.diff auto
$ git config --global color.status auto
$ git config --global color.branch auto
$ git config --global color.interactive auto
$ git config --global color.ui auto
$ git config --global core.pager "lv -c"
$ cat ~/.gitconfig 
 [user]
         name = Osamu TAKEUCHI
         email = osamu@big.jp
 [color]
         diff = auto
         status = auto
         branch = auto
         interactive = auto
         ui = auto
 [core]
         pager = lv -c

vendor/plugins/language_negotiation 以下にあるプラグインと、
テスト用の Rails アプリケーションと、
2つのリポジトリを別々に作成する。

まずはプラグインの方から

LANG:console
$ cd vendor/plugins/lanugage_negotiation/
$ git init
 Initialized empty Git repository in (rails)/negotiation/vendor/plugins/lanugage_negotiation/.git/
$ git add .
$ git commit
   First commit of LanguageNegotiation plugin for Ruby on Rails
   
   Almost working with:
     Ruby version            1.8.7 (i486-linux)
     RubyGems version        1.3.2
     Rails version           2.2.2
     apache2                 2.2.11-3
    
   Documentation should be completed.
 
 [master (root-commit) 3df21b6] First commit of LanguageNegotiation plugin for Ruby on Rails
  10 files changed, 636 insertions(+), 0 deletions(-)
  create mode 100644 MIT-LICENSE
  create mode 100644 README
  create mode 100644 Rakefile
  create mode 100644 init.rb
  create mode 100644 install.rb
  create mode 100644 lib/lanugage_negotiation.rb
  create mode 100644 tasks/lanugage_negotiation_tasks.rake
  create mode 100644 test/lanugage_negotiation_test.rb
  create mode 100644 test/test_helper.rb
  create mode 100644 uninstall.rb
$ git status
 # On branch master
 nothing to commit (working directory clean)

次にテストアプリケーション

LANG:console
$ cd ../../..
$ pwd
 (rails)/negotiation
$ git init
 Initialized empty Git repository in (rails)/negotiation/.git/
$ mkdir db/migration
$ find . -type d -empty|xargs -L1 -I{} touch {}/.gitignore # 空のディレクトリに .gitignore を作成
$ touch log/.gitignore tmp/.gitignore vendor/plugin/.gitignore
$ cp config/database.yml config/database.sample.yml
$ cat > .gitignore
 .DS_Store
 *~
 /log/*.log
 /db/*.sqlite3
 /config/database.yml
 /tmp/*
 !/tmp/*.gitignore
 !/tmp/cache
 !/tmp/pids
 !/tmp/sessions
 !/tmp/sockets
 /public/cahce_in_test_environment                                                          
 /vendor/plugins/language_negotiation
$ git add .
$ git status
 # On branch master
 #
 # Initial commit
 #
 # Changes to be committed:
 #   (use "git rm --cached <file>..." to unstage)
 #
 #       new file:   .gitignore
 #       new file:   README
 #       new file:   Rakefile
 #       new file:   app/controllers/application.rb
 #       new file:   app/controllers/test_controller.rb
 #       new file:   app/helpers/application_helper.rb
 #       new file:   app/helpers/test_helper.rb
 #       new file:   app/models/.gitignore
 #       new file:   app/views/layouts/application.html.en.erb
 #       new file:   app/views/layouts/application.html.ja.erb
 #       new file:   app/views/layouts/application.text.en.erb
 #       new file:   app/views/test/_ok.html.en.erb
 #       new file:   app/views/test/_ok.html.ja.erb
 #       new file:   app/views/test/acceptid.html.ja.erb
 #       new file:   app/views/test/acceptid.text.ja.erb
 #       new file:   app/views/test/actioncached.html.en.erb
 #       new file:   app/views/test/actioncached.html.ja.erb
 #       new file:   app/views/test/fragmentcached.html.en.erb
 #       new file:   app/views/test/fragmentcached.html.ja.erb
 #       new file:   app/views/test/index.html.en.erb
 #       new file:   app/views/test/index.html.ja.erb
 #       new file:   app/views/test/onlyja.html.ja.erb
 #       new file:   app/views/test/pagecached.html.en.erb
 #       new file:   app/views/test/pagecached.html.ja.erb
 #       new file:   app/views/test/renderfile_.html.en.erb
 #       new file:   app/views/test/renderfile_.html.ja.erb
 #       new file:   config/boot.rb
 #       new file:   config/database.sample.yml
 #       new file:   config/environment.rb
 #       new file:   config/environments/development.rb
 #       new file:   config/environments/production.rb
 #       new file:   config/environments/test.rb
 #       new file:   config/initializers/inflections.rb
 #       new file:   config/initializers/mime_types.rb
 #       new file:   config/initializers/new_rails_defaults.rb
 #       new file:   config/locales/en.yml
 #       new file:   config/routes.rb
 #       new file:   db/migration/.gitignore
 #       new file:   db/schema.rb
 #       new file:   doc/README_FOR_APP
 #       new file:   doc/api
 #       new file:   lib/tasks/.gitignore
 #       new file:   log/.gitignore  ...
 #       new file:   public/.htaccess
 #       new file:   public/404.html
 #       new file:   public/422.html
 #       new file:   public/500.html
 #       new file:   public/dispatch.cgi
 #       new file:   public/dispatch.fcgi
 #       new file:   public/dispatch.rb
 #       new file:   public/favicon.ico
 #       new file:   public/images/rails.png
 #       new file:   public/index.html
 #       new file:   public/javascripts/application.js
 #       new file:   public/javascripts/controls.js
 #       new file:   public/javascripts/dragdrop.js
 #       new file:   public/javascripts/effects.js
 #       new file:   public/javascripts/prototype.js
 #       new file:   public/robots.txt
 #       new file:   public/stylesheets/.gitignore
 #       new file:   script/about
 #       new file:   script/console
 #       new file:   script/dbconsole
 #       new file:   script/destroy
 #       new file:   script/generate
 #       new file:   script/performance/benchmarker
 #       new file:   script/performance/profiler
 #       new file:   script/performance/request
 #       new file:   script/plugin
 #       new file:   script/process/inspector
 #       new file:   script/process/reaper
 #       new file:   script/process/spawner
 #       new file:   script/runner
 #       new file:   script/server
 #       new file:   test/fixtures/.gitignore
 #       new file:   test/functional/test_controller_test.rb
 #       new file:   test/performance/browsing_test.rb
 #       new file:   test/test_helper.rb
 #       new file:   test/unit/.gitignore
 #       new file:   tmp/.gitignore
 #       new file:   tmp/cache/.gitignore
 #       new file:   tmp/pids/.gitignore
 #       new file:   tmp/sessions/.gitignore
 #       new file:   tmp/sockets/.gitignore
 #       new file:   vendor/actionmailer
 #       new file:   vendor/actionpack
 #       new file:   vendor/activemodel
 #       new file:   vendor/activerecord
 #       new file:   vendor/activeresource
 #       new file:   vendor/activesupport
 #       new file:   vendor/plugins/.gitignore
 #       new file:   vendor/rails
 #       new file:   vendor/railties
 #
$ git commit
   Testing framework of LanguageNegotiation plugin for Ruby on Rails
   
   Works with:
     Ruby version            1.8.7 (i486-linux)
     RubyGems version        1.3.2
     Rails version           2.2.2
     apache2                 2.2.11-3
 ...
$

git は空のディレクトリを無視するので、空のディレクトリ全てに .gitignore というファイルを作っておく。

個々のディレクトリの .gitignore にルールを書くことを勧める記述が 多いのだけれど、見通しが悪くなるのでルートディレクトリの .gitignore に 一元化するのがよいと思う。

ルールを / から始めるとリポジトリのルートディレクトリからの絶対パスとして、
ルールを / から始めなければ個々のディレクトリからの相対パスとして、解釈されるらしい。

tmp ディレクトリの指定が結構面倒で、

/tmp/*

とすると、.gitignore も含めて無視されるため、空のディレクトリとなった /tmp 自身も無視されてしまう。

!.giignore

とすることで、.gitignore は無視しないように指定できる。

同様に、/tmp/cache/.gitignore なども無視しないように書いたのが以下のルール。

 !/tmp/*.gitignore
 !/tmp/cache
 !/tmp/pids
 !/tmp/sessions
 !/tmp/sockets

これでローカルに2つのリポジトリが作成できた。

プロジェクトを github に登録

https://github.com/

にアカウントを作成し、プロジェクト RailsLanguageNegotiationPlugin と RailsLanguageNegotiationPluginTestApp を作成。

表示されたガイダンスに沿う形で、

LANG:console
$ git config --global github.user osamutake
$ git config --global github.token c2b35c1bd09d64bf37a713702d7ae659
$ git remote add origin git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
$ git push origin master
 Permission denied (publickey).
 fatal: The remote end hung up unexpectedly
$ cd ~/.ssh
$ ls id_dsa
 ls: cannot access id_dsa: そのようなファイルやディレクトリはありません
$ ssh-keygen # もし id_dsa がすでにあればスキップ
 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/takeuchi/.ssh/id_rsa): (何もせずENTER)
 Enter passphrase (empty for no passphrase): (何もせずENTER)
 Enter same passphrase again: (何もせずENTER)
 Your identification has been saved in github.
 Your public key has been saved in github.pub.
 The key fingerprint is:
 ab:5e:07:df:a1:02:84:cf:a3:21:d1:7e:aa:38:b3:2f takeuchi@dora
 The key's randomart image is:
 +--[ RSA 2048]----+
 | ................|
 |                 |
 +-----------------+
$ cat id_isa.pub 
 ssh-rsa AAAB3Nza...
$ # 表示された内容をコピーして https://github.com/account#keys の SSH Public Keys に追加
$ cd (rails)/negotiation/vendor/plugins/language_negotiation
$ git push origin master
 Counting objects: 15, done.
 Compressing objects: 100% (13/13), done.
 Writing objects: 100% (15/15), 6.86 KiB, done.
 Total 15 (delta 0), reused 0 (delta 0)
 To git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
  * [new branch]      master -> master

https://github.com/ を見るとちゃんと登録されている。とても簡単。

取り出せる事をテスト

じゃ、取り出せるか試してみるか、と軽い気持ちで操作したら、えらい事になった。

LANGUAGE:console
$ cd ..
$ mkdir language_negotiation2
$ cd language_negotiation2
$ git pull git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
 From git@github.com:osamutake/RailsLanguageNegotiationPlugin
  * branch            HEAD       -> FETCH_HEAD
 Auto-merging README
 CONFLICT (add/add): Merge conflict in README
 Auto-merging Rakefile
 CONFLICT (add/add): Merge conflict in Rakefile
 Auto-merging test/test_helper.rb
 CONFLICT (add/add): Merge conflict in test/test_helper.rb
 Automatic merge failed; fix conflicts and then commit the result.

空のディレクトリでどうして conflict?
と思ったら、テストアプリケーションのリポジトリにマージされてました。

LANGUAGE:console
$ cd ../../..
$ git status
 README: needs merge
 Rakefile: needs merge
 test/test_helper.rb: needs merge
 # On branch master
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #       new file:   MIT-LICENSE
 #       new file:   init.rb
 #       new file:   install.rb
 #       new file:   lib/lanugage_negotiation.rb
 #       new file:   tasks/lanugage_negotiation_tasks.rake
 #       new file:   test/lanugage_negotiation_test.rb
 #       new file:   uninstall.rb
 #
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #       unmerged:   README
 #       unmerged:   Rakefile
 #       unmerged:   test/test_helper.rb
 #

pull したのを取り消し、マージされたファイルを書き戻す。

LANGUAGE:console
$ git reset HEAD
 README: locally modified
 Rakefile: locally modified
 test/test_helper.rb: locally modified
$ git status
 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #       modified:   README
 #       modified:   Rakefile
 #       modified:   test/test_helper.rb
 #
 # Untracked files:
 #   (use "git add <file>..." to include in what will be committed)
 #
 #       MIT-LICENSE
 #       init.rb
 #       install.rb
 #       lib/lanugage_negotiation.rb
 #       tasks/
 #       test/lanugage_negotiation_test.rb
 #       uninstall.rb
 no changes added to commit (use "git add" and/or "git commit -a")
$ rm MIT-LICENSE init.rb install.rb lib/lanugage_negotiation.rb 
$ rm test/lanugage_negotiation_test.rb uninstall.rb
$ rm -r tasks
$ git status
 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #       modified:   README
 #       modified:   Rakefile
 #       modified:   test/test_helper.rb
 #
 no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout README Rakefile test/test_helper.rb
$ git status
 # On branch master
 nothing to commit (working directory clean)

ふう。
git は親ディレクトリをさかのぼってリポジトリデータを検索する仕様なのね。

negotiation アプリケーションの外に出て、

LANGUAGE:console
$ cd
$ mkdir language_negotiation
$ cd language_negotiation
$ git pull git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
 fatal: Not a git repository (or any of the parent directories): .git

あら、そもそも pull と書いていたのが間違い、と。

LANG:console
$ git clone git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
 Initialized empty Git repository in /home/takeuchi/language_negotiation/RailsLanguageNegotiationPlugin/.git/
 remote: Counting objects: 15, done.
 remote: Compressing objects: 100% (13/13), done.
 remote: Total 15 (delta 0), reused 0 (delta 0)
 Receiving objects: 100% (15/15), 6.86 KiB, done.
$ ls
 RailsLanguageNegotiationPlugin
$ cd RailsLanguageNegotiationPlugin/
$ ls
 MIT-LICENSE  README  Rakefile  init.rb  install.rb  lib  tasks  test  uninstall.rb
$ git status
 # On branch master
 nothing to commit (working directory clean)
$ cd ../..
$ rm -rf language_negotiation/

正しく落とせている。

もしかして・・・

LANG:console
$ cd (rails)/negotiation
$ cd vendor/plugins/
$ git clone git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
 Initialized empty Git repository in (rails)/negotiation/vendor/plugins/RailsLanguageNegotiationPlugin/.git/
 remote: Counting objects: 15, done.
 remote: Compressing objects: 100% (13/13), done.
 remote: Total 15 (delta 0), reused 0 (delta 0)
 Receiving objects: 100% (15/15), 6.86 KiB, done.
$ ls
 RailsLanguageNegotiationPlugin  lanugage_negotiation
$ ls RailsLanguageNegotiationPlugin
 MIT-LICENSE  README  Rakefile  init.rb  install.rb  lib  tasks  test  uninstall.rb
$ git status
 # On branch master
 # Untracked files:
 #   (use "git add <file>..." to include in what will be committed)
 #
 #       RailsLanguageNegotiationPlugin/
 nothing added to commit but untracked files present (use "git add" to track)
$ rm -rf RailsLanguageNegotiationPlugin

これでもうまく行くわけね。

やはりもう少し git に慣れないと危険だ。

で、いきなり公開されてしまうのだから、もう少しドキュメントをしっかりしないとだめだと今更反省。
テストアプリケーションの方は特に、なので、しばらくローカルで更新して、整ったら push するのが良さそう。

ローカルでも履歴が取れるのが subversion よりも良いところみたい。

git を使った編集作業

http://github.com/osamutake/RailsLanguageNegotiationPlugin/issues#issue/1

にも書いたけれど、言語の優先順位について考える必要がありそう。

これを例にして、git を使った編集作業について書く。

LANG:console
$ jed vendor/plugins/language_negotiation/lib/language_negotiation.rb
 (編集)
$ jed vendor/plugins/language_negotiation/test/language_negotiation_test.rb
 (編集)
$ cd ../../..
$ rake test:plugins
 Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
 Started
 ...
 Finished in 0.037807 seconds.
 
 3 tests, 30 assertions, 0 failures, 0 errors
$ rake test:functionals
 Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
 Started
 ..........................
 Finished in 0.31159 seconds.
 
 30 tests, 112 assertions, 0 failures, 0 errors

テストが無事通ったらコミット作業。

LANG:console
$ cd vendor/plugins/language_negotiation
$ git status
 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #       modified:   lib/lanugage_negotiation.rb
 #       modified:   test/lanugage_negotiation_test.rb
 #
 no changes added to commit (use "git add" and/or "git commit -a")
$ git diff
 (差分がカラー表示される)
$ git add lib/lanugage_negotiation.rb test/lanugage_negotiation_test.rb 
$ git status
 # On branch master
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #       modified:   lib/lanugage_negotiation.rb
 #       modified:   test/lanugage_negotiation_test.rb
 #
$ git commit
 Adjust priority of template file without language specification
 
 When template files 'some.html.en' and 'some.html' exist,
 request for 'some.ja' should be processed with 'some.html'
 instead of 'some.html.en'.
 
 See 
 http://github.com/osamutake/RailsLanguageNegotiationPlugin/issues#issue/1
 
 Other improvements:
 
  - removed not being used
      ActionController::AbstractRequest::language
 
  - calls for
      ActionController::AbstractRequest.accepts_languages.first
    were replaced by those for
      ActionController::AbstractRequest.language_priority.first
 
  - optimized template_handler_extension extraction from template_path
    in ActionView::Base::_pick_template
  
  - removed not being used
      ActionController::Caching::Actions::ActionCachePath::language

 [master e3a80c3] Adjust priority of template file without language specification
  2 files changed, 45 insertions(+), 44 deletions(-)
$ git push
 Counting objects: 11, done.
 Compressing objects: 100% (6/6), done.
 Writing objects: 100% (6/6), 1.37 KiB, done.
 Total 6 (delta 3), reused 0 (delta 0)
 To git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
    3df21b6..e3a80c3  master -> master

以上でリモートリポジトリも更新される。

テストアプリケーションのコミットではちょっとミスした。

LANG:console
$ cd ../../..
$ git status
 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #       modified:   app/controllers/test_controller.rb
 #       modified:   test/functional/test_controller_test.rb
 #
 # Untracked files:
 #   (use "git add <file>..." to include in what will be committed)
 #
 #       app/views/test/nolang.html.erb
 #       app/views/test/nolang.html.ja.erb
$ git commit -a
 Adjust priority of template file without language specification
 
 When template files 'some.html.en' and 'some.html' exist,
 request for 'some.ja' should be processed with 'some.html'
 instead of 'some.html.en'.
 
 See 
 http://github.com/osamutake/RailsLanguageNegotiationPlugin/issues#issue/1
 
 [master 26c50dc] Adjust priority of template file without language specification
  2 files changed, 49 insertions(+), 0 deletions(-)
$ git status
 # On branch master
 # Untracked files:
 #   (use "git add <file>..." to include in what will be committed)
 #
 #       app/views/test/nolang.html.erb
 #       app/views/test/nolang.html.ja.erb
 nothing added to commit but untracked files present (use "git add" to track)
$ git add app/views/test/nolang.html.*
$ git status
 # On branch master
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #       new file:   app/views/test/nolang.html.erb
 #       new file:   app/views/test/nolang.html.ja.erb
 #
$ git commit --amend
 [master 678da96] Adjust priority of template file without language specification
  4 files changed, 51 insertions(+), 0 deletions(-)
  create mode 100644 app/views/test/nolang.html.erb
  create mode 100644 app/views/test/nolang.html.ja.erb
$ git log
 commit 678da9633211e515a7ec56034bb7b46e6724bd3e
 Author: Osamu TAKEUCHI <osamu@big.jp>
 Date:   Wed Jun 10 17:45:01 2009 +0900
 
     Adjust priority of template file without language specification
     
     When template files 'some.html.en' and 'some.html' exist,
     request for 'some.ja' should be processed with 'some.html'
     instead of 'some.html.en'.
     
     See
     http://github.com/osamutake/RailsLanguageNegotiationPlugin/issues#issue/1
 
 commit ad51715241e8f480da6de8d1d87035fea6c0d2ba
 Author: Osamu TAKEUCHI <osamu@big.jp>
 Date:   Wed Jun 10 10:34:05 2009 +0900
 
     Testing framework of LanguageNegotiation plugin for Ruby on Rails
     
     Works with:
         Ruby version            1.8.7 (i486-linux)
         RubyGems version        1.3.2
         Rails version           2.2.2
         apache2                 2.2.11-3

git commit -a で変更点はすべてコミットされるかと思いきや、 新規作成ファイルについては対象外だったようだ。

手動で git add した後、git commit --amend したところ、 コミットのやり直しができて、ミスの形跡も残らなかった。

最後に github の該当する issue にコミット番号をコメントして、 Closed に移して一件落着。

CHANGELOG について

ファイル中に変更履歴を残したい。

こんな手順で良いんだろうか?

LANG:console
$ git log > CHANGELOG
$ git add CHANGELOG
$ git commit --amend
$ cd vendor/plugins/language_negotiation
$ git log > CHANGELOG
$ git add CHANGELOG
$ git commit --amend
$ git push origin master
 To git@github.com:osamutake/RailsLanguageNegotiationPlugin.git
  ! [rejected]        master -> master (non-fast forward)
 error: failed to push some refs to 'git@github.com:osamutake/RailsLanguageNegotiationPlugin.git'
$ git push origin +master:master

最後の部分、--amend でコミットしたせいでリモートの情報とローカルの情報が 食い違ってしまっていて、そのままだと push させてくれない。

ローカルを優先して強制的に push するための呪文が git push origin +master:master らしい。

同様の現象は、ローカルでの作業中にリモートリポジトリが書き換わった 場合にも起きる。

その場合には素直に git pull origin master して、ローカル側を更新する事になる。

tar ball の作り方

git ではなく tar ball で落としたい人向けに、 ファイルパスに "*.git*" を含まないファイルのみを 日付付きのファイル名に tar.gz してアップしておくと いいのかな、などと、

LANG:console
$ find . -not -path '*/.git*' -a -type f | \
  tar fcz `date +"language_negotiation-%y%m%d%H%M%S"` -T-

これを Downloads ページにアップロードすれば・・・

む、よく見たら Dowloads ページに行かなくてもページの真ん中に download ボタンがあって、これをクリックすればソースツリーを zip か tar で落とせる仕組みになっているんだね。

自分で tar ball を作る必要は無かったようでした。

スペルミスの修正

!!!

今まで気づかなかったというのが信じられないほどに lanugage_negotiation 。

LANG:console
$ cd ..
$ mv lanugage_negotiation language_negotiation
$ cd language_negotiation
$ grep -i lanugage * */*
 README:LanugageNegotiation
 Rakefile:desc 'Test the lanugage_negotiation plugin.'
 Rakefile:desc 'Generate documentation for the lanugage_negotiation plugin.'
 Rakefile:  rdoc.title    = 'LanugageNegotiation'
 init.rb:require "lanugage_negotiation"
 lib/lanugage_negotiation.rb:# LanugageNegotiation
 tasks/lanugage_negotiation_tasks.rake:# task :lanugage_negotiation do
 test/lanugage_negotiation_test.rb:class LanugageNegotiationTest < ActiveSupport::TestCase
$ jed
 (編集)
$ grep -i lanugage * */*
$ find . -iname lanu*
 ./test/lanugage_negotiation_test.rb
 ./tasks/lanugage_negotiation_tasks.rake
 ./lib/lanugage_negotiation.rb
$ cd test
$ git mv lanugage_negotiation_test.rb language_negotiation_test.rb
$ ls
 language_negotiation_test.rb  test_helper.rb
$ cd ../tasks/
$ git mv lanugage_negotiation_tasks.rake language_negotiation_tasks.rake 
$ cd ../lib
$ git mv lanugage_negotiation.rb language_negotiation.rb 
$ cd ..
$ find . -iname lanu*
$ git status
 #       renamed:    lib/lanugage_negotiation.rb -> lib/language_negotiation.rb
 #       renamed:    tasks/lanugage_negotiation_tasks.rake -> tasks/language_negotiation_tasks.rake
 #       renamed:    test/lanugage_negotiation_test.rb -> test/language_negotiation_test.rb
 #       modified:   README
 #       modified:   Rakefile
 #       modified:   init.rb
 #       modified:   lib/language_negotiation.rb
 #       modified:   tasks/language_negotiation_tasks.rake
 #       modified:   test/language_negotiation_test.rb
$ cd ../../..
$ rake test:plugins
 3 tests, 30 assertions, 0 failures, 0 errors
$ rake test:functionals
 30 tests, 112 assertions, 0 failures, 0 errors
$ cd vendor/plugins/language_negotiation/
$ git commit -a -m "Typo fixing lanugage -> language"
 [master aef2a17] Typo fixing lanugage -> language
  6 files changed, 9 insertions(+), 9 deletions(-)
  rename lib/{lanugage_negotiation.rb => language_negotiation.rb} (99%)
  rename tasks/{lanugage_negotiation_tasks.rake => language_negotiation_tasks.rake} (67%)
  rename test/{lanugage_negotiation_test.rb => language_negotiation_test.rb} (98%)
$ git status
 nothing to commit (working directory clean)
$ git log > CHANGELOG
$ git commit -a --amend
 [master 79ce1e9] Typo fixing lanugage -> language
  7 files changed, 16 insertions(+), 10 deletions(-)
  rename lib/{lanugage_negotiation.rb => language_negotiation.rb} (99%)
  rename tasks/{lanugage_negotiation_tasks.rake => language_negotiation_tasks.rake} (67%)
  rename test/{lanugage_negotiation_test.rb => language_negotiation_test.rb} (98%)
$ git push origin master

アプリケーション側のコードに全く触れずに済むあたり、Rails の設計の良さが光る。

プラグイン内にしても、ドキュメント部分を除けば

 init.rb:require "lanugage_negotiation"
 test/lanugage_negotiation_test.rb:class LanugageNegotiationTest < ActiveSupport::TestCase

この2つだけ。

しかも後者は必ずしも直す必要のない部分。

すばらしい。

PS 今まで気づかなかったのが恐ろしい。

CHANGELOG 更新コマンド

メッセージの入力を求められるのがおっくうなとき、git commit の

  • C オプションが使える。
LANG:console
$ test -d .git && \
  git log > CHANGELOG && \
  git commit -a --amend -C `head -1 CHANGELOG | sed "s/.* //"`
  1. .git ディレクトリが存在すれば
    (リポジトリのトップディレクトリである事を確認してから)
  2. git log を CHANGELOG に入れ
  3. 前回と同じメッセージを付けて commit する

Counter: 5988 (from 2010/06/03), today: 2, yesterday: 0