Hatena::Grouprubyist

takuma104のRuby/Rails日記

ツッコミ大歓迎!間違等ありましたらご指摘ください! / はてダはこちらで書いてます。

 | 

2008-05-19

Mac OSX の binary plist 形式から、XML plist 形式に一括変換

| 02:18 | Mac OSX の binary plist 形式から、XML plist 形式に一括変換 - takuma104のRuby/Rails日記 を含むブックマーク はてなブックマーク - Mac OSX の binary plist 形式から、XML plist 形式に一括変換 - takuma104のRuby/Rails日記 Mac OSX の binary plist 形式から、XML plist 形式に一括変換 - takuma104のRuby/Rails日記 のブックマークコメント

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 
トラックバック - http://rubyist.g.hatena.ne.jp/takuma104/20080519
 |