How can I prevent Gradle's stdout intervention?

I want to convert my special-purpose Bash unit testing script to Groovy, and I want to use Gradle’s excellent wrapper system to eliminate the need for users to install Groovy. I can do everything I want, except that when I invoke Groovy from my Gradle build script, Gradle writes an extra space character after each backspace character that I write. This works perfectly when invoked directly with Groovy:

class Hg {

public static doit() {

println ‘Doing it’

for (i in 1…10) {

print ‘-’

System.out.flush()

Thread.sleep(1000)

print ‘\b+’

System.out.flush()

Thread.sleep(1000)

}

println()

} }

Hg.doit()</code.

If you can’t tell by the code, it prints a line of hypens, and as each test succeeds, it backspaces and changes the - to a +, so that when it’s finished the screen shows: ++++++++++

I have tried the following things, and none have any effect: * use System.out directly instead of prints * use Gradle’s --no-color switch * write the \b separately, with flush after it * coerce the \b to a character (in case something’s converting it into a String

Resolved

Use System.console().writer() to do all prints, printlns, and flushes.

Tested successfully from MSYS Bash shell and Windows CMD shell.

Also verified working on OSX 10.7.2.

Two things worth noting:

  1. System.console() currently returns null if you are running gradle with the “–daemon” flag as daemon processes in java do not have a console. The gradle team has stated that this will be addressed in the 1.0 release time frame.

  2. System.console() is a java 6 feature. If you or your users are running older versions, this solution would not work.

Thanks. Re. your #1, I see that it’s also incompatible… along with many other Gradle capabilities… with the --gui switch.

Constraints happen to be marginally acceptable for my current need. Hopefully won’t have people who need a Gui running my unit tests, and it’s ok to require Java6 for these folk. Would be a different situation if this was for a general audience. My test runner works as good and fast (and looks as good) as it did in Bash.