Merge branch 'master' of github.com:mono/mono
[mono.git] / mcs / class / Microsoft.Build.Tasks / Microsoft.Build.Tasks / Touch.cs
1 //
2 // Touch.cs: Creates a new file.
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 //
7 // (C) 2005 Marek Sieradzki
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 #if NET_2_0
29
30 using System;
31 using System.Collections;
32 using System.Collections.Generic;
33 using System.IO;
34 using Microsoft.Build.Framework;
35 using Microsoft.Build.Utilities;
36
37 namespace Microsoft.Build.Tasks {
38         public class Touch : TaskExtension {
39                 bool            alwaysCreate;
40                 ITaskItem[]     files;
41                 bool            forceTouch;
42                 DateTime        time;
43                 ITaskItem[]     touchedFiles;
44         
45                 public Touch ()
46                 {
47                         time = DateTime.Now;
48                 }
49
50                 public override bool Execute ()
51                 {
52                         if (files.Length == 0)
53                                 return true;
54
55                         bool returnBoolean = true;
56                         List <ITaskItem> successfulFiles = new List <ITaskItem> ();
57                         Stream stream = null;
58                         
59                         foreach (ITaskItem file in files) {
60                                 string fullname = file.GetMetadata ("FullPath");
61                                 try {
62                                         if (File.Exists (file.ItemSpec)) {
63                                                 if ((File.GetAttributes (fullname) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) {
64                                                         if (forceTouch) {
65                                                                 File.SetLastAccessTime (fullname, time);
66                                                                 File.SetLastWriteTime (fullname, time);
67                                                                 successfulFiles.Add (file);
68                                                         }
69                                                 } else {
70                                                         File.SetLastAccessTime (fullname, time);
71                                                         File.SetLastWriteTime (fullname, time);
72                                                         successfulFiles.Add (file);
73                                                 }
74                                         } else if (alwaysCreate == true) {
75                                                 stream = File.Create (fullname);
76                                                 stream.Close ();
77                                                 File.SetLastAccessTime (fullname, time);
78                                                 File.SetLastWriteTime (fullname, time);
79                                                 successfulFiles.Add (file);
80                                         } else {
81                                                 continue;
82                                         }
83
84                                         touchedFiles = successfulFiles.ToArray ();
85                                 }
86                                 catch (Exception ex) {
87                                         Log.LogErrorFromException (ex);
88                                         returnBoolean = false;
89                                 }
90                         }
91                         return returnBoolean;
92                 }
93
94                 public bool AlwaysCreate {
95                         get {
96                                 return alwaysCreate;
97                         }
98                         set {
99                                 alwaysCreate = value;
100                         }
101                 }
102
103                 [Required]
104                 public ITaskItem[] Files {
105                         get {
106                                 return files;
107                         }
108                         set {
109                                 files = value;
110                         }
111                 }
112
113                 public bool ForceTouch {
114                         get {
115                                 return forceTouch;
116                         }
117                         set {
118                                 forceTouch = value;
119                         }
120                 }
121
122                 public string Time {
123                         get {
124                                 return time.ToString ();
125                         }
126                         set {
127                                 time = DateTime.Parse (value);
128                         }
129                 }
130
131                 [Output]
132                 public ITaskItem[] TouchedFiles {
133                         get {
134                                 return touchedFiles;
135                         }
136                         set {
137                                 touchedFiles = value;
138                         }
139                 }
140         }
141 }
142
143 #endif