Module: Rulebow::ShellUtils

Defined in:
lib/rulebow/shellutils.rb

Overview

File system utility methods.

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(s, *a, &b) ⇒ Object

If FileUtils responds to a missing method, then call it.



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/rulebow/shellutils.rb', line 71

def method_missing(s, *a, &b)
  if FileUtils.respond_to?(s)
    if $DRYRUN
      FileUtils::DryRun.__send__(s, *a, &b)
    else
      FileUtils::Verbose.__send__(s, *a, &b)
    end
  else
    super(s, *a, &b)
  end
end

Instance Method Details

#directory?(path) ⇒ Boolean

Returns:



28
29
30
# File 'lib/rulebow/shellutils.rb', line 28

def directory?(path)
  File.directory?(path)
end

#sh(*args) ⇒ Object

Shell out via system call.

Parameters:

  • args

    Argument vector. [Array]

Returns:

  • success of shell invocation.



14
15
16
17
18
# File 'lib/rulebow/shellutils.rb', line 14

def sh(*args)
  env = (Hash === args.last ? args.pop : {})
  puts args.join(' ')
  system(env, *args)
end

#shell(*args) ⇒ Object Also known as: run

Same as ‘#sh` but raises an error if shell fails.



21
22
23
24
# File 'lib/rulebow/shellutils.rb', line 21

def shell(*args)
  success = sh(*args)
  raise "shell failure: #{args.join(' ')}" unless success
end

#sync(src, dst, options = {}) ⇒ Object

TODO:

Augment FileUtils instead.

TODO:

Not every action needs to be verbose.

Synchronize a destination directory with a source directory.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rulebow/shellutils.rb', line 37

def sync(src, dst, options={})
  src_files = Dir[File.join(src, '**', '*')].map{ |f| f.sub(src+'/', '') }
  dst_files = Dir[File.join(dst, '**', '*')].map{ |f| f.sub(dst+'/', '') }

  removal = dst_files - src_files

  rm_dirs, rm_files = [], []
  removal.each do |f|
    path = File.join(dst, f)
    if File.directory?(path)
      rm_dirs << path
    else
      rm_files << path
    end
  end

  rm_files.each { |f| rm(f) }
  rm_dirs.each  { |d| rmdir(d) }

  src_files.each do |f|
    src_path = File.join(src, f)
    dst_path = File.join(dst, f)
    if File.directory?(src_path)
      mkdir_p(dst_path)
    else
      parent = File.dirname(dst_path) 
      mkdir_p(parent) unless File.directory?(parent)
      install(src_path, dst_path)
    end
  end
end