From: Robert Klemme Date: 2007-02-27T00:05:06+09:00 Subject: Re: retry / redo question On 26.02.2007 13:40, Rebhan, Gilbert wrote: > 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<<'.'<<'/'< > 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<<'.'<<'/'< > 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<<'.'<<'/'< > while updfiles.length > 0 > addfiles=Array.new > addpipe=IO.popen("#{CVSEXE} -d #{CVSROOT} add #{updfiles.to_s}") > addpipe.readlines.each { |x| > addfiles<<'.'<<'/'< updfiles.clear > addfiles.clear > updpipe.readlines.each { |x| > updfiles<<'.'<<'/'< end > *retry* > > but got : > > 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