Blocks question

J

Jon Leighton

Hi,

I have written a script which sets up a new website on a server.
Obviously this involves a number of steps so I have written a method
which looks like so:

def step(msg)
print msg + "... "
yield
puts "done"
end

The idea being that you write something like:

step("Creating site directory") { [mkdir code here }

This all works fine, except for one thing. I would like the "Creating
site directory..." to show up *before* the yield takes place, and then
the "done" would appear afterwards. Currently the whole "Creating site
directory... done" appears only after the yield has completed, which
might make the user think something has gone wrong with longer steps. I
don't understand why this happens, can anyone explain my options please?

Thanks very much

Jon
 
M

Matthew Smillie

Hi,

I have written a script which sets up a new website on a server.
Obviously this involves a number of steps so I have written a method
which looks like so:

def step(msg)
print msg + "... "
yield
puts "done"
end

The idea being that you write something like:

step("Creating site directory") { [mkdir code here }

This all works fine, except for one thing. I would like the "Creating
site directory..." to show up *before* the yield takes place, and then
the "done" would appear afterwards. Currently the whole "Creating site
directory... done" appears only after the yield has completed, which
might make the user think something has gone wrong with longer
steps. I
don't understand why this happens, can anyone explain my options
please?

I can't reproduce this on my machine, but it sounds very much like
it's being caused by buffered output. This might work:

def step(msg)
print msg + "..."
STDOUT.flush
yield
puts "done"
end

matthew smillie.
 
J

Jon Leighton

Matthew said:
I can't reproduce this on my machine, but it sounds very much like
it's being caused by buffered output. This might work:

def step(msg)
print msg + "..."
STDOUT.flush
yield
puts "done"
end

Thanks, that works a treat. Now, another related question. Part of the
process involves checking the code out from Subversion. As Subversion
checks out, it writes lines to STDOUT saying what it is downloading. I
would like this to be outputted by by script in real time, rather than
when the whole command has finished running. Currently I am using a
method like this:

def command(command)
open("|#{command}", "r") do |f|
f.each do |line|
puts line
STDOUT.flush
end
end
end

However, that doesn't seem to work. The output still only comes when the
command has fully completed. Any ideas of what I can do?

Thanks!
 
J

Jan Svitok

If you don't need to capture the svn output, try Kernel#system. Svn
will write directly to STDOUT.

If you do need to capture, then 1. I don't know ;-) 2. it'd depend on
whether you're on windows or unix

J.
 
J

Jon Leighton

Jan said:
If you don't need to capture the svn output, try Kernel#system. Svn
will write directly to STDOUT.

If you do need to capture, then 1. I don't know ;-) 2. it'd depend on
whether you're on windows or unix

I went with the Kernel#system option which worked well. Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,209
Messages
2,571,088
Members
47,684
Latest member
sparada

Latest Threads

Top