Alternatively, if you think there is a concurrency problem with the multiple delete tasks, you could just have a single delete task that runs over a fileset that matches the directories you need. If you use NAnt with a pattern match you might not even need to check for their existence first.
Cheers, - Sam. On Sat, Jan 24, 2009 at 12:18 AM, Sam Calder <[email protected]>wrote: > I wonder if you have something else accessing the files at the same time... > it could even be something entirely outside the build process, like a virus > scanner, windows Search doing an index, etc? Sysinternals tools are good for > seeing which process has a handle on a file/dir, although if it is a rare & > intermittent problem you'll probably never catch it! > > If its a reproducible timing issue, you might try including the NAnt > <sleep> task... exponential backoff over your loop might make it a bit more > reliable, even if it occasionally takes significantly longer? > > Is it possible there's some kind of temporary read-only file in there? the > <delete> task will fail if it hits one of those. You can use <attrib> to > make files writeable just before deleting. > > Don't know if any of those strategies will work, but its worth a try! > > Cheers, > > - Sam. > > > On Fri, Jan 23, 2009 at 8:51 AM, Scott Vickery <[email protected]>wrote: > >> I should really get the ant source and figure out what the problem is. >> Sounds like a timing hole? Maybe they are threading the delete? In lieu of >> that, here is my modified solution: >> >> <project name="prj"> >> <target name="cleanBuildDirs"> >> <exec program="cmd" commandline="/c rmdir ..\dir1 /s /q" >> if="${directory::exists('..\dir1')}"/> >> <exec program="cmd" commandline="/c rmdir ..\dir1 /s /q" >> if="${directory::exists('..\dir1')}"/> >> <!-- etc --> >> <delete file="..\file1"/> >> <!-- etc --> >> </target> >> </project> >> >> This seems to work fine. >> >> Scott >> >> >> On Fri, Jan 23, 2009 at 2:17 AM, Ruben Willems >> <[email protected]>wrote: >> >>> Hi >>> >>> >>> I have the same problem, but no solution yet >>> the problem is I can not reproduce it, it appearas now and than, but the >>> real cause... >>> >>> I was thinking in placing it inside a loop or so, >>> and try 3 times, when I got 3 errors , let the failure go through. >>> >>> lame solution, but I think it will work. >>> >>> >>> with kind regards >>> Ruben Willems >>> >>> >>> >>> Fri, Jan 23, 2009 at 5:30 AM, Scott Vickery <[email protected]>wrote: >>> >>>> Ok, I know this is not the NAnt mailing list, but, thought someone here >>>> might have seen this problem. I have an nant task set up something like >>>> this: >>>> <nant> >>>> <executable>C:\Program >>>> Files\nant-0.85\bin\NAnt.exe</executable> >>>> <baseDirectory>.\Build\</baseDirectory> >>>> <buildFile>someBuild.build</buildFile> >>>> <targetList> >>>> <target>cleanBuildDirs</target> >>>> </targetList> >>>> </nant> >>>> >>>> The ant build looks something like this: >>>> <project name="Online"> >>>> <target name="cleanBuildDirs"> >>>> <delete dir="..\dir1" if="${directory::exists('..\dir1')}"/> >>>> <delete dir="..\dir2" if="${directory::exists('..\dir2')}"/> >>>> <delete dir="..\dir3" if="${directory::exists('..\dir3')}"/> >>>> <delete dir="..\dir4" if="${directory::exists('..\dir4')}"/> >>>> <delete dir="..\dir5" if="${directory::exists('..\dir5')}"/> >>>> <delete dir="..\dir6" if="${directory::exists('..\dir6')}"/> >>>> <delete dir="..\dir7" if="${directory::exists('..\dir7')}"/> >>>> <delete dir="..\dir8" if="${directory::exists('..\dir8')}"/> >>>> <delete dir="..\dir9" if="${directory::exists('..\dir9')}"/> >>>> <delete file="..\Project.sln"/> >>>> </target> >>>> </project> >>>> >>>> Every now and then I get an error from ant complaining that "The >>>> directory is not empty". Here is part of the Nant stack trace: >>>> >>>> ber><columnnumber>10</columnnumber></location><stacktrace><![CDATA[ at >>>> NAnt.Co >>>> re.Tasks.DeleteTask.RecursiveDeleteDirectory(String path) >>>> at NAnt.Core.Tasks.DeleteTask.ExecuteTask() >>>> at NAnt.Core.Task.Execute() >>>> at NAnt.Core.Target.Execute() >>>> at NAnt.Core.Project.Execute(String targetName, Boolean >>>> forceDependencies) >>>> at NAnt.Core.Project.Execute() >>>> at >>>> NAnt.Core.Project.Run()]]></stacktrace><internalerror><type>System.IO.IOException</type><message><![CDATA[The >>>> directory is not empty. >>>> >>>> This causes my build to fail. But, more importantly, even if I ignored >>>> the error, the source is not getting deleted. Has anyone seen this and/or >>>> have any suggestions regarding fixing it? >>>> >>>> Thanks, >>>> Scott Vickery >>>> >>>> >>>> >>>> On Wed, Jan 21, 2009 at 9:27 PM, Scott Vickery <[email protected] >>>> > wrote: >>>> >>>>> Great. That is what I was looking for. >>>>> >>>>> Thanks, >>>>> Scott >>>>> >>>>> >>>>> On Wed, Jan 21, 2009 at 9:22 PM, Sam Calder >>>>> <[email protected]>wrote: >>>>> >>>>>> Better yet, use the NAnt 'if' attribute of the <delete> task with the >>>>>> 'directory::exists' function to check if the directory exists first... >>>>>> that >>>>>> way it won't error out at all. >>>>>> >>>>>> Syntax is something like: >>>>>> >>>>>> <delete dir="test" if="${directory::exists('test')}" /> >>>>>> >>>>>> Cheers, >>>>>> >>>>>> - Sam. >>>>>> >>>>>> >>>>>> >>>>>> On Wed, Jan 21, 2009 at 7:53 PM, Craig Sutherland < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> >>>>>>> Do the same thing but put the delete in an NAnt or MSBuild script - >>>>>>> this way you could get it to ignore any errors. >>>>>>> >>>>>>> The mailing list is moderated, hence will be a delay until someone >>>>>>> moderates the message. >>>>>>> >>>>>>> >>>>>>> Craig >>>>>>> >>>>>>> On Jan 22, 6:11 am, Scott <[email protected]> wrote: >>>>>>> > I have searched around for a solution to this, but, not found an >>>>>>> > answer yet. >>>>>>> > >>>>>>> > I want to do a clean build every time I build. According to this, >>>>>>> http://jira.public.thoughtworks.org/browse/CCNET-1256, >>>>>>> > <cleanCopy>True</cleanCopy> for <sourcecontrol type="svn"> is not >>>>>>> in a >>>>>>> > CC build yet. As a work around, I decided to do this: >>>>>>> > >>>>>>> > <prebuild> >>>>>>> > <exec> >>>>>>> > <executable>cmd</executable> >>>>>>> > <buildArgs>/c rmdir /s /q c:\buildFolder\code\trunk >>>>>>> > \projectFolder</buildArgs> >>>>>>> > </exec> >>>>>>> > </prebuild> >>>>>>> > >>>>>>> > This work fine if the folder exists. But, the first time the >>>>>>> project >>>>>>> > is built, before the code is checked out, the build fails with "The >>>>>>> > system cannot find the file specified." How can I get CC to ignore >>>>>>> > that error? >>>>>>> > >>>>>>> > Thanks, >>>>>>> > Scott Vickery >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >
