#!/usr/bin/env ruby
=begin
 Common Rakefile, Rantfile installer for SiSU
   softlink Rakefile and Rantfile to this file

 * Homepage: <http://www.jus.uio.no/sisu/SiSU>
             <http://search.sisudoc.org>
 * Download: <http://www.jus.uio.no/sisu/download>

 Copyright (C) 2007 Ralph Amissah

 * License: LGPL - GNU Lesser General Public License
     [same license as Rant provided within the Rant package]

 * Ralph Amissah <ralph@amissah.com>
   Ralph Amissah <ralph.amissah@gmail.com>

 Rake is a Ruby build program by Jim Weirich
 * Rake may be downloaded and installed from:
     <http://rake.rubyforge.org/>

 Rant is a Ruby build program by Stefan Lang
 * Rant may be downloaded and installed from:
     <http://make.rubyforge.org/>

 Notes on use:
   [if rake is preferred and installed]
     rake -T
   [if rant is preferred and installed]
     rant -T

 SiSU can also be Setup/Installation using:
 * Minero Aoki's setup.rb, provided along with SiSU, or

=end
#%% produce a makefile suitable for the target platform
#require 'mkmf'
#create_makefile("sisu")
#% manual settings, edit/update as required (note current default settings are obtained from sisu version yml file)
SiSU_version_next_stable     = '5.3.2'
SiSU_version_next_unstable   = '6.0.2'
#% rake file
SiSU_version_generic_next_stable     = '5.3.x'
SiSU_version_generic_next_unstable   = '6.0.x'
SiSU_version_dir_stable            = 'v5'
SiSU_version_dir_unstable          = 'v6'
require 'find'
require 'fileutils'
#require 'ftools'
require 'rbconfig.rb'
require 'yaml'
include FileUtils
module Project_details
  def self.name
    'SiSU'
  end
  def self.rake_rant
    "Rakefile/Rantfile for the installation/setup of #{name}"
  end
  def self.platform_notice
    "[#{name} is for Linux/Unix Platforms]"
  end
  def self.env
    RbConfig::CONFIG
  end
  def self.host
    env['host']
  end
  def self.dir
    def self.proj
      Project_details.name.downcase
    end
    def self.arch
      env['archdir']
    end
    def self.sitearch
      env['sitearchdir']
    end
    def self.bin
      env['bindir']
    end
    def self.lib
      env['sitelibdir']
    end
    def self.data
      env['datadir']
    end
    def self.share
      "#{env['datadir']}/sisu"
    end
    def self.conf
      env['sysconfdir']
    end
    def self.man
      env['mandir']
    end
    def self.vim
      "#{env['datadir']}/sisu/vim"
    end
    def self.out
      "#{env['localstatedir']}/#{proj}"
    end
    def self.rubylib
      env['LIBRUBYARG_SHARED']
    end
    def self.pwd
      Dir.pwd #ENV['PWD']
    end
    self
  end
  def self.version
    stamp={}
    v="#{dir.pwd}/conf/sisu/version.yml"
    if File.exist?(v)
      stamp=YAML::load(File::open(v))
      stamp[:version]
    else ''
    end
  end
  def self.system_info
    ##{Project_details.platform_notice}
    puts <<-WOK
  Host
    host:             #{Project_details.host}
    arch:             #{Project_details.dir.arch}
    sitearch:         #{Project_details.dir.sitearch}
  Directories for installation
    bin:                                          #{Project_details.dir.bin}
    lib (site-ruby):                              #{Project_details.dir.lib}/#{Project_details.dir.proj}/v*
    conf [etc]:                                   #{Project_details.dir.conf}/#{Project_details.dir.proj}
    data (odf, shared images):                    #{Project_details.dir.share}
    vim  (vim syntax, highlighting, ftplugin):    #{Project_details.dir.data}/sisu/vim
    data (README, version_manifest):              #{Project_details.dir.data}/doc/#{Project_details.dir.proj}
    man (manual pages):                           #{Project_details.dir.man}
    output:                                       #{Project_details.dir.out}
      processing:                                 #{Project_details.dir.out}/processing
      www:                                        #{Project_details.dir.out}/www
    rubylib:                                      #{Project_details.dir.rubylib}

    WOK
  end
  def self.gem_env
    system("gem env")
  end
