[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Blocks question

Jon Leighton

7/27/2006 8:47:00 AM

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

--
Posted via http://www.ruby-....

4 Answers

Matthew Smillie

7/27/2006 9:02:00 AM

0

On Jul 27, 2006, at 9:46, Jon Leighton wrote:

> 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.

Jon Leighton

7/27/2006 9:52:00 AM

0

Matthew Smillie wrote:
> On Jul 27, 2006, at 9:46, Jon Leighton wrote:
>
>> end
>> 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

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!

--
Posted via http://www.ruby-....

Jano Svitok

7/27/2006 12:11:00 PM

0

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.

On 7/27/06, Jon Leighton <turnip@turnipspatch.com> wrote:
> Matthew Smillie wrote:
> > On Jul 27, 2006, at 9:46, Jon Leighton wrote:
> >
> >> end
> >> 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
>
> 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!
>
> --
> Posted via http://www.ruby-....
>
>

Jon Leighton

7/28/2006 9:00:00 AM

0

Jan Svitok wrote:
> 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.

--
Posted via http://www.ruby-....