Forum: Ruby retry / redo question

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rebhan, Gilbert (Guest)
on 2007-02-26 14:41
(Received via mailing list)
Hi,

i have a ruby script that does for 1 - n  folders a
cp_r of every folder to an existing cvs workspace
and afterwards the cvs operations
update to determine if add is needed
add if needed 1-n times
commit

As the cvs CLI lacks a recursive parameter for
the update / add  commands, means when a new file
like subfolder/subfile.txt comes in
the add command only recognizes subfolder, but the
subfile.txt only after a 2nd add command

 i have to do =

1. updpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} update")
     updpipe.readlines.each { |x|
       updfiles<<'.'<<'/'<<x[2..-2]<<' ' }

to determine whether there are new files to be added

if updfiles != 0 i have to execute the cvs add command =

2.addpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} add #{updfiles.to_s}")
   addpipe.readlines.each { |x|
   addfiles<<'.'<<'/'<<x[2..-2]<<' ' }

this add command gives me other folders or files that are also to be
added, if there are more to be added, i.e subfolders/subfiles ...

so i have to do the cvs add in a loop until nothing more comes
back from that cvs add command.

then i have to do a final commit =

3.system("#{CVSEXE}","-d","#{CVSROOT}","commit","-m","bla bla bla bla")


Now i'm looking for the best loop construct, i know
the addfiles array has to be cleared after every cvs add before
executing cvs add again

There is something like retry/redo i tried with retry after and before
the end of a while loop

updfiles=Array.new
updpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} update")
     updpipe.readlines.each { |x|
       updfiles<<'.'<<'/'<<x[2..-2]<<' ' }

while updfiles.length > 0
  addfiles=Array.new
  addpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} add #{updfiles.to_s}")
  addpipe.readlines.each { |x|
  addfiles<<'.'<<'/'<<x[2..-2]<<' ' }
updfiles.clear
addfiles.clear
  updpipe.readlines.each { |x|
  updfiles<<'.'<<'/'<<x[2..-2]<<' ' }
end
*retry*

but got :

retry outside of rescue clause (LocalJumpError)


What's the right loop ?
Is there a solution without retry / redo ?


Regards, Gilbert
Robert K. (Guest)
on 2007-02-26 17:05
(Received via mailing list)
On 26.02.2007 13:40, Rebhan, Gilbert wrote:
> the update / add  commands, means when a new file
> to determine whether there are new files to be added
> so i have to do the cvs add in a loop until nothing more comes
>
>   addpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} add #{updfiles.to_s}")
>
> retry outside of rescue clause (LocalJumpError)
>
>
> What's the right loop ?
> Is there a solution without retry / redo ?

If you want to use retry you need to do that in an rescue clause as the
error message indicates.

However, I think, you should rather change the logic.

First, I'd start with using http://raa.ruby-lang.org/project/ruby-cvs/
to make CVS accesses more efficient (you do not start a process for each
CVS command).

Then, if you do the recursive traversal through the file tree (probably
using Find.find) I'd add a non existing directory immediately whenever I
see it.  That way you can be sure that all directories on the path are
present in the repository before you add individual files.  HTH

Regards

  robert
Rebhan, Gilbert (Guest)
on 2007-02-26 17:20
(Received via mailing list)
Hi,


/*
However, I think, you should rather change the logic.

First, I'd start with using http://raa.ruby-lang.org/project/ruby-cvs/
to make CVS accesses more efficient (you do not start a process for each

CVS command).
*/

I already thought of that too, need to have a detailled look,
whether this library works also with cvsnt, which we use here
as cvs server for windows.

i.e. cvsnt stores it's passwords in the registry, not in
user.home/.cvspass
etc.

/*
Then, if you do the recursive traversal through the file tree (probably
using Find.find)
I'd add a non existing directory immediately whenever I
see it.  That way you can be sure that all directories on the path are
present in the repository before you add individual files.
*/

i thought of something similar and tried with :

newfiles=Dir["Y:/test_deploy/**/*.*"] - Dir["Y:/cvsworkspace/**/*.*"]

but that gives me the whole path, i.e.
Y:/test_deploy/subfolder7/subsub7/bla.txt, whereas i need it as space
separated list for :
cvs add ./subfolder7 ./subfolder7/subsub7 ./subfolder7/subsub7/bla.txt

Any idea how this could get a working solution ?!


Regards, Gilbert
This topic is locked and can not be replied to.