Module: MJ::Tools::SubProcess::ClassMethods

Defined in:
lib/mj/tools/subprocess.rb

Instance Method Summary collapse

Instance Method Details

#adjust_environment(wd = nil, env = nil, lang = "C") ⇒ Object

Helper method to adjust LANG to “C”



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/mj/tools/subprocess.rb', line 50

def adjust_environment( wd=nil, env=nil, lang="C" )
    begin
        # Go to the working directory if given
        if wd
            cwd = Dir.getwd
            Dir.chdir(wd) if not $noop
            logger.debug( "Changed working directory from #{cwd} to #{wd}" )
        end

        # Set the environment the user wants
        oldenv = Hash.new
        if env
            env.each do |var, value|
                oldenv[var] = ENV[var]
                if value.nil? or value == ""
                    next if ENV.has_key?( value )
                    ENV[var] = nil
                    logger.verbose  "Removing #{var} from environment"
                else
                    logger.verbose  "#{var} = #{value}"
                    ENV[var] = value
                end
            end
        end
        # Save old LANG setting and switch to 'C'
        oldlang = ENV['LANG']
        ENV['LANG'] = lang
        yield
        # Reset the old LANG setting
        ENV['LANG'] = oldlang
        # Reset our changes to ENV
        oldenv.each do |var, value|
            ENV[var] = value
        end

    ensure
        # Reset the current working directory
        if wd
            logger.debug( "Changed working directory back to #{cwd}" )
            Dir.chdir(cwd) if not $noop
        end

    end

end

#execute(command, wd = ENV["HOME"], env = nil) ⇒ Object

Executes command

Executes the given command and yields each line of output. Returns $? .



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/mj/tools/subprocess.rb', line 15

def execute( command, wd = ENV["HOME"], env = nil )
    logger.trace "(#{wd}) > #{command} 2>&1"
    if !$noop
        adjust_environment( wd, env ) {
            IO.popen( "#{command} 2>&1" ) {
                |f|
                begin
                    while
                        line = f.readline
                        if block_given?
                            yield line.chomp
                        else
                            logger.verbose line.chomp
                        end
                    end
                rescue EOFError
                    # Expected. Do nothing
                end
            }
            if $?.coredump? or $?.signaled?
                raise CoreDumpError, "Command '#{command}' core dumped because of signal #{$?.termsig}!"
            end
            logger.trace "= #{$?.exitstatus}"
            return $?.exitstatus
        }
    else
        adjust_environment( wd, env ) {
            logger.trace "= 0 # noop" 
        }
        return 0
    end

end