123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- = Original Prototype Rake
- This is the original 100 line prototype rake program.
- ---
- #!/usr/bin/env ruby
- require 'ftools'
- class Task
- TASKS = Hash.new
- attr_reader :prerequisites
- def initialize(task_name)
- @name = task_name
- @prerequisites = []
- @actions = []
- end
- def enhance(deps=nil, &block)
- @prerequisites |= deps if deps
- @actions << block if block_given?
- self
- end
- def name
- @name.to_s
- end
- def invoke
- @prerequisites.each { |n| Task[n].invoke }
- execute if needed?
- end
- def execute
- return if @triggered
- @triggered = true
- @actions.collect { |act| result = act.call(self) }.last
- end
- def needed?
- true
- end
- def timestamp
- Time.now
- end
- class << self
- def [](task_name)
- TASKS[intern(task_name)] or fail "Don't know how to rake #{task_name}"
- end
- def define_task(args, &block)
- case args
- when Hash
- fail "Too Many Target Names: #{args.keys.join(' ')}" if args.size > 1
- fail "No Task Name Given" if args.size < 1
- task_name = args.keys[0]
- deps = args[task_name]
- else
- task_name = args
- deps = []
- end
- deps = deps.collect {|d| intern(d) }
- get(task_name).enhance(deps, &block)
- end
- def get(task_name)
- name = intern(task_name)
- TASKS[name] ||= self.new(name)
- end
- def intern(task_name)
- (Symbol === task_name) ? task_name : task_name.intern
- end
- end
- end
- class FileTask < Task
- def needed?
- return true unless File.exist?(name)
- latest_prereq = @prerequisites.collect{|n| Task[n].timestamp}.max
- return false if latest_prereq.nil?
- timestamp < latest_prereq
- end
- def timestamp
- File.new(name.to_s).mtime
- end
- end
- def task(args, &block)
- Task.define_task(args, &block)
- end
- def file(args, &block)
- FileTask.define_task(args, &block)
- end
- def sys(cmd)
- puts cmd
- system(cmd) or fail "Command Failed: [#{cmd}]"
- end
- def rake
- begin
- here = Dir.pwd
- while ! File.exist?("Rakefile")
- Dir.chdir("..")
- fail "No Rakefile found" if Dir.pwd == here
- here = Dir.pwd
- end
- puts "(in #{Dir.pwd})"
- load "./Rakefile"
- ARGV.push("default") if ARGV.size == 0
- ARGV.each { |task_name| Task[task_name].invoke }
- rescue Exception => ex
- puts "rake aborted ... #{ex.message}"
- puts ex.backtrace.find {|str| str =~ /Rakefile/ } || ""
- end
- end
- if __FILE__ == $0 then
- rake
- end
|