# Rakefile for MetaProject

# Copyright 2005 by Aslak Hellesoy (aslak.hellesoy@gmail.org)
# All rights reserved.

# This file is may be distributed under an MIT style license.  See
# MIT-LICENSE for details.

$:.unshift('lib')
require 'meta_project'
require 'rake/gempackagetask'
require 'rake/contrib/rubyforgepublisher'
require 'rake/contrib/xforge'
require 'rake/clean'
require 'rake/testtask'
require 'rake/rdoctask'

# Versioning scheme: MAJOR.MINOR.PATCH
# MAJOR bumps when API is broken backwards
# MINOR bumps when the API is broken backwards in a very slight/subtle (but not fatal) way
# -OR when a new release is made and propaganda is sent out.
# PATCH is bumped for every API addition and/or bugfix (ideally for every commit)
# Later DamageControl can bump PATCH automatically.
#
# REMEMBER TO KEEP PKG_VERSION IN SYNC WITH THE CHANGES FILE!
PKG_NAME = "meta_project"
PKG_VERSION = "0.4.15"
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
PKG_FILES = FileList[
  '[A-Z]*',
  'lib/**/*.rb', 
  'doc/**/*'
]

task :default => [:gem]

desc "Execute RSpec specifications (rspec gem must be installed)"
task :spec do
  ruby 'behaviours/suite.rb'
end

# Create a task to build the RDOC documentation tree.
rd = Rake::RDocTask.new("rdoc") do |rdoc|
  rdoc.rdoc_dir = 'html'
#  rdoc.template = 'kilmer'
#  rdoc.template = 'css2'
#  rdoc.template = 'doc/jamis.rb'
  rdoc.title    = "MetaProject"
  rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
  rdoc.rdoc_files.include('README', 'MIT-LICENSE', 'CHANGES')
  rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc')
  rdoc.rdoc_files.exclude('doc/**/*_attrs.rdoc')
end

# ====================================================================
# Create a task that will package the Rake software into distributable
# tar, zip and gem files.

spec = Gem::Specification.new do |s|
  
  #### Basic information.

  s.name = PKG_NAME
  s.version = PKG_VERSION
  s.summary = "Ruby library for interacting with project hosting servers, scms and issue trackers."
  s.description = <<-EOF
    MetaProject (formerly XForge) is a library that allows interaction with various project hosting servers, issue trackers, scms and scm browsers.  
  EOF

  s.files = PKG_FILES.to_a
  s.require_path = 'lib'
  s.autorequire = 'meta_project'

  #### Documentation and testing.

  s.has_rdoc = true
  s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
  s.rdoc_options <<
    '--title' <<  'MetaProject' <<
    '--main' << 'README' <<
    '--line-numbers'

  #### Author and project details.

  s.author = "Aslak Hellesoy"
  s.email = "aslak.hellesoy@gmail.com"
  s.homepage = "http://xforge.rubyforge.org"
  s.rubyforge_project = "xforge"
end

desc "Build Gem"
Rake::GemPackageTask.new(spec) do |pkg|
  pkg.need_zip = true
  pkg.need_tar = true
end

# Support Tasks ------------------------------------------------------

desc "Look for TODO and FIXME tags in the code"
task :todo do
  Pathname.new(File.dirname(__FILE__)).egrep(/#.*(FIXME|TODO|TBD|DEPRECATED)/) do |match|
    puts match
  end
end

task :release => [:verify_env_vars, :release_files, :publish_doc, :publish_news, :tag]

task :verify_env_vars do
  raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
  raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
end

task :publish_doc do
  publisher = Rake::RubyForgePublisher.new('xforge', ENV['RUBYFORGE_USER'])
  publisher.upload
end

desc "Release files on RubyForge"
task :release_files => [:gem] do
  release_files = FileList[
    "pkg/#{PKG_FILE_NAME}.gem"
  ]

  Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new('xforge')) do |release|
    # Never hardcode user name and password in the Rakefile!
    release.user_name = ENV['RUBYFORGE_USER']
    release.password = ENV['RUBYFORGE_PASSWORD']
    release.files = release_files.to_a
    release.release_name = "MetaProject #{PKG_VERSION}"
    # The rest of the options are defaults (among others, release_notes and release_changes, parsed from CHANGES)
  end
end

desc "Publish news on RubyForge"
task :publish_news => [:gem] do
  release_files = FileList[
    "pkg/#{PKG_FILE_NAME}.gem"
  ]

  Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new('xforge')) do |news|
    # Never hardcode user name and password in the Rakefile!
    news.user_name = ENV['RUBYFORGE_USER']
    news.password = ENV['RUBYFORGE_PASSWORD']
  end
end

desc "Tag all the CVS files with the latest release number (REL=x.y.z)"
task :tag do
  reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}"
  puts "Tagging CVS with [#{reltag}]"
  sh %{cvs tag #{reltag}}
end
