[xbuild] Add 'OverrideReadOnlyFiles' property to Copy task.
[mono.git] / mcs / class / Microsoft.Build.Tasks / Microsoft.Build.Tasks / Copy.cs
index a090e4716d46179eac1ac836c997a2500907297e..8c28c2ae27b5a9c8a8dcfec93da8975974c9b151 100644 (file)
@@ -42,6 +42,7 @@ namespace Microsoft.Build.Tasks {
                ITaskItem       destinationFolder;
                bool            skipUnchangedFiles;
                ITaskItem[]     sourceFiles;
+               bool            overwriteReadOnlyFiles;
                
                public Copy ()
                {
@@ -164,6 +165,17 @@ namespace Microsoft.Build.Tasks {
                        }
                }
 
+#if NET_3_5 || NET_4_0
+               public bool OverwriteReadOnlyFiles {
+                       get {
+                               return overwriteReadOnlyFiles;
+                       }
+                       set {
+                               overwriteReadOnlyFiles = value;
+                       }
+               }
+#endif
+
                [Required]
                public ITaskItem[] SourceFiles {
                        get {
@@ -189,9 +201,18 @@ namespace Microsoft.Build.Tasks {
                {
                        if (create_dir)
                                CreateDirectoryIfRequired (Path.GetDirectoryName (dest));
+                       if (overwriteReadOnlyFiles)
+                               ClearReadOnlyAttribute (dest);
                        Log.LogMessage ("Copying file from '{0}' to '{1}'", source, dest);
                        if (String.Compare (source, dest) != 0)
                                File.Copy (source, dest, true);
+                       ClearReadOnlyAttribute (dest);
+               }
+
+               void ClearReadOnlyAttribute (string name)
+               {
+                       if (File.Exists (name) && ((File.GetAttributes (name) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly))
+                               File.SetAttributes (name, FileAttributes.Normal);
                }
 
                bool HasFileChanged (string source, string dest)
@@ -203,7 +224,7 @@ namespace Microsoft.Build.Tasks {
                        FileInfo destinationInfo = new FileInfo (dest);
 
                        return !(sourceInfo.Length == destinationInfo.Length &&
-                                       File.GetLastWriteTime(source) <= File.GetLastWriteTime (dest));
+                                       File.GetLastWriteTime (source) <= File.GetLastWriteTime (dest));
                }
 
        }