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

Reply via email to