$:.unshift File.expand_path 'lib'
require 'rdoc'
require 'hoe'

ENV['BENCHMARK'] = 'yes'

task :docs    => :generate
task :test    => :generate

PARSER_FILES = %w[
  lib/rdoc/rd/block_parser.rb
  lib/rdoc/rd/inline_parser.rb
  lib/rdoc/markdown.rb
  lib/rdoc/markdown/literals_1_8.rb
  lib/rdoc/markdown/literals_1_9.rb
]

Hoe.plugin :git
Hoe.plugin :kpeg
Hoe.plugin :minitest
Hoe.plugin :travis

$rdoc_rakefile = true

hoe = Hoe.spec 'rdoc' do
  developer 'Eric Hodel', 'drbrain@segment7.net'
  developer 'Dave Thomas', ''
  developer 'Phil Hagelberg', 'technomancy@gmail.com'
  developer 'Tony Strauss', 'tony.strauss@designingpatterns.com'

  self.rsync_args = '-avz'
  rdoc_locations << 'docs.seattlerb.org:/data/www/docs.seattlerb.org/rdoc/'
  rdoc_locations << 'drbrain@rubyforge.org:/var/www/gforge-projects/rdoc/'

  spec_extras[:post_install_message] = <<-MESSAGE
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
  MESSAGE

  self.licenses << 'Ruby'
  self.readme_file  = 'README.rdoc'
  self.history_file = 'History.rdoc'
  self.testlib = :minitest
  self.extra_rdoc_files += %w[
    CVE-2013-0256.rdoc
    CONTRIBUTING.rdoc
    ExampleMarkdown.md
    ExampleRDoc.rdoc
    History.rdoc
    LEGAL.rdoc
    LICENSE.rdoc
    README.rdoc
    RI.rdoc
    TODO.rdoc
  ]

  self.clean_globs += PARSER_FILES
  self.kpeg_flags = '-fsv' if self.respond_to? :kpeg_flags= # no plugin

  require_ruby_version '>= 1.8.7'
  extra_deps     << ['json',     '~> 1.4']
  extra_dev_deps << ['racc',     '~> 1.4', '> 1.4.10']
  extra_dev_deps << ['minitest', '~> 4']

  extra_rdoc_files << 'Rakefile'
  spec_extras['required_rubygems_version'] = '>= 1.3'
  spec_extras['homepage'] = 'http://docs.seattlerb.org/rdoc'
end

hoe.test_prelude = 'gem "minitest", "~> 4.0"'

def rake(*args)
  sh $0, *args
end

need_racc = PARSER_FILES.any? do |rb_file|
  ry_file = rb_file.gsub(/\.rb\z/, ".ry")
  not File.exist?(rb_file) or
    (File.exist?(ry_file) and File.mtime(rb_file) < File.mtime(ry_file))
end

if need_racc
  Rake::Task["default"].prerequisites.clear
  task :default do
    rake "check_extra_deps"
    rake "install_plugins"
    rake "newb"
  end
end

Rake::Task['docs'].actions.clear
task :docs do
  $LOAD_PATH.unshift 'lib'
  require 'rdoc'

  options = RDoc::Options.new
  options.title = "rdoc #{RDoc::VERSION} Documentation"
  options.op_dir = 'doc'
  options.main_page = 'README.rdoc'
  options.files = hoe.spec.extra_rdoc_files + %w[lib]
  options.setup_generator 'darkfish'

  RDoc::RDoc.new.document options
end

# requires ruby 1.8 and ruby 1.8 to build
hoe.clean_globs -= PARSER_FILES.grep(/literals_/)

task :generate => :isolate
task :generate => PARSER_FILES
task :check_manifest => :generate

rule '.rb' => '.ry' do |t|
  racc = Gem.bin_path 'racc', 'racc'

  ruby "-rubygems #{racc} -l -o #{t.name} #{t.source}"
end

path = "pkg/#{hoe.spec.full_name}"

package_parser_files = PARSER_FILES.map do |parser_file|
  package_parser_file = "#{path}/#{parser_file}"
  file package_parser_file => parser_file # ensure copy runs before racc
  package_parser_file
end

task "#{path}.gem" => package_parser_files

# These tasks expect to have the following directory structure:
#
#   git/git.rubini.us/code # Rubinius git HEAD checkout
#   svn/ruby/trunk         # ruby subversion HEAD checkout
#   svn/rdoc/trunk         # RDoc subversion HEAD checkout
#
# If you don't have this directory structure, set RUBY_PATH and/or
# RUBINIUS_PATH.

diff_options = "-urpN --exclude '*svn*' --exclude '*swp' --exclude '*rbc'"
rsync_options = "-avP --exclude '*svn*' --exclude '*swp' --exclude '*rbc' --exclude '*.rej' --exclude '*.orig' --exclude '*.kpeg' --exclude '*.ry' --exclude 'literals_1_8.rb' --exclude 'gauntlet_rdoc.rb'"

rubinius_dir = ENV['RUBINIUS_PATH'] || '../../../git/git.rubini.us/code'
ruby_dir = ENV['RUBY_PATH'] || '../../svn/ruby/trunk'

desc "Updates Ruby HEAD with the currently checked-out copy of RDoc."
task :update_ruby do
  sh "rsync #{rsync_options} bin/rdoc #{ruby_dir}/bin/rdoc"
  sh "rsync #{rsync_options} bin/ri #{ruby_dir}/bin/ri"
  sh "rsync #{rsync_options} lib/ #{ruby_dir}/lib"
  sh "rsync #{rsync_options} test/ #{ruby_dir}/test/rdoc"
end

desc "Diffs Ruby HEAD with the currently checked-out copy of RDoc."
task :diff_ruby do
  options = "-urpN --exclude '*svn*' --exclude '*swp' --exclude '*rbc'"

  sh "diff #{diff_options} bin/rdoc #{ruby_dir}/bin/rdoc; true"
  sh "diff #{diff_options} bin/ri #{ruby_dir}/bin/ri; true"
  sh "diff #{diff_options} lib/rdoc.rb #{ruby_dir}/lib/rdoc.rb; true"
  sh "diff #{diff_options} lib/rdoc #{ruby_dir}/lib/rdoc; true"
  sh "diff #{diff_options} test #{ruby_dir}/test/rdoc; true"
end

desc "Updates Rubinius HEAD with the currently checked-out copy of RDoc."
task :update_rubinius do
  sh "rsync #{rsync_options} bin/rdoc #{rubinius_dir}/lib/bin/rdoc.rb"
  sh "rsync #{rsync_options} bin/ri #{rubinius_dir}/lib/bin/ri.rb"
  sh "rsync #{rsync_options} lib/ #{rubinius_dir}/lib"
  sh "rsync #{rsync_options} test/ #{rubinius_dir}/test/rdoc"
end

desc "Diffs Rubinius HEAD with the currently checked-out copy of RDoc."
task :diff_rubinius do
  sh "diff #{diff_options} bin/rdoc #{rubinius_dir}/lib/bin/rdoc.rb; true"
  sh "diff #{diff_options} bin/ri #{rubinius_dir}/lib/bin/ri.rb; true"
  sh "diff #{diff_options} lib/rdoc.rb #{rubinius_dir}/lib/rdoc.rb; true"
  sh "diff #{diff_options} lib/rdoc #{rubinius_dir}/lib/rdoc; true"
  sh "diff #{diff_options} test #{rubinius_dir}/test/rdoc; true"
end

