// NAnt - A .NET build tool
// Copyright (C) 2001 Gerry Shaw
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Gerry Shaw (gerry_shaw@yahoo.com)
namespace SourceForge.NAnt {
using System;
using System.Collections.Specialized;
using System.IO;
public class FileSet {
///
/// Used to determine if a file has a more recent last write time then the specified write time.
///
/// A collection of filenames to check last write times against.
/// The datetime to compare against.
/// True if at least one file in fileNames has a last write time greater than targetLastWriteTime.
public static bool MoreRecentLastWriteTime(StringCollection fileNames, DateTime targetLastWriteTime) {
foreach (string fileName in fileNames) {
FileInfo fileInfo = new FileInfo(fileName);
if (!fileInfo.Exists) {
return true;
}
if (fileInfo.LastWriteTime > targetLastWriteTime) {
return true;
}
}
return false;
}
// We can't just use the DirectoryScanner's includes/excludes collections
// because when we do a Scan() we need to first expand any macros.
StringCollection _includes = new StringCollection();
StringCollection _excludes = new StringCollection();
DirectoryScanner _scanner = null;
string _baseDirectory;
bool _includeAllByDefault;
Task _task = null;
public FileSet(bool includeAllByDefault) {
IncludeAllByDefault = includeAllByDefault;
Excludes.Add("**/CVS/*");
Excludes.Add("**/.cvsignore");
}
///
/// Will be automagically set in Task.AutoInitializeAttributes() if
/// file set has TaskFileSetAttribute set on it.
///
// TODO: change this to IMacroExpander
public Task Task {
get { return _task; }
set { _task = value; }
}
public string BaseDirectory {
get { return _baseDirectory; }
set { _baseDirectory = value; }
}
/// Determines if scan should produce everything or nothing
/// if there are no Includes set. Default false.
public bool IncludeAllByDefault {
get { return _includeAllByDefault; }
set { _includeAllByDefault = value; }
}
public StringCollection Includes {
get { return _includes; }
}
public StringCollection Excludes {
get { return _excludes; }
}
public void Scan() {
// get project (only for expanding macros)
Project expander = Task.Project;
_scanner = new DirectoryScanner();
_scanner.BaseDirectory = expander.GetFullPath(BaseDirectory);;
foreach (string path in Includes) {
_scanner.Includes.Add(expander.ExpandText(path));
}
if (Includes.Count <= 0 && IncludeAllByDefault) {
_scanner.Includes.Add("**");
}
foreach (string path in Excludes) {
_scanner.Excludes.Add(expander.ExpandText(path));
}
_scanner.Scan();
}
public StringCollection DirectoryNames {
get {
if (_scanner == null) {
Scan();
}
return _scanner.DirectoryNames;
}
}
public StringCollection FileNames {
get {
if (_scanner == null) {
Scan();
}
return _scanner.FileNames;
}
}
}
}