FileUtils writing to stderr

Hi there,

I’m having a few issues with FileUtils writing stuff to stderr when no
error has occurred. For example I might have the following simple
Rakefile:

require ‘rake’
task :clean do
rm_rf ‘test’
end

When I run

rake clean 2> err

In the err file I see:

‘rm -rf test’

I would expect this to be sent to stdout rather than err.

The problem that I have is that I am trying to detect a rake failure
from within ant. Rake doesn’t seem to return the correct error code so I
was testing for failure by detecting if anything was written to stderr.
My ant task would thus look something like this:

This works fine except when I try to use the FileUtils methods. rm_rf
causes it to fail as does mkdir_p.

Any suggestions?
Cheers,
Mark.

On Jan 24, 2011, at 5:25, “Mark L.” [email protected] wrote:

Hi there,

I’m having a few issues with FileUtils writing stuff to stderr when no error has
occurred. For example I might have the following simple
Rakefile:

require ‘rake’
task :clean do
rm_rf ‘test’
end

Note that rake’s rm_rf is not exactly FileUtils’ rm_rf

When I run

rake clean 2> err

In the err file I see:

‘rm -rf test’

I would expect this to be sent to stdout rather than err.

Why? I expect informational messages on stderr. This way rake’s messages
don’t interfere with a rake user’s output. By having rake’s messages on
stderr a rake task author can write tasks that can be piped to other
commands.

rake email | sendmail # for example

(Yes, rake currently outputs a message on stdout. I have fixed that in
trunk.)

The problem that I have is that I am trying to detect a rake failure from within
ant. Rake doesn’t seem to return the correct error code so I was testing for
failure by detecting if anything was written to stderr.

You should query $?, not stderr. Rake should be behaving like a standard
unix command.

Any suggestions?

AFAIK rm -rf and mkdir -p always exit 0.

What is your rake task that exits 0 improperly?

On Jan 24, 2011, at 09:32, Eric H. wrote:

I would expect this to be sent to stdout rather than err.

Any suggestions?

AFAIK rm -rf and mkdir -p always exit 0.

My mistake, these can exit 1.

I suppose the question then is “what does rm -f mean for rake’s exit
status?”

If I’m writing a clean task that uses rm -f I suppose I’m saying it’s OK
for clean to not delete some things.

Hi Eric,

I see your point. I should be able to check the return code for errors.
This would make the ant task even simpler as I would just have to set
the ‘failonerror’ flag.

I guess my question above was trying to find another way of doing this
because initially the return code was returning 0 when I was not
expecting it.

After reading your comments I’ve gone back to look at the code to see if
I could pinpoint where it was going wrong (you’ll have to forgive me -
I’m new to ruby and am modifying a script written by someone else)

I traced the problem to a ‘system’ command. We are using a javascript
closure compiler to minify some javascript. It would fail if there was a
syntax error in the javascript - but the rake script would exit
normally. The original piece of code looked like:

system #{JAVA_CMD} -jar #{JS_ROOT}/lib/compiler.jar --js=#{src} --js_output_file=#{dst}

and then the rake script carried on as normal. I then tried to capture
the $? of the command and raise an exception if it was non-zero.
Unfortunately, as it stands the above command always returns a non-zero
response. I eventually figured out that it was the back-ticks that was
causing the issue and so my final solution was to do this:

system("#{JAVA_CMD} -jar #{JS_ROOT}/lib/compiler.jar --js=#{src}
–js_output_file=#{dst}")

Raise an exception if the compiler fails

if( !$?.success? )
raise “Closure Compiler failed to compile javascript”
end

and this finally seemed to resolve my problem.

Thanks for the response,
Mark.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs