hiki 1.0.0 続き

hiki 1.0.0に移行するために、CVSリポジトリそのものを移行する方法があります。そのためのスクリプトを書きました。

#!/usr/bin/env ruby

$LOAD_PATH.unshift "."

require "optparse"
require "pathname"
require "fileutils"
require "nkf"
require "hiki/util"
require "hiki/config"

def convert(cvsroot_path, input_encoding, output_encoding, nkf)
  Dir.glob("#{cvsroot_path}/hiki/*,v").each do |old_file_fullpath|
    begin
      dir = File.dirname(old_file_fullpath)
      old_file = File.basename(old_file_fullpath).chop.chop
      new_file = Hiki::Util.escape(encode(Hiki::Util.unescape(old_file),
                                          input_encoding, output_encoding, nkf))

      print "#{old_file} => #{new_file} "
      cont = nil
      File.open("#{dir}/#{old_file},v", "r:#{input_encoding}") do |fin|
        cont = fin.read.force_encoding(input_encoding)
      end
      FileUtils.rm_f("#{dir}/#{old_file},v")
      File.open("#{dir}/#{new_file},v", "w:#{output_encoding}") do |fout|
        fout.write encode(cont, input_encoding, output_encoding, nkf)
      end
      puts "OK."
    rescue StandardError => ex
      puts " NG."
      puts "#{ex.class}: #{ex.message}"
      puts ex.backtrace
    end
  end
end

def encode(text, input_encoding, output_encoding, nkf)
  if nkf
    NKF.nkf("-m0 --ic=#{input_encoding} --oc=#{output_encoding}", text)
  else
    text.dup.encode!(output_encoding, input_encoding, :invalid => :replace, :und
ef => :replace)
  end
end

def main(argv)
  parser = OptionParser.new
  cvsroot_path = nil
  input_encoding = nil
  output_encoding = nil
  nkf = false
  parser.on("-c", "--cvsroot-directory=DIR", "Specify the cvsroot directory"){|d
ir|
    cvsroot_path = Pathname(dir).realpath
  }
  parser.on("-i", "--input-encoding=ENCODING", "Specify the input encoding"){|en
coding|
    input_encoding = Encoding.find(encoding)
  }
  parser.on("-o", "--output-encoding=ENCODING", "Specify the output encoding"){|
encoding|
    output_encoding  = Encoding.find(encoding)
  }
  parser.on("--nkf", "Use NKF (default: no)"){
    nkf = true
  }

  begin
    parser.parse!(argv)
  rescue
    STDERR.puts $!.class.to_s
    STDERR.puts $!.message
    exit 1
  end

  convert(cvsroot_path, input_encoding, output_encoding, nkf)
end

if __FILE__ == $0
  main(ARGV)
end

構造はほとんどconvert.rbから借りてきました。
これで変換した後でチェックアウトすれば更新完了です。過去の履歴も見られるし、快適。