# -*- ruby -*-
#
# Rakefile for Ruby-GetText-Package
#
# This file maintains Ruby-GetText-Package.
#
# Use setup.rb or gem for installation.
# You don't need to use this file directly.
#
# Copyright(c) 2005-2009 Masao Mutoh
# Copyright(c) 2012 Kouhei Sutou <kou@clear-code.com>
# This program is licenced under the same licence as Ruby.
#

$:.unshift "./lib"

require "tempfile"
require 'rake'
require 'rubygems'
require "yard/rake/yardoc_task"
require 'gettext/version'

require "bundler/gem_helper"
class Bundler::GemHelper
  undef_method :version_tag
  def version_tag
    version
  end
end
Bundler::GemHelper.install_tasks

PKG_VERSION = GetText::VERSION

############################################################
# GetText tasks for developing
############################################################
poparser_rb_path = "lib/gettext/tools/poparser.rb"
desc "Create #{poparser_rb_path}"
task :poparser => poparser_rb_path

poparser_ry_path = "src/poparser.ry"
file poparser_rb_path => poparser_ry_path do
  racc = File.join(Gem.bindir, "racc")
  tempfile = Tempfile.new("gettext-poparser")
  command_line = "#{racc} -g #{poparser_ry_path} -o #{tempfile.path}"
  ruby(command_line)
  $stderr.puts("ruby #{command_line}")

  File.open(poparser_rb_path, "w") do |poparser_rb|
    poparser_rb.puts(<<-EOH)
# -*- coding: utf-8 -*-
#
# poparser.rb - Generate a .mo
#
# Copyright (C) 2003-2009 Masao Mutoh <mutomasa at gmail.com>
# Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
#
# You may redistribute it and/or modify it under the same
# license terms as Ruby or LGPL.

EOH

    poparser_rb.puts(tempfile.read)
  end
  $stderr.puts "Create #{poparser_rb_path}."
end


desc "Create *.mo from *.po"
task :makemo do
  require 'gettext/tools'
  GetText.create_mofiles

  $stderr.puts "Create samples mo files."
  GetText.create_mofiles(
	:po_root => "samples/po", :mo_root => "samples/locale")

  $stderr.puts "Create samples/cgi mo files."
  GetText.create_mofiles(
	:po_root => "samples/cgi/po", :mo_root => "samples/cgi/locale")

  $stderr.puts "Create test mo files."
  GetText.create_mofiles(
	:po_root => "test/po", :mo_root => "test/locale")
end

desc "Update pot/po files to match new version."
task :updatepo do
  begin
    require 'gettext'
    require 'gettext/tools/poparser'
    require 'gettext/tools'
  rescue LoadError
    puts "gettext/tools/poparser was not found."
  end

  #lib/gettext/*.rb -> rgettext.po
  GetText.update_pofiles("rgettext",
                         Dir.glob("lib/**/*.rb") + ["src/poparser.ry"],
                         "ruby-gettext #{GetText::VERSION}")
end

desc "Gather the newest po files. (for me)"
task :gatherpo => [:updatepo] do
  mkdir_p "pofiles/original" unless FileTest.exist? "pofiles/original"
  Dir.glob("**/*.pot").each do |f|
    unless /^(pofiles|test)/ =~ f
      copy f, "pofiles/original/"
    end
  end
  Dir.glob("**/*.po").each do |f|
    unless /^(pofiles|test)/ =~ f
      lang = /po\/([^\/]*)\/(.*.po)/.match(f).to_a[1]
      mkdir_p "pofiles/#{lang}" unless FileTest.exist? "pofiles/#{lang}"
      copy f, "pofiles/#{lang}/"
      Dir.glob("pofiles/original/*.pot").each do |f|
        newpo = "pofiles/#{lang}/#{File.basename(f, ".pot")}.po"
        copy f, newpo unless FileTest.exist? newpo
      end
    end
  end
end

def mv_pofiles(src_dir, target_dir, lang)
   target = File.join(target_dir, lang)
   unless File.exist?(target)
     mkdir_p target
     sh "cvs add #{target}"
   end
   cvs_add_targets = ""
   Dir.glob(File.join(target_dir, "ja/*.po")).sort.each do |f|
     srcfile = File.join(src_dir, File.basename(f))
     if File.exist?(srcfile)
       unless File.exist?(File.join(target, File.basename(f)))
         cvs_add_targets << File.join(target, File.basename(f)) + " "
       end
       mv srcfile, target, :verbose => true
     else
       puts "mv #{srcfile} #{target}/ -- skipped"
     end
   end
   sh "cvs add #{cvs_add_targets}" if cvs_add_targets.size > 0
end

desc "Deploy localized pofiles to current source tree. (for me)"
task :deploypo do
     srcdir = ENV["SRCDIR"] ||= File.join(ENV["HOME"], "pofiles")
     lang = ENV["LOCALE"]
     unless lang
       puts "USAGE: rake deploypo [SRCDIR=#{ENV["HOME"]}/pofiles] LOCALE=ja"
       exit
    end
    puts "SRCDIR = #{srcdir}, LOCALE = #{lang}"

    mv_pofiles(srcdir, "po", lang)
    mv_pofiles(srcdir, "samples/cgi/po", lang)
    mv_pofiles(srcdir, "samples/po", lang)
end


task :package => [:makemo]

namespace :test do
  namespace :pot do
    pot_base_dir = "test/pot"
    directory pot_base_dir

    pot_paths = []
    ruby_base_paths = [
      "non_ascii", "npgettext", "nsgettext",
      "pgettext", "backslash",
    ]
    ruby_paths = Dir.glob("test/testlib/{#{ruby_base_paths.join(',')}}.rb")
    ruby_paths.each do |ruby_path|
      pot_base_path = File.basename(ruby_path).sub(/\.rb\z/, ".pot")
      pot_path = "#{pot_base_dir}/#{pot_base_path}"
      pot_paths << pot_path
      file pot_path => [pot_base_dir, ruby_path] do
        require "gettext/tools"
        GetText.rgettext(ruby_path, pot_path)
      end
    end

    desc "Update pot files for testing"
    task :update => pot_paths
  end

  namespace :mo do
    mo_paths = []
    language_paths = Dir.glob("test/po/*")
    language_paths.each do |language_path|
      language = File.basename(language_path)
      po_paths = Dir.glob("#{language_path}/*.po")
      po_paths.each do |po_path|
        mo_base_path = File.basename(po_path).sub(/\.po\z/, ".mo")
        mo_path = "test/locale/#{language}/LC_MESSAGES/#{mo_base_path}"
        mo_paths << mo_path
        file mo_path => [po_path, poparser_rb_path] do
          require "gettext/tools"
          GetText.rmsgfmt(po_path, mo_path)
        end
      end
    end

    desc "Update mo files for testing"
    task :update => mo_paths
  end

  desc "Prepare test environment"
  task :prepare => "test:mo:update"
end

desc 'Run all tests'
task :test => "test:prepare" do
  options = ARGV - Rake.application.top_level_tasks
  ruby "test/run-test.rb", *options
end

YARD::Rake::YardocTask.new do |t|
end

desc "Setup Ruby-GetText-Package. (for setup.rb)"
task :setup => [:makemo]