ツッコミ大歓迎!間違等ありましたらご指摘ください! / はてダはこちらで書いてます。
Mac OSX のリソース形式や、ちょっとした値などの保存によく使われる plist という形式のファイルがあります. たとえば OSX のリソース等の保存にもよく使われます. この plist には、形式として2種類あって、binary と xml があり、どちらも OS 的には同様に処理されます(OSから見ると等価になります).
たとえばリソースエディタの Interface Builder で編集した際には、ほぼ、binaryのplist形式になってしまいます. これだと、たとえば Subversion などでソース管理をしている際に、diff が見れず、変更点が些細な物であっても差分が見れない、という問題があります.
解決するには簡単で、OSXのコマンドの plist を使って binary から xml に変換すれば良いのですが、このコマンドは再起的に処理してくれないというのがあり、あと一括して、あるディレクトリ以下の バイナリ plist を見つけて処理してくれる物が欲しかったので、ruby でくるんでみました。
#!/usr/bin/env ruby -wKU dir = ARGV.shift || '.' Dir::glob(File.expand_path(dir) + "/**/*") do |fn| if File.ftype(fn) == 'file' open(fn, 'rb') do |f| magic = f.read(8) if magic == 'bplist00' r = system "plutil -convert xml1 '#{fn}'" if r puts "Success: #{fn}" else puts "Failed: #{fn}" end end end end end
使い方は、適当な名前たとえば conv.rb とかで保存して
$ ruby conv.rb ./
とかすると、カレントディレクトリ以下の全バイナリ plist を検出して、すべてxml形式に変換してくれます. 変換した物は Success: とか表示されます. Subversion などに commit する際に毎回実行すると幸せになれると思います.
(おまけのoneliner)
Subversion で binary mode になっているときに、そのプロパティを一括削除
$ svn st | awk '{print $2}' | xargs svn pd svn:mime-type