
# Rantfile for Rant :)

import "md5"
import %w(rubytest rubydoc rubypackage autoclean win32/rubycmdwrapper sys/more)

ENV["RANT_DEV_LIB_DIR"] = sys.expand_path("lib")

task :default => :test

dist_files = sys.filelist [
    "NEWS", "README", "INSTALL", "COPYING",
    "Rantfile", "install.rb", "setup.rb",
    "run_rant", "run_import"
    ]
dist_files.glob_unix "{bin,lib,test,doc,misc}/**/*"
dist_files.exclude_name "html", "coverage"

hp_files = sys["doc/homepage/*"]
rdoc_files = sys["README", "NEWS", "INSTALL", "doc/*.rdoc"]

# remove when compiler stuff is getting useful...
dist_files.exclude "lib/rant/compiler*", "lib/rant/import/c/program.rb"

rdoc_opts = %w(-S -c UTF-8 --title Rant --main README)

gen RubyPackage, "rant#{var :pkg_ext}" do |t|
    t.version = `#{sys.sp Env::RUBY_EXE} run_rant --version`.split[1]
    t.summary = "Rant is a Ruby based build tool."
    t.files = dist_files
    t.bindir = "bin"
    t.executable %w(rant rant-import)
    t.author = "Stefan Lang (maintained by Xavier Shay)"
    t.email = "contact@rhnh.net"
    t.rubyforge_project = "rant"
    t.homepage = "http://rant.rubyforge.org"
    t.has_rdoc = false
    t.gem_extra_rdoc_files = rdoc_files
    t.gem_rdoc_options = rdoc_opts
    desc "Create packages for distribution."
    t.package_task
end

task "dev-pkg" do
    make Package::Tgz, "pkg/rant-dev", :files => dist_files
end

task "dist-files" do
    puts dist_files
end

desc "Generate documentation."
gen RubyDoc do |g|
    g.verbose = true
    g.dir = "doc/html"
    g.files = rdoc_files
    g.opts = rdoc_opts + %w(-T doc/jamis.rb)
end

html_index = "doc/html/index.html"
api_index = html_index.sub("index", "api")

enhance "doc/html/index.html" do
    sys.rm_f api_index # remove old RDoc index page
    make "hp2doc"
end

task "hp2doc" do
    if test(?f, html_index) && !test(?f, api_index)
        sys.mv html_index, api_index
    end
    sys.cp hp_files, "doc/html"
end

desc "Publish html docs on make.rubyfore.org.",
     "Note: scp will prompt for rubyforge password."
task "publish-docs" => :doc do
    sys "scp -r doc/html/* meink@rubyforge.org:/var/www/gforge-projects/rant/"
end

task "publish-hp" do
    sys "scp -r doc/homepage/* meink@rubyforge.org:/var/www/gforge-projects/rant/"
end

desc "Run basic tests."
gen RubyTest do |g|
    g.libs << "test"
    g.test_files = sys["test/test_*.rb", "test/units/**/test_*.rb"]
end

desc "Run just unit tests."
gen RubyTest, "test:units".to_sym do |g|
    g.libs << "test"
    g.test_files = sys["test/units/**/test_*.rb"]
end

desc "Run first test-project."
gen RubyTest, :testp1 do |g|
    g.libs << "test"
    g.test_files = ["test/project1/test_project.rb"]
end

desc "Run second test project."
gen RubyTest, :testp2 do |g|
    g.libs << "test"
    g.test_files = ["test/project2/test_project.rb"]
end

desc "Test small Ruby project."
gen RubyTest, :testrb1 do |g|
    g.libs << "test"
    g.test_files = %w(test/project_rb1/test_project_rb1.rb)
end

desc "Test plugins."
gen RubyTest, :testplugins do |g|
    g.libs << "test"
    g.test_files = sys["test/plugin/**/test_*"]
end

