tmail/amstd/futils.rb
#
# futils.rb
#
#   Copyright (c) 1999 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
#
require 'amstd/fileutils'
module FileUtils
  include FileTest
  extend FileTest
  module_function
  @verbose = false
  @futils_output = $stderr
  def futilsmsg( msg )
    @futils_output ||= $stderr
    @futils_output.puts 'futils: ' + msg
  end
  private_class_method :futilsmsg
  FU = FileUtilities
  def cd( dn )
    if iterator? then
      pre = Dir.pwd
      Dir.chdir dn
      yield
      Dir.chdir pre
    else
      Dir.chdir dn
    end
  end
  alias chdir cd
  def indir( dir, *args )
    args.flatten!
    args.collect do |fn|
      %r(\A[/\\]) === fn ? fn : FU.join(dir, fn)
    end
  end
  def isdir( *args )
    args.flatten!
    dn = FU.join( *args )
    mkdir_p dn
    dn
  end
  def mustdir( dn )
    full = File.expand_path( dn )
    unless directory? full then
      raise ArgumentError, "#{dn} is not directory"
    end
    full
  end
  def pwd
    Dir.pwd
  end
  def expand( fn )
    File.expand_path fn
  end
  def dirname( fn )
    File.dirname fn
  end
  def basename( fn )
    File.basename fn
  end
  def fjoin( *args )
    FU.join( args )
  end
  alias sepjoin fjoin
  def is_newer?( new, *old )
    old.flatten!
    old.each do |fn|
      return false unless FU.is_newer? new, fn
    end
    true
  end
  alias uptodate? is_newer?
  def is_older?( old, *new )
    new.flatten!
    new.each do |fn|
      return false unless FU.is_older? old, fn
    end
    true
  end
  def mkdir( *args )
    args.flatten!
    futilsmsg "mkdir #{args.join ' '}" if @verbose
    args.each do |i|
      Dir.mkdir File.expand_path(i)
    end
  end
  def mkdir_p( *args )
    args.flatten!
    futilsmsg "mkdir -p #{args.join ' '}" if @verbose
    args.each do |i|
      FU.mkdir_p File.expand_path(i)
    end
  end
  alias mkpath mkdir_p
  def rmdir( *args )
    args.flatten!
    futilsmsg "rmdir -p #{args.join ' '}" if @verbose
    args.each do |i|
      Dir.rmdir File.expand_path(i)
    end
  end
  def ln( old, new )
    futilsmsg "ln #{old} #{new}" if @verbose
    FU.ln File.expand_path(old), File.expand_path(new)
  end
  def ln_s( old, new )
    futilsmsg "ln -s #{old} #{new}" if @verbose
    FU.ln_s File.expand_path(old), File.expand_path(new)
  end
  BSIZE = FU::BSIZE
  def cp( *args )
    args.flatten!
    to = args.pop
    futilsmsg "cp #{args.join ' '} #{to}" if @verbose
    to = File.expand_path( to )
    args.each do |i|
      FU.cp File.expand_path(i), to
    end
  end
  def cp_r( from, to )
    futilsmsg "cp -r #{from} #{to}" if @verbose
    FU.cp_r File.expand_path(from), File.expand_path(to)
  end
  def mv( *args )
    args.flatten!
    to = args.pop
    futilsmsg "mv #{args.join ' '} #{to}" if @verbose
    to = File.expand_path( to )
    args.each do |i|
      FU.mv File.expand_path(i), to
    end
  end
  def rm( *args )
    args.flatten!
    futilsmsg "rm #{args.join ' '}" if @verbose
    args.each do |i|
      FU.rm File.expand_path(i)
    end
  end
  def rm_f( *args )
    args.flatten!
    futilsmsg "rm -f #{args.join ' '}" if @verbose
    args.each do |i|
      FU.rm_f File.expand_path(i)
    end
  end
  def rm_rf( *args )
    args.flatten!
    futilsmsg "rm -rf #{args.join ' '}" if @verbose
    args.each do |i|
      FU.rm_rf File.expand_path(i)
    end
  end
  def cmp( a, b )
    futilsmsg "cmp #{a} #{b}" if @verbose
    FU.cmp a, b
  end
  alias identical? cmp
  def install( from, to, mode = nil )
    futilsmsg "install #{mode ? '%o ' % mode : ''}#{from} #{to}" if @verbose
    FU.install from, to, mode
  end
  def foreach_fullpath( dn )
    d = Dir.open( dn )
    dirs = d.to_a
    d.close
    dirs.each do |fn|
      next if fn == '.' or fn == '..'
      yield FU.join(dn, fn)
    end
  end
  def chmod( mode, *args )
    args.flatten!
    futilsmsg "chmod #{mode ? '%o ' % mode : ''}#{args.join ' '}" if @verbose
    File.chmod mode, *args
  end
  Separator = FU::Separator
  def command( line )
    unless ret = system( line ) then
      raise ArgumentError, "'system #{line}' failed"
    end
    ret
  end
end