Path: blob/trunk/rake_tasks/crazy_fun/mappings/tasks.rb
2868 views
module CrazyFun1module Mappings2class Tasks3include FileCopyHack45def task_name(dir, name)6return name if name.to_s.start_with? "//"78# Strip any leading ".", "./" or ".\\"9# I am ashamed10use = dir.gsub(/\\/, '/').sub(/^\./, '').sub(/^\//, '')1112"//#{use}:#{name}"13end1415def output_name(dir, name, suffix)16t = task_name(dir, name)17result = "build/" + (t.slice(2 ... t.length)) + "." + suffix18result.gsub(":", "/")19end2021def add_dependencies(target, dir, all_deps)22return if all_deps.nil?2324Array(all_deps).each do |dep|25target.enhance(dep_type(dir, dep))26end27end2829def copy_resources(dir, to_copy, out_dir)30to_copy.each do |res|31if res.is_a? Symbol32out = Rake::Task[task_name(dir, res)].out33elsif Rake::Task.task_defined?(res)34task = Rake::Task[res]35out = task.out36while out.nil? && task.prerequisites.size == 1 do37task = Rake::Task[task.prerequisites[0]]38out = task.out39end40elsif res.is_a? Hash41# Copy the key to "out_dir + value"42res.each do |from, to|43possible_task = task_name(dir, from)44if Rake::Task.task_defined?(possible_task) and Rake::Task[possible_task].out45target = Rake::Task[possible_task].out4647if File.directory? target48dest = File.join(out_dir, to)49mkdir_p dest50cp_r target, dest51else52dest = File.join(out_dir, to)53mkdir_p File.dirname(dest)54cp_r target, dest, remove_destination: true55end56else57tdir = to.gsub(/\/.*?$/, "")58mkdir_p "#{out_dir}/#{tdir}"59src = find_file(File.join(dir, from))6061if File.directory? src62mkdir_p "#{out_dir}/#{to}"63else64mkdir_p File.join(out_dir, File.dirname(to))65end66cp_r src, "#{out_dir}/#{to}"67end68end6970next71else72if File.exists? res73out = res74else75out = File.join(dir, res)76return copy_all(dir, to_copy, out_dir) unless File.exists?(out)77end78end7980if out.is_a? Array81out.each { |o| cp_r o, out_dir }82else83cp_r out, out_dir84end85end86end8788def zip(src, dest)89out = SeleniumRake::Checks.path_for(File.expand_path(dest))90Dir.chdir(src) {91# TODO(jari): something very weird going on here on windows92# the 2>&1 is needed for some reason93ok = system(%{jar cMf "#{out}" * 2>&1})94ok or raise "could not zip #{src} => #{dest}"95}96end9798private99100def find_file(file)101puts "Copying #{file}" if $DEBUG102103if Rake::Task.task_defined?(file) && Rake::Task[file].out104# Grab the "out" of the task represented by this symbol105file = Rake::Task[file].out.to_s106end107108if File.exist?(file)109file110elsif File.exist?("build/#{file}")111"build/#{file}"112else113fl = FileList.new(file).existing!114return fl unless fl.empty?115116fl = FileList.new("build/#{file}").existing!117return fl unless fl.empty?118119puts "Unable to locate #{file}"120exit -1121end122end123124def copy_string(dir, src, dest)125if Rake::Task.task_defined? src126from = Rake::Task[src].out127else128from = to_filelist(dir, src)129end130131cp_r from, to_dir(dest), :remove_destination => true132end133134def copy_symbol(dir, src, dest)135from = Rake::Task[task_name(dir, src)].out136137if File.directory? from138cp_r from, to_dir(dest)139else140mkdir_p File.dirname(dest)141cp from, dest142end143end144145def copy_array(dir, src, dest)146src.each do |item|147if item.is_a? Hash148copy_hash(dir, item, dest)149elsif item.is_a? Array150# TODO: Is this correct here? Shouldn't we do +copy_array+ (Luke - Sep 2019')151raise StandardError, "Undetermined type: #{item.class}"152elsif item.is_a? String153copy_string(dir, item, dest)154elsif item.is_a? Symbol155copy_symbol(dir, item, dest)156else157raise StandardError, "Undetermined type: #{item.class}"158end159end160end161162def copy_hash(dir, src, dest)163src.each do |key, value|164if key.is_a? Symbol165copy_symbol dir, key, SeleniumRake::Checks.path_for(File.join(dest, value))166else167from, to = File.join(dir, key), File.join(dest, value)168cp_r from, to169end170end171end172173def copy_all(dir, srcs, dest)174if srcs.is_a? Array175copy_array(dir, srcs, dest)176elsif srcs.is_a? String177copy_string(dir, srcs, dest)178elsif srcs.is_a? Hash179copy_hash(dir, srcs, dest)180elsif srcs.is_a? Symbol181copy_symbol(dir, srcs, dest)182else183raise StandardError, "Undetermined type: #{srcs.class}"184end185end186187def to_dir(name)188mkdir_p name unless File.exists?(name)189name190end191192def dep_type(dir, dep)193if dep.is_a? String194if dep.start_with?("//")195return [dep]196else197return to_filelist(dir, dep)198end199end200201return [task_name(dir, dep)] if dep.is_a? Symbol202203if dep.is_a? Hash204all_deps = []205dep.each do |k, v|206# We only care about the keys207all_deps += dep_type(dir, k)208end209return all_deps210end211212raise "Unmatched dependency type: #{dep.class}"213end214215def to_filelist(dir, src)216str = dir + "/" + src217FileList[str].collect do |file|218SeleniumRake::Checks.path_for(file)219end220end221222def halt_on_error?223[nil, 'true'].include?(ENV['haltonerror']) &&224[nil, 'true'].include?(ENV['haltonfailure'])225end226227def halt_on_failure?228halt_on_error?229end230end231end232end233234235