rakelib/info.rake
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 29 Nov 2016 10:19:15 +0000
changeset 93 650412e81596
parent 9 34274130f57a
child 137 e665031cade7
permissions -rw-r--r--
Automatically extract package dependencies from project definition file ...rather than depend on manually pre-extracted and commited dependencies. This makes the code more robust as well easier to use. It will also allow for parallelized builds (though some changes need to be done to `stc`) Big thanks to Patrik Svestka for providing me a Ruby code to extract dependencies. Yay, I wanted for this for so long...

def _display_tasks(tasks)
  width = tasks.collect { |t| t.name_with_args.length }.max || 10
  max_column = Rake.application.truncate_output? ? Rake.application.terminal_width - 'name'.size - width - 7 : nil
  tasks.each do | t |
    printf "%-#{width}s  # %s\n",
    t.name_with_args, max_column ? Rake.application.truncate(t.comment || '', max_column) : t.comment || ''
  end
end  

task :'info' do
  puts "Choose one of the following:"
  puts 
  _display_tasks(Rake.application.tasks_in_scope(['info']))   
end


namespace :'info' do
  desc "Dump environment variables and their values"
  task :'environment' do
    puts "Environment variables"
    ENV.each {| key, value | puts "  #{key}=\"#{value}\""}
    puts "---------------------"
  end

  desc "Alias for task into:environment"
  task :'env' => :'environment'
  
  desc "Dumps variables and their values"
  task :'variables' do
    puts "BUILD_DIR = #{BUILD_DIR}"
  end
  
  desc "Show all available tasks"
  task :'tasks' do
    puts "All tasks:"
    puts 
    Rake.application.tasks.each do | t |
      puts t.name
    end
  end

  namespace :'tasks' do

    desc "Print all tasks that depends on given one"
    task :'dependents' , :task do | t, args |
      task_n = args[:task] || (error "No task specified")
      task =  t.application.lookup(task_n)
      if not task
        puts "Task #{task_n} not defined. Forgot to call setup task?"
      end
      puts "Tasks that depend on #{task_n}:"
      t.application.tasks.each do | each_nm |
        each = t.application[each_nm]
        if each.prerequisites.include? task_n
          puts " #{each_nm}"
        end
      end
    end


    desc "Print internal state of on given task"
    task :'inspect' , :task do | t, args |
      task_n = args[:task] || (error "No task specified")
      task =  t.application.lookup(task_n)
      if task 
        puts task.investigation()      
        puts "requisited by:"
        task.application.tasks.each do | each_nm |
          each = task.application[each_nm]
          if each.prerequisites.include? task.name
            puts " #{each_nm}"
          end
        end
        puts
        puts "actions: "
        task.actions.each do | a |
          puts "  #{a}"
        end
      else
        puts "Task #{task_n} not defined. Forgot to call setup task?"
      end      
    end
      
    desc "Print all prerequisites of given task topologically sorted" 
    task :'prereq-all' , :task do | t, args |
      task_n = args[:task] || (error "No task specified")
      task =  t.application.lookup(task_n)
      puts "task '#{task_n}'"
      task.all_prerequisites_sorted.each do | prereq |
        puts "  => #{prereq} "        
      end
    end



    desc "Show given task and its prerequisites, all tasks if task not specified."
    task :'prereq' , :task do | t, args |
      task = args[:task] || nil

      if task
        tasks = [ t.application.lookup(task) ]
      else
        tasks = t.application.tasks
      end

      puts "task '#{task}'"
            
      tasks.each do | t |
        puts t.name
        t.prerequisites.each do | prereq |
          puts "  => #{prereq} "
        end
      end
    end
  end # namespace :'tasks'
end

namespace :'info' do

  namespace :'project' do
    
    desc "Print project name"
    task :'name' => :'setup:project' do
      puts project.app_name
    end

    desc "Print project version"
    task :'version' => :'setup:project' do
      puts project.app_version
    end
    
  end

  
  desc "Print current build name"
  task :'buildname' => :'setup:project' do
    puts BUILD_NAME
  end

  

  task :'tasks' => :'setup:tasks'

  desc "Print info about currently selected project"
  task :'project' => :'setup:project' do
    Rake::Stx::Configuration::Printer.new().visit(project())
  end

  desc "Print project packages in topological order"
  task :'packages' => 'setup:project' do    
    puts "project #{project.name} consists of:"
    project.packages_and_application.each do | pkg |
      puts "  #{pkg.name}"
      puts "    req'd prereqs: #{pkg.prereqs(mandatory: true).join(', ')}"
      puts "    ref'd prereqs: #{pkg.prereqs(referenced: true).join(', ')}"
    end    
  end
  
  desc "List all available projects"
  task :'projects' => :'setup:projects'  do   
    puts ""
    puts "Available projects:"
    names = projects().values().collect { | prj | String(prj.name) }
    names.sort!
    names.each do | nm |
      puts " - #{nm}"
    end         
    puts
    puts "PROJECT_DIR = \"projects:#{File.join(ENV['HOME'], '.smalltalk' , 'rakefiles' , 'projects')}:#{PROJECT_DIRS}\""
    puts
  end
  
end