# Retry / redo question

**URL:** <https://www.ruby-forum.com/t/retry-redo-question/86845>\
**Category:** Ruby\
**Created:** [February 26, 2007, 1:41pm UTC](https://www.ruby-forum.com/t/retry-redo-question/86845 "2007-02-26T13:41:38Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 26, 2007, 1:41pm UTC](https://www.ruby-forum.com/t/retry-redo-question/86845/1 "2007-02-26T13:41:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 26, 2007, 4:05pm UTC](https://www.ruby-forum.com/t/retry-redo-question/86845/2 "2007-02-26T16:05:56Z")

</div>

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/](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

---

<div class="post-metadata">

**Author:** ![RebhanS\_Gilbert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/7feea3/32.png) [@RebhanS\_Gilbert](https://www.ruby-forum.com/u/RebhanS_Gilbert)\
**Post date:** [February 26, 2007, 4:20pm UTC](https://www.ruby-forum.com/t/retry-redo-question/86845/3 "2007-02-26T16:20:00Z")

</div>

Hi,

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

First, I’d start with using [http://raa.ruby-lang.org/project/ruby-cvs/](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
