cake icon indicating copy to clipboard operation
cake copied to clipboard

CleanDirectory does not clean readonly files.

Open frozenskys opened this issue 7 years ago • 12 comments

What You Are Seeing?

Trying to run CleanDirectory() on a folder that has had some readonly files copied into it using CopyFiles() The issue is that CleanDirectory() fails with access denied on the read only files.

What is Expected?

CleanDirectory() deletes the files even if they are readonly.

What version of Cake are you using?

0.16.2

Are you running on a 32 or 64 bit system?

x64

What environment are you running on? Windows? Linux? Mac?

Windows

Are you running on a CI Server? If so, which one?

N\A

How Did You Get This To Happen? (Steps to Reproduce)

Add some readonly xsd files to ./Documents/Schemas/ and run the following cake file twice...

Task("Default")
    .Does(() =>
    {
            var schemaFolder = Argument("schemaFolder", "./artifacts/schemas");
            EnsureDirectoryExists(schemaFolder);
            CleanDirectory(schemaFolder);
            var files = GetFiles("./Documents/Schemas/*.xsd");
            CopyFiles(files, schemaFolder);
        });

RunTarget("Default");

Output Log

First Run

Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Compiling build script...

========================================
Default
========================================
Executing task: Default
Creating directory C:/Source/Main/artifacts/schemas
Cleaning directory C:/Source/Main/artifacts/schemas
Copying file main.xsd to C:/Source/Main/artifacts/schemas/main.xsd
Copying file sub.xsd to C:/Source/Main/artifacts/schemas/sub.xsd
Finished executing task: Default

Task                          Duration            
--------------------------------------------------
Default                       00:00:00.1268127    
--------------------------------------------------
Total:                        00:00:00.1268127   

Second Run

Preparing to run build script...
Running build script...
Analyzing build script...
Processing build script...
Compiling build script...

========================================
Default
========================================
Executing task: Default
Cleaning directory C:/Source/Main/artifacts/schemas

An Error occured when executing task 'default'.
Error: Access to the path 'C:/Source/Main/artifacts/schemas/main.xsd' is denied.

frozenskys avatar Oct 25 '16 12:10 frozenskys

Not sure if it should be modified to do this... Surely it would be better if you want this behavior to iterate over the files/dirs first and remove the readonly attribute?

nrjohnstone avatar Oct 26 '16 06:10 nrjohnstone

This is the defaullt behavior in .NET when deleteing files. One option could be to add an overload that has an force option so it's explicit intent to change this default behavior.

Meanwhile resetting attributes can be done thru

FilePath filePath = MakeAbsolute(File("./readonly.txt"));
System.IO.File.SetAttributes(filePath.FullPath, FileAttributes.Normal);

or

FilePath filePath = MakeAbsolute(File("./readonly.txt"));
var fileInfo = new System.IO.FileInfo(filePath.FullPath);
//thru IsReadOnly property
fileInfo.IsReadOnly = false;
// alternatively thru Attributes property
fileInfo.Attributes = FileAttributes.Normal;

devlead avatar Oct 26 '16 07:10 devlead

@nrjohnstone I agree, however CleanDirectory to me implies forcing a delete - maybe a small change to the docs to describe the behavior would help?

@devlead I'm not sure I'm keen on the overload idea as you'd probably end up overloading all the current methods, but I agree it's a bad idea to change the default behavior

Maybe a new alias something like

SetFileAttribute(FilePath, ​FileAttributes)​
SetFileAttribute(string, ​FileAttributes)​
SetFileAttribute(IEnumerable<string>, ​FileAttributes)​
SetFileAttribute(IEnumerable<FilePath>, ​FileAttributes)​

would be more flexible ?

frozenskys avatar Oct 26 '16 07:10 frozenskys

+1

I'm trying to make my builds idempotent and when cloning a repo from git, often the .git directory contains read only files which causes DeleteDirectory or CleanDirectory to fail.

What about adding a Force boolean argument (defaulted to false) to Clean/Delete Directory? I'd be happy to contribute.

WrathZA avatar Nov 23 '16 09:11 WrathZA

@devlead @WrathZA @nrjohnstone I have some time in the next week or so to work on this if we can decide the approach and still feel it's worth doing...

frozenskys avatar Nov 23 '16 10:11 frozenskys

this would be indeed most useful to clean up a git folder. I would expect it as default behavior.

mcvavalanche avatar Apr 06 '17 09:04 mcvavalanche

Hi, this is the same for files in TFS. I'm trying to copy around some files to include in my build artifact but my clean is failing due to readonly files stopping a delete / clean.

dave600b avatar Jul 17 '17 19:07 dave600b

I ran into this in the context of cleaning up a git folder as well.

Instead of adding overloads to CleanDirectory, does it make sense to add a method like SetFileAttributes(globbingPattern, FileAttributes) to a package like Cake.FileHelpers or similar?

nbarbettini avatar Jul 17 '17 21:07 nbarbettini

One of the main reasons we're using a build script is to pull down git repositories.

This feature would be useful, I'm currently using the System.IO features to remove the git cloned folder.

benwinding avatar Aug 21 '17 05:08 benwinding

Related to #1564

Now that #1574 is merged, IFile will support changing file attributes in v0.22. This means we could have a overload which has a force option (just like we did with DeleteDirectory in #1574)

bjorkstromm avatar Aug 21 '17 06:08 bjorkstromm

I'd like to take a crack at this if nobody else has started it.

definesfineout avatar Oct 01 '21 15:10 definesfineout

How are you getting on with this @definesfineout ? I'm happy to take over if you won't be able to complete it.

FrankRay78 avatar Sep 30 '22 12:09 FrankRay78

I have now opened PR #4077 that fully addresses this issue - please review if you get a chance.

I will work to address any matters up until this change is successfully merged.

I note this issue was opened Oct 25, 2016 which is a long time between drinks, but equally I hope it was worth the wait 😊

FrankRay78 avatar Nov 22 '22 14:11 FrankRay78

Awesome. Thanks @FrankRay78 !

augustoproiete avatar Nov 22 '22 15:11 augustoproiete

:tada: This issue has been resolved in version v3.1.0 :tada:

The release is available on:

Your GitReleaseManager bot :package::rocket:

cake-build-bot avatar Jul 09 '23 20:07 cake-build-bot