mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63460 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
#!ruby
 | 
						|
 | 
						|
require_relative 'vpath'
 | 
						|
 | 
						|
class Checksum
 | 
						|
  def initialize(vpath)
 | 
						|
    @vpath = vpath
 | 
						|
  end
 | 
						|
 | 
						|
  attr_reader :source, :target
 | 
						|
 | 
						|
  def source=(source)
 | 
						|
    @source = source
 | 
						|
    @checksum = File.basename(source, ".*") + ".chksum"
 | 
						|
  end
 | 
						|
 | 
						|
  def target=(target)
 | 
						|
    @target = target
 | 
						|
  end
 | 
						|
 | 
						|
  def update?
 | 
						|
    src = @vpath.read(@source)
 | 
						|
    @len = src.length
 | 
						|
    @sum = src.sum
 | 
						|
    return false unless @vpath.search(File.method(:exist?), @target)
 | 
						|
    begin
 | 
						|
      data = @vpath.read(@checksum)
 | 
						|
    rescue
 | 
						|
      return false
 | 
						|
    else
 | 
						|
      return false unless data[/src="([0-9a-z_.-]+)",/, 1] == @source
 | 
						|
      return false unless @len == data[/\blen=(\d+)/, 1].to_i
 | 
						|
      return false unless @sum == data[/\bchecksum=(\d+)/, 1].to_i
 | 
						|
      return true
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def update!
 | 
						|
    open(@checksum, "wb") {|f|
 | 
						|
      f.puts("src=\"#{@source}\", len=#{@len}, checksum=#{@sum}")
 | 
						|
    }
 | 
						|
  end
 | 
						|
 | 
						|
  def update
 | 
						|
    return true if update?
 | 
						|
    update! if ret = yield(self)
 | 
						|
    ret
 | 
						|
  end
 | 
						|
 | 
						|
  def copy(name)
 | 
						|
    @vpath.open(name, "rb") {|f|
 | 
						|
      IO.copy_stream(f, name)
 | 
						|
    }
 | 
						|
    true
 | 
						|
  end
 | 
						|
 | 
						|
  def make(*args)
 | 
						|
    system(@make, *args)
 | 
						|
  end
 | 
						|
 | 
						|
  def def_options(opt = (require 'optparse'; OptionParser.new))
 | 
						|
    @vpath.def_options(opt)
 | 
						|
    opt.on("--make=PATH") {|v| @make = v}
 | 
						|
    opt
 | 
						|
  end
 | 
						|
 | 
						|
  def self.update(argv)
 | 
						|
    k = new(VPath.new)
 | 
						|
    k.source, k.target, *argv = k.def_options.parse(*argv)
 | 
						|
    k.update {|_| yield(_, *argv)}
 | 
						|
  end
 | 
						|
end
 |