end
module Utils
  def self.answer?(ask)
    resp='redo'
    print ask + " ['yes', 'no' or 'quit']: "
    resp=File.new('/dev/tty').gets.strip #resp=gets.strip
    if resp == 'yes'; true
    elsif resp == 'no'; false
    elsif resp =~/^quit|exit$/; exit
    else puts "[please type: 'yes', 'no' or 'quit']"
      answer?(ask)
    end
  end
  def self.default_notice
    ans= %{#{Project_details.rake_rant}
    Information on alternative actions is available using:
    [if rake (or rant) is installed:]
      "rake help" or "rake -T" (or "rant help" or "rant -T")
    Default action selected - "install #{Project_details.name}" proceed? }
    resp=answer?(ans)
    exit unless resp
  end
  def self.chmod_file(place)
    if place =~/\/bin/; File.chmod(0755,place)
    else                File.chmod(0644,place)
    end
  end
  def self.chmod_util(place)
    if place =~/\/bin/; chmod(0755,place)
    else                chmod(0644,place)
    end
  end
  def self.system_date
    `date "+%Y-%m-%d"`.strip
  end
  def self.system_date_stamp
    `date "+%Yw%W/%u"`.strip
  end
  def self.program_found?(prog)
    found=`which #{prog}` #`whereis #{make}`
    (found =~/bin\/#{prog}\b/) ? :true : :false
  end
end
module Install
                                                           #%% using a directory and its mapping
  def self.setup_find_create(dir_get,dir_put,exclude_files=[''])               #primary,
    begin
    Find.find("#{Project_details.dir.pwd}/#{dir_get}") do |f|
      stub=f.scan(/#{Project_details.dir.pwd}\/#{dir_get}\/(\S+)/).join
      place="#{dir_put}/#{stub}"
      action=case
      when File.file?(f)
        unless f =~/#{exclude_files.inspect}/
          cp(f,place)
          Utils.chmod_file(place)
          "->  #{dir_put}/"
        end
      when File.directory?(f)
        FileUtils.mkpath(place) unless FileTest.directory?(place)
        "./#{dir_get}/"
      else '?'
      end
      puts "#{action}#{stub}"
    end
    rescue
      puts "\n\n<< are you root? required for install >>"
    end
  end
  def self.setup_find_cp_r(dir_get,dir_put)                                    #secondary, using recursive copy
    Find.find("#{Project_details.dir.pwd}/#{dir_get}") do |f|
      stub=f.scan(/#{Project_details.dir.pwd}\/#{dir_get}\/(\S+)/).join
      place="#{dir_put}/#{stub}"
      case
      when File.file?(f)
        cp_r(f,place)
        Utils.chmod_util(place)
      when File.directory?(f)
        mkdir(place) unless FileTest.directory?(place)
      end
    end
  end
end
module Version_info
  def self.contents(vi)
    <<-WOK
---
:project: #{vi[:project]}
:version: #{vi[:version]}
:date_stamp: #{vi[:date_stamp]}
:date: "#{vi[:date]}"
    WOK
  end
  module Current
    def self.yml_file_path(version)
      "data/sisu/#{version}/v/version.yml"
    end
    def self.settings(file)
      v="#{Dir.pwd}/#{file}"
      if File.exist?(v)
        YAML::load(File::open(v))
      else ''
      end
    end
    def self.file_stable
      yml_file_path(SiSU_version_dir_stable)
    end
    def self.file_unstable
      yml_file_path(SiSU_version_dir_unstable)
    end
    def self.setting_stable
      settings(file_stable)
    end
    def self.setting_unstable
      settings(file_unstable)
    end
    def self.content_stable
      Version_info.contents(setting_stable)
    end
    def self.content_unstable
      Version_info.contents(setting_unstable)
    end
  end
  module Next
    def self.settings(v)
      {
        project:        "#{Project_details.name}",
        version:        "#{v}",
        date:           "#{Utils.system_date}",
        date_stamp:     "#{Utils.system_date_stamp}",
      }
    end
    def self.setting_stable
      settings(SiSU_version_next_stable)
    end
    def self.setting_unstable
      settings(SiSU_version_next_unstable)
    end
    def self.content_stable
      Version_info.contents(setting_stable)
    end
    def self.content_unstable
      Version_info.contents(setting_unstable)
    end
  end
  module Update
    def self.version_info_update_commit(filename,vi_hash_current,vi_content_current,vi_hash_next,vi_content_next)
      ans=%{update #{Project_details.name.downcase} version info replacing:
  #{vi_hash_current.sort}
with:
  #{vi_hash_next.sort}

#{vi_content_current} becoming:
#{vi_content_next}
proceed? }
      resp=Utils.answer?(ans)
      exit unless resp
      fn="#{Dir.pwd}/#{filename}"
      if File.writable?("#{Dir.pwd}/.")
        file_version=File.new(fn,'w+')
        file_version << vi_content_next
        file_version.close
      else
        puts %{*WARN* is the file or directory writable? could not create #{filename}}
      end
    end
    def self.update_stable
      version_info_update_commit(Version_info::Current.file_stable,Version_info::Current.setting_stable,Version_info::Current.content_stable,Version_info::Next.setting_stable,Version_info::Next.content_stable)
    end
    def self.update_unstable
      version_info_update_commit(Version_info::Current.file_unstable,Version_info::Current.setting_unstable,Version_info::Current.content_unstable,Version_info::Next.setting_unstable,Version_info::Next.content_unstable)
    end
    def self.changelog_header(vi)
      <<-WOK
%% #{vi[:version]}.orig.tar.xz (#{vi[:date]}:#{vi[:date_stamp].gsub(/20\d\dw/,'')})
http://sources.sisudoc.org/gitweb/?p=code/sisu.git;a=shortlog;h=refs/tags/sisu_#{vi[:version]}
http://sources.sisudoc.org/gitweb/?p=code/sisu.git;a=shortlog;h=refs/tags/debian/sisu_#{vi[:version]}-1
http://www.jus.uio.no/sisu/pkg/src/sisu_#{vi[:version]}.orig.tar.xz
  sisu_#{vi[:version]}.orig.tar.xz
  sisu_#{vi[:version]}-1.dsc
      WOK
    end
    def self.changelog_header_stable
      changelog_header(Version_info::Current.setting_stable)
    end
    def self.changelog_header_unstable
      changelog_header(Version_info::Current.setting_unstable)
    end
  end
  self
end
module Gemspecs
  def self.info(vi)
    puts <<-WOK
--
name:       #{vi[:project].downcase}
version:    #{vi[:version]}
date:       #{vi[:date]}
summary:    #{vi[:project]}
    WOK
  end
  def self.contents(vi,version)
    <<-WOK
Gem::Specification.new do |s|
  s.name           = '#{vi[:project].downcase}'
  s.version        = '#{vi[:version]}'
  s.date           = '#{vi[:date]}'
  s.summary        = '#{vi[:project]}'
  s.description    = '#{Project_details.name} gem'
  s.authors        = ["Ralph Amissah"]
  s.email          = 'ralph.amissah@gmail.com'
  s.files          = Dir['lib/#{Project_details.name.downcase}/#{version}/*.rb'] +
                     Dir['data/#{Project_details.name.downcase}/#{version}/v/version.yml'] +
                     Dir['data/#{Project_details.name.downcase}/image/*'] +
                     Dir['bin/#{Project_details.name.downcase}gem'] +
                     Dir['bin/#{Project_details.name.downcase}']
  s.license        = 'GPL3'
  s.executables << '#{Project_details.name.downcase}gem' << '#{Project_details.name.downcase}'
end
    WOK
  end
  def self.create(filename,gemspec)
    fn="#{Dir.pwd}/#{filename}.gemspec"
    if File.writable?("#{Dir.pwd}/.")
      file_sisu_gemspec=File.new(fn,'w+')
      file_sisu_gemspec << gemspec
      file_sisu_gemspec.close
    else
      puts %{*WARN* is the file or directory writable? could not create #{filename}}
    end
  end
  def self.build(fn)
    system(%{ gem build #{fn}.gemspec })
  end
  def self.install(fn)
    system(%{
      sudo gem install --no-rdoc --no-ri --verbose #{fn}.gem
    })
  end
  module Current
    def self.filename_stable
      "#{Project_details.name.downcase}-#{Version_info::Current.setting_stable[:version]}"
    end
    def self.filename_unstable
      "#{Project_details.name.downcase}-#{Version_info::Current.setting_unstable[:version]}"
    end
    def self.info_stable
      Gemspecs.info(Version_info::Current.setting_stable)
    end
    def self.info_unstable
      Gemspecs.info(Version_info::Current.setting_unstable)
    end
    def self.current_stable
      Gemspecs.contents(Version_info::Current.setting_stable,SiSU_version_dir_stable)
    end
    def self.current_unstable
      Gemspecs.contents(Version_info::Current.setting_unstable,SiSU_version_dir_unstable)
    end
    def self.create_stable
      Gemspecs.create(filename_stable,current_stable)
      Gemspecs.create("#{Project_details.name.downcase}-stable",current_stable)
    end
    def self.create_unstable
      Gemspecs.create(filename_unstable,current_unstable)
      Gemspecs.create("#{Project_details.name.downcase}-unstable",current_unstable)
    end
    def self.build_stable
      Gemspecs.build(filename_stable)
    end
    def self.build_unstable
      Gemspecs.build(filename_unstable)
    end
    def self.install_stable
      Gemspecs.install(filename_stable)
    end
    def self.install_unstable
      Gemspecs.install(filename_unstable)
    end
  end
  module Next
    def self.filename_stable
      "#{Project_details.name.downcase}-#{Version_info::Next.setting_stable[:version]}"
    end
    def self.filename_unstable
      "#{Project_details.name.downcase}-#{Version_info::Next.setting_unstable[:version]}"
    end
    def self.setting_stable
      Gemspecs.contents(Version_info::Next.setting_stable,SiSU_version_dir_stable)
    end
    def self.setting_unstable
      Gemspecs.contents(Version_info::Next.setting_unstable,SiSU_version_dir_unstable)
    end
    def self.create_stable
      Gemspecs.create(filename_stable,setting_stable)
    end
    def self.create_unstable
      Gemspecs.create(filename_unstable,setting_unstable)
    end
    def self.build_stable
      Gemspecs.build(filename_stable)
    end
    def self.build_unstable
      Gemspecs.build(filename_unstable)
    end
    def self.install_stable
      Gemspecs.install(filename_stable)
    end
    def self.install_unstable
      Gemspecs.install(filename_unstable)
    end
  end
end
module Help
  def self.project_help
    puts <<WOK

#{Project_details.name}
  #{Project_details.rake_rant}
  #{Project_details.platform_notice}

Commands quick start list
  #{Project_details.name} Rake/Rant Help: (Rakefile or Rantfile)
    rake (rake -T or rant -T)                  # a task list, (generated by Rake or Rant) for more complete and up to date help

  Quick start install and remove project #{Project_details.name}, as root:
    rake setup                                  # install #{Project_details.name}
    rake resetup                                # reinstall #{Project_details.name}
    rake remove_package                         # clobber/remove #{Project_details.name}, all versions
  alternatively to install as a gem:
    rake gem_create_build_install               # create gemspec; build gem, &; install gem, for #{Project_details.name}

  NOTE: these install options DO NOT setup #{Project_details.name} dependencies for:
  LaTeX(XeTeX) pdf output; or
  databases (postgresql or sqlite3) for #{Project_details.name} search
  should you wish to produce outputs that depend on them
  (on Debian for example this is the work of the debian installer)

WOK
  end
  def self.tasks(make='rake')
    begin
      system("#{make} -T")
    rescue
      puts 'is either rake or rant installed?'
    end
  end
end
#% tasks
desc "show rake/rant tasks for sisu install, and sisu gem (create spec, build &) install"
  task :default => [:note_sources,:tasks,:note_installation] #[:default_notice,:setup_base]
desc "Setup/Install #{Project_details.name}"
  task :setup_project=> [:setup_bin_,:setup_lib_,:setup_conf_,:setup_share_,:setup_data_,:setup_man_,:setup_vim_,:src_note]
  task :project=> [:setup_project]
desc "Setup/Install #{Project_details.name}"
  task :setup=> [:setup_bin_, :setup_lib_,:setup_conf_,:setup_share_,:setup_data_] #, :help]
desc "Setup/Install #{Project_details.name}: bin, lib and conf (no data)"
  task :setup_base=> [:setup_bin_,:setup_lib_,:setup_conf_,:setup_share_,:setup_man_,:setup_vim_,:note_sources]
  task :base=> [:setup_base]
desc "Setup/Install #{Project_details.name}: bin, lib, conf & data"
  task :setup_with_data=> [:setup_base,:setup_data]
desc "check package version"
  task :sisuversion => [:sisu_version]
#desc "set package version"
  task :sisuversionset => [:sisu_version_set,:changelog_headers]
desc "check gemspec info"
  task :gem_spec => [:gemspec_info]
desc "create sisu v_stable gemspec"
  task :gem_create_spec_stable => [:gemspecs_stable_create_default_version]
  task :gem5cs => [:gem_create_spec_stable]
  task :gem5createspecs => [:gemspecs_stable_create_default_version]
desc "create sisu v_unstable gemspec"
  task :gem_create_spec_unstable => [:gemspecs_unstable_create_default_version]
  task :gem6cs => [:gem_create_spec_unstable]
  task :gem6createspecs => [:gemspecs_unstable_create_default_version]
desc "create gemspec"
  task :gem_create_spec => [:gemspecs_create_default_version]
  task :gemcs => [:gemspecs_create_default_version]
  task :gemc => [:gemspecs_create_default_version]
  task :gemspecscreate => [:gemspecs_create_default_version]
#---
desc "build gem"
  task :gem_build => [:gem_build_]
  task :gemb => [:gem_build]
  task :gembuild => [:gem_build]
desc "build sisu v_stable gem"
  task :gem_build_stable => [:gem_stable_build]
  task :gem5b => [:gem_build_stable]
  task :gem5build => [:gem_build_stable]
desc "build sisu v_unstable gem"
  task :gem_build_unstable => [:gem_unstable_build]
  task :gem6b => [:gem_build_unstable]
  task :gem6build => [:gem_build_unstable]
#---
desc "create, build & install sisu v_stable gem"
  task :gem_create_build_install_stable => [:gemspecs_stable_create_default_version,:gem_stable_build,:gem_stable_install]
  task :gem5cbi => [:gem_create_build_install_stable]
desc "create, build & install sisu v_unstable gem"
  task :gem_create_build_install_unstable => [:gemspecs_unstable_create_default_version,:gem_unstable_build,:gem_unstable_install]
  task :gem6cbi => [:gem_create_build_install_unstable]
desc "create, build & install sisu v_stable & v_unstable gem"
  task :gem_create_build_install => [:gemspecs_create_default_version,:gem_build_,:gem_install_]
  task :gemcbi => [:gem_create_build_install]
#---
desc "install gem"
  task :gem_install => [:gem_install_]
  task :gemi => [:gem_install]
  task :geminstall => [:gem_install]
desc "build & install sisu v_stable gem"
  task :gem_build_install_stable => [:gem_stable_build,:gem_install_]
  task :gem5bi => [:gem_build_install_stable]
desc "build & install sisu v_unstable gem"
  task :gem_build_install_unstable => [:gem_unstable_build,:gem_install_]
  task :gem6bi => [:gem_build_install_unstable]
desc "build & install gem"
  task :gem_build_install => [:gem_build,:gem_install_]
  task :gembi => [:gem_build_install]
#-- manually set next version
#desc "create sisu v_stable gemspec, manually set next version"
  task :gem5csn => [:gemspecs_stable_create_next_version]
#desc "create sisu v_unstable gemspec, manually set next version"
  task :gem6csn => [:gemspecs_unstable_create_next_version]
#desc "create gemspec, manually set next version"
  task :gemcsn => [:gemspecs_create_next_version]
  task :gemcn => [:gemspecs_create_next_version]
#desc "build gem, manually set next version"
  task :gembn => [:gem_build_next_version]
#desc "build sisu v_stable gem, manually set next version"
  task :gem5bn => [:gem_stable_build_next_version]
#desc "build sisu v_unstable gem, manually set next version"
  task :gem6bn => [:gem_unstable_build_next_version]
#desc "install gem, manually set next version"
  task :gemin => [:gem_install_next_version]
#desc "build & install sisu v_stable gem, manually set next version"
  task :gem5bin => [:gem_stable_build_next_version,:gem_install_next_version]
#desc "build & install sisu v_unstable gem, manually set next version"
  task :gem6bin => [:gem_unstable_build_next_version,:gem_install_next_version]
#desc "build & install gem, manually set next version"
  task :gembin => [:gem_build_next_version,:gem_install_next_version]
#desc "create, build & install sisu v_stable gem, manually set next version"
  task :gem5cbin => [:gemspecs_stable_create_next_version,:gem_stable_build_next_version,:gem_stable_install_next_version]
#desc "create, build & install sisu v_unstable gem, manually set next version"
  task :gem6cbin => [:gemspecs_unstable_create_next_version,:gem_unstable_build_next_version,:gem_unstable_install_next_version]
#desc "create, build & install sisu v_stable & v_unstable gem, manually set next version"
  task :gemcbin => [:gemspecs_create_next_version,:gem_build_next_version,:gem_install_next_version]
#---
#desc "check changelog headers"
  task :changelogheaders => [:changelog_headers]
  task :dev => [:note_developer]
  task :developer_note => [:note_developer]
if File.directory?('bin')
  desc "Setup #{Project_details.name} bin only, synonym :bin"
    task :setup_bin => [:setup_bin_]
    task :bin => [:setup_bin]
end
if File.directory?('lib')
  desc "Setup #{Project_details.name} lib only, synonym :lib"
    task :setup_lib => [:setup_lib_]
    task :lib => [:setup_lib]
end
if File.directory?('conf')
  desc "Setup #{Project_details.name} conf only, synonyms :conf & :etc"
    task :setup_conf => [:setup_conf_]
    task :conf => [:setup_conf]
    task :setup_etc => [:setup_conf]
    task :etc => [:setup_conf]
end
if File.directory?('data')
  desc "Setup #{Project_details.name} data only, synonyms :data & :examples"
    task :setup_data => [:setup_data_]
    task :data => [:setup_data]
    task :setup_examples => [:setup_data]
    task :examples => [:setup_data]
end
if File.directory?('data/sisu')
  #desc "Setup #{Project_details.name} shared data only (odf & shared images)"
    task :setup_share => [:setup_share_]
    task :share => [:setup_share]
end
if File.directory?('man')
  desc "Setup #{Project_details.name} man pages only, synonyms :man"
    task :setup_man => [:setup_man_]
    task :man => [:setup_man]
end
if File.directory?('data/vim')
  desc "Setup #{Project_details.name} vim config files only, synonyms :vim"
    task :setup_vim => [:setup_vim_]
    task :vim => [:setup_vim]
end
desc "Remove #{Project_details.name} (all versions)"
  task :remove_package => [:remove_bin, :remove_lib, :remove_conf]
if File.directory?('bin')
  #desc "Remove #{Project_details.name} bin only"
    task :remove_bin => [:remove_bin]
end
if File.directory?('lib')
  #desc "Remove #{Project_details.name} lib only"
    task :remove_lib => [:remove_lib]
end
if File.directory?('conf')
  #desc "Remove #{Project_details.name} conf only"
    task :remove_conf => [:remove_conf]
end
desc "Re-setup #{Project_details.name}, synonym :reinstall"
  task :resetup => [:remove, :setup]
  task :reinstall => [:remove, :setup]
#desc "Re-setup #{Project_details.name}: bin, lib, conf (ignore data), synonym :reinstall"
  task :resetup_base => [:remove, :setup_base_]
  task :reinstall_base => [:remove, :setup_base_]
if File.directory?('bin')
  #desc "Re-setup #{Project_details.name} bin, synonym :reinstall"
    task :resetup_bin => [:remove_bin, :setup_bin_]
    task :reinstall_bin => [:remove_bin, :setup_bin_]
end
if File.directory?('lib')
  #desc "Re-setup #{Project_details.name} lib, synonym :reinstall_lib"
    task :resetup_lib => [:remove_lib, :setup_lib_]
    task :reinstall_lib => [:remove_lib, :setup_lib_]
end
if File.directory?('conf')
  #desc "Re-setup #{Project_details.name} conf, synonyms :reinstall_conf & :resetup_etc"
    task :resetup_conf => [:remove_conf, :setup_conf_]
    task :reinstall_conf => [:remove_conf, :setup_conf_]
    task :resetup_etc => [:remove_conf, :setup_conf_]
    task :reinstall_etc => [:remove_conf, :setup_conf_]
end
if File.directory?('data/sisu')
  #desc "Re-setup #{Project_details.name} shared data, (odf & images)"
    task :resetup_share => [:remove_share, :setup_share_]
    task :reinstall_share => [:remove_share, :setup_share_]
end
if File.directory?('man')
  #desc "Re-setup #{Project_details.name} man, synonym :reinstall_man"
    task :resetup_man => [:remove_man, :setup_man_]
    task :reinstall_man => [:remove_man, :setup_man_]
end
desc 'Setup Note'
  task :setup_note => [:help]
desc "System information used by #{Project_details.name}"
  task :system => [:system_info,:project_help,:note_sources]
desc "show all system info available - parameters found"
  task :system_param => [:system_param_]
desc "Gem environment information used ruby gems for #{Project_details.name}"
  task :gem_env => [:gem_env_]
desc 'Help'
  task :help => [:project_help,:system_info,:tasks]
#desc "Setup/Install #{Project_details.name} (uses filelist)"
  task :install => [:default_notice,:project]
  task :install_bin => [:setup_bin_]
                                                           #%% setup/install tasks
task :rant_independence do                                 #notice
  resp=''
  while resp.length < 4
    resp='sisu-install'                                     #default name install
    print %{#{Project_details.rake_rant}
  Create a rant dependency independent file
  provide filename default name is "install"
    [Warning, will overwrite file of name provided
      provide name or "quit" to exit]: }
    exit if resp =~/^(?:n|quit|exit)$/
  end
  remove='y' #remove='n'
 if remove =~/y/
   system("rant-import --force --auto #{resp};
     chmod 755 #{resp}
   ")
 else #puts "#{resp} not replaced"
 end
end

task :default_notice do                                    #notice
  Utils.default_notice
end
task :default2 do                                     #secondary
  setup_find_cp_r('bin',Project_details.dir.bin) if File.directory?('bin')
  setup_find_cp_r('lib',Project_details.dir.lib) if File.directory?('lib')
  setup_find_cp_r('conf',Project_details.dir.conf) if File.directory?('conf')
  setup_find_cp_r('data/sisu',Project_details.dir.share) if File.directory?('data/sisu') #
  setup_find_cp_r('data',Project_details.dir.data) if File.directory?('data')
  setup_find_cp_r('data/vim',"#{Project_details.dir.data}/vim") if File.directory?('data/vim')
  setup_find_cp_r('man',Project_details.dir.man) if File.directory?('man')
end
task :setup_bin_ do
  exclude_files=['sisugem']
  Install.setup_find_create('bin',Project_details.dir.bin,exclude_files) if File.directory?('bin')
end
task :setup_lib_ do
  Install.setup_find_create('lib',Project_details.dir.lib) if File.directory?('lib')
end
task :setup_conf_ do
  Install.setup_find_create('conf',Project_details.dir.conf) if File.directory?('conf')
end
task :setup_share_ do
  Install.setup_find_create('data/sisu',Project_details.dir.share) if File.directory?('data/sisu')
end
task :setup_data_ do
  Install.setup_find_create('data',Project_details.dir.data) if File.directory?('data')
end
task :setup_man_ do
  Install.setup_find_create('man',Project_details.dir.man) if File.directory?('man')
  Install.setup_find_create('man.deb/man',Project_details.dir.man) if File.directory?('man.deb/man')
end
task :setup_vim_ do
  Install.setup_find_create('data/vim',Project_details.dir.vim) if File.directory?('data/vim')
end
task :gemspec_info do
  Gemspecs.info_stable
  Gemspecs.info_unstable
end
task :gemspecs_stable_create_default_version do
  Gemspecs::Current.create_stable
end
task :gemspecs_unstable_create_default_version do
  Gemspecs::Current.create_unstable
end
task :gemspecs_create_default_version do
  Gemspecs::Current.create_stable
  Gemspecs::Current.create_unstable
end
task :gemspecs_stable_create_next_version do
  Gemspecs::Next.create_stable
end
task :gemspecs_unstable_create_next_version do
  Gemspecs::Next.create_unstable
end
task :gemspecs_create_next_version do
  Gemspecs::Next.create_stable
  Gemspecs::Next.create_unstable
end
task :gem_stable_build do
  Gemspecs::Current.build_stable
end
task :gem_unstable_build do
  Gemspecs::Current.build_unstable
end
task :gem_build_ do
  Gemspecs::Current.build_stable
  Gemspecs::Current.build_unstable
end
task :gem_stable_build_next_version do
  Gemspecs::Next.build_stable
end
task :gem_unstable_build_next_version do
  Gemspecs::Next.build_unstable
end
task :gem_build_next_version do
  Gemspecs::Next.build_stable
  Gemspecs::Next.build_unstable
end
task :gem_stable_install do
  Gemspecs::Current.install_stable
end
task :gem_unstable_install do
  Gemspecs::Current.install_unstable
end
task :gem_install_ do
  Gemspecs::Current.install_stable
  Gemspecs::Current.install_unstable
end
task :gem_stable_install_next_version do
  Gemspecs::Next.install_stable
end
task :gem_unstable_install_next_version do
  Gemspecs::Next.install_unstable
end
task :gem_install_next_version do
  Gemspecs::Next.install_stable
  Gemspecs::Next.install_unstable
end
task :changelog_headers do
  puts '---'
  puts Version_info::Update.changelog_header_stable
  puts '---'
  puts Version_info::Update.changelog_header_unstable
end
task :sisu_version do
  puts Version_info::Next.setting_stable
  puts Version_info::Next.setting_unstable
  puts '---'
  puts Version_info::Current.setting_stable[:project]
  puts Version_info::Current.setting_stable[:version]
  puts Version_info::Current.setting_stable[:date]
  puts Version_info::Current.setting_stable[:date_stamp]
  puts '---'
  puts Version_info::Current.setting_unstable[:project]
  puts Version_info::Current.setting_unstable[:version]
  puts Version_info::Current.setting_unstable[:date]
  puts Version_info::Current.setting_unstable[:date_stamp]
end
task :sisu_version_set do
  Version_info::Update.update_stable
  Version_info::Update.update_unstable
end
                                                           #%% post install
                                                           #%% clobber/remove tasks
task :remove_bin do
  rm_r "#{Project_details.dir.bin}/#{Project_details.dir.proj}" if FileTest.file?("#{Project_details.dir.bin}/#{Project_details.dir.proj}")
end
task :remove_lib do
  rm_r "#{Project_details.dir.lib}/#{Project_details.dir.proj}" if FileTest.directory?("#{Project_details.dir.lib}/#{Project_details.dir.proj}")
end
task :remove_conf do
  rm_r "#{Project_details.dir.conf}/#{Project_details.dir.proj}" if FileTest.directory?("#{Project_details.dir.conf}/#{Project_details.dir.proj}")
end
task :remove_man do
  rm_r "#{Project_details.dir.man}/**/#{Project_details.dir.proj}" if FileTest.directory?("#{Project_details.dir.man}/man1/#{Project_details.dir.proj}")
end
task :remove_version do
  rm_r "#{Project_details.dir.bin}/#{Project_details.dir.proj}" if FileTest.file?("#{Project_details.dir.bin}/#{Project_details.dir.proj}")
  rm_r "#{Project_details.dir.lib}/#{Project_details.dir.proj}/#{Project_details.version}" if FileTest.directory?("#{Project_details.dir.lib}/#{Project_details.dir.proj}/#{Project_details.version}")
  rm_r "#{Project_details.dir.conf}/#{Project_details.dir.proj} if FileTest.directory?("#{Project_details.dir.conf}/#{Project_details.dir.proj}")
end
task :remove_package do
  rm_r "#{Project_details.dir.bin}/#{Project_details.dir.proj}" if FileTest.file?("#{Project_details.dir.bin}/#{Project_details.dir.proj}")
  rm_r "#{Project_details.dir.lib}/#{Project_details.dir.proj}" if FileTest.directory?("#{Project_details.dir.lib}/#{Project_details.dir.proj}")
  rm_r "#{Project_details.dir.conf}/#{Project_details.dir.proj}" if FileTest.directory?("#{Project_details.dir.conf}/#{Project_details.dir.proj}")
end
task :note_sources do
  puts <<-WOK

  SiSU project:
      <http://sisudoc.org>
      <http://www.jus.uio.no/sisu>
  sisu source code is available at:
      <http://sources.sisudoc.org>
      <http://sources.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
  sisu markup samples are provided/packaged separately as sisu-markup-samples:
      <http://sources.sisudoc.org/gitweb/?p=doc/sisu-markup-samples.git;a=summary>
  WOK
end
task :note_installation do
  puts <<-WOK
  alternative 0: distribution install, rather than this Rakefile
    a distribution install pulls in the many dependencies used by sisu after
    initial processing to generate and store output, significant amongst these are
    XeTeX & databases (sqlite3 and postgresql)

  alternative 1: gem install, you need to:
    create the gemspec; build the gem (from the gemspec); install the gem
  which can be done with the single command:
    rake gem_create_build_install   # (to build and install sisu v5 & sisu v6, alias gemcbi)
  separate gems are made/installed for sisu v5 & sisu v6 contained in source:
    rake gem_create_build_install_stable   # (to build and install sisu v5, alias gem5cbi)
    rake gem_create_build_install_unstable   # (to build and install sisu v6, alias gem6cbi)
  for individual steps (create, build, install) see rake options, rake -T
  to specify sisu version for sisu installed via gem
    sisu _#{Version_info::Current.setting_stable[:version]}_ --version
    sisu _#{Version_info::Current.setting_unstable[:version]}_ --version
  to uninstall sisu installed via gem
    sudo gem uninstall --verbose sisu
  WOK
end
task :note_developer do
  puts <<-WOK

  changelogheaders

  sisuversion
  sisuversionset

  gemcsn gem5csn gem6csn
  gembn gem5bn gem6bn
  gemin gem5in gem6in
  gembin gem5bin gem6bin
  gemcbin gem5cbin gem6cbin
  WOK
end
                                                           #%% help & system info
task :system_info do
  Project_details.system_info
end
task :system_param_ do
  Project_details.env.each {|c| puts c.inspect }
end
task :gem_env_ do
  Project_details.gem_env
end
task :project_help do
  Help.project_help
end
task :tasks do
  Help.tasks
end