desc "Run all tests and generate coverage with rcov."
task :cov do
    lp = File.expand_path "lib"
    sys.cd "test" do
	sys %W(rcov -xtutil.rb,ts_*,tc_*,test_* -I#{lp} ts_all.rb)
    end
end

desc "Test project with subdirs."
gen RubyTest, :tsubdirs do |t|
    t.libs << "test"
    t.test_files = sys["test/subdirs/test_*.rb"]
end

desc "Test rant-import command."
gen RubyTest, :trimport do |t|
    t.libs << "test"
    t.test_files = sys["test/rant-import/test_*.rb"]
end

desc "Test import/ libraries."
gen RubyTest, :timport do |t|
    t.libs << "test"
    t.test_files = sys["test/import/**/test_*.rb"]
end

desc "Test C support."
gen RubyTest, :tc do |t|
    t.libs << "test"
    t.test_files = sys["test/c/test_*.rb", "test/import/c/**/test_*.rb"]
end

desc "Run all tests."
task :tall do
    puts "Running build tool tests..."
    make "trantfile"
    puts "Build tool tests successful."
    puts "Running library tests..."
    make "tlib"
    puts "All tests (build tool and library) successful."
end

gen RubyTest, :trantfile do |t|
    t.libs << "test"
    t.test_files = sys["test/**/test_*.rb"].exclude("test/lib/*")
end

gen RubyTest, :tlib do |t|
    t.libs << "test"
    t.test_files = sys["test/lib/**/test_*.rb"]
end

task :t180 do |t|
    # my installed testrb version doesn't work with ruby-1.8.0
    sys.cd "test"
    if var[:TEST]
        sys "ruby180", "-w", "-rtest/unit", "-I", sys.expand_path("@lib"),
            "-I", sys.expand_path("."), var[:TEST].sub(/^test\//, '')
    else
        sys "ruby180 ts_all.rb"
    end
end

desc "Remove autogenerated files."
gen AutoClean, :clean
var[:clean].include %w(
    InstalledFiles .config bench-rant bench-depsearch test/coverage
)

# Just for quick visual testing of rant...
task :please_fail do |t|
    sys "mix_nix_gibts"
end

task "to-win" => :package do
    win_dir = "/mnt/data_fat/stefan/Ruby"
    Dir["pkg/*"].each { |f|
	target = File.join(win_dir, File.basename(f))
	make target => f do |t|
            sys.rm_rf target if test(?e, target)
            sys.cp_r f, t.name
	end
    }
end

desc "Install Rant."
task :install do
    sys.ruby "setup.rb"
    # try to install man page
    man_path = ENV["MANPATH"]
    if man_path
        puts "trying to install rant(1) manpage..."
        require 'rbconfig'
        prefix = Config::CONFIG["prefix"]
        dirs = sys.split_path man_path
        man_dir = dirs.find{|d| d == "#{prefix}/man" } || dirs.first
        sys.install "doc/rant.1", "#{man_dir}/man1", :mode => 0644 if man_dir
    end
end

if Env.on_windows?
    enhance :install => (gen Win32::RubyCmdWrapper, sys["bin/*"])
end

task "svn-clean" do
    `svn stat`.split(/\n/).each { |line|
        sys.clean line[7..-1] if line[0] == ??
    }
end

task "check-168" do
    rbfiles = sys["bin/rant*", "lib/**/*.rb"]
    ok = []
    bad = []
    rbfiles.each { |fn|
        sys "ruby168 -c #{fn}" do |ps|
            (ps.exitstatus == 0 ? ok : bad) << fn
        end
    }
    puts "Bad files:"
    bad.each { |b| puts "  #{b}" }
    puts "#{ok.size} of #{rbfiles.size} are OK"
end

desc "Create local backup of svn repos on berlios."
task "fetch-svn-dump" do
    require 'net/http'
    require 'uri'
    url = URI.parse("http://svn.berlios.de/svndumps/rant-repos.gz")
    req = Net::HTTP::Get.new(url.path)
    ds = Time.now.strftime("%Y-%m-%d")
    puts "Starting download from: #{url}"
    res = Net::HTTP.start(url.host, url.port) { |http|
        http.request(req)
    }
    sys.write_to_file "../rant-repos_#{ds}.gz", res.body
end

task "stats" do
    require 'scriptlines'
    files = sys["lib/**/*.rb"]
    puts ScriptLines.headline
    sum = ScriptLines.new("TOTAL (#{files.size} scripts)")
    files.each { |fn|
        File.open(fn) do |file|
            script_lines = ScriptLines.new(fn)
            script_lines.read(file)
            sum += script_lines
            puts script_lines
        end
    }
    puts sum
end

task "rb-stats" do
    files = sys["lib/**/*.rb"]
    lines = 0
    code_lines = 0
    files.each { |fn|
        l, c =  count_rb_lines(fn)
        lines += l
        code_lines += c
    }
    puts "Number of Ruby files under lib/: #{files.size}"
    puts "  #{lines} total lines"
    puts "  #{code_lines} LOC"

    files.exclude("lib/rant/archive*")

    lines = 0
    code_lines = 0
    files.each { |fn|
        l, c =  count_rb_lines(fn)
        lines += l
        code_lines += c
    }
    puts "  without lib/rant/archive/: #{files.size}"
    puts "    #{lines} total lines"
    puts "    #{code_lines} LOC"
end

def count_rb_lines(fn)
    lines = 0
    code_lines = 0
    in_multiline_comment = false
    File.readlines(fn).each { |line|
        lines += 1
        case line
        when /=end(\s|$)/:
            in_multiline_comment = false
            next
        when /^\s*$/, /^\s*#/: next
        when /^=begin(\s|$)/
            in_multiline_comment = true
        end
        code_lines += 1 unless in_multiline_comment
    }
    [lines, code_lines]
end

@prefix = var[:prefix] || "/usr/local"

task "uninstall" do
    print <<-EOF
    Run task _uninstall_ to uninstall Rant from prefix[#@prefix].
    EOF
end

task "_uninstall_" do
    sys.rm_rf FileList["#@prefix/lib/ruby/site_ruby/1.8/rant*"]
    sys.rm_f FileList["#@prefix/bin/rant*"]
end

# vim:ft=ruby
