internal static IEnumerable<FileEntry> ProcessIncludes(FileList thisInstance, dynamic rule, string name, string includePropertyName, IEnumerable<Rule> fileRules, string root) { var fileEntries = Enumerable.Empty<FileEntry>(); var property = rule[includePropertyName]; if( property != null ) { foreach (string include in property.Values ) { // first check to see if the include is another file list if (fileRules.GetRulesByParameter(include).Any()) { // there is one? Great. Add that to the list of our files var inheritedList = GetFileList(include, fileRules); if (inheritedList == null) { AutopackageMessages.Invoke.Error( MessageCode.DependentFileListUnavailable, rule.SourceLocation, "File list '{0}' depends on file list '{1}' which is not availible.", name, include); continue; } if (inheritedList == thisInstance) { // already complained about circular reference. continue; } fileEntries = fileEntries.Union(inheritedList.FileEntries.Select(each => new FileEntry(each))); continue; } // it's not a reference include. lets see if we can pick up some files with it. var foundFiles = root.FindFilesSmarter(include).ToArray(); if (!foundFiles.Any()) { AutopackageMessages.Invoke.Warning( MessageCode.IncludeFileReferenceMatchesZeroFiles, rule.include.SourceLocation, "File include reference '{0}' matches zero files in path '{1}'", include, root); } fileEntries = fileEntries.Union(foundFiles.Select(each => new FileEntry(each, root.GetSubPath(each)))); } } return fileEntries; }
private static IEnumerable<FileEntry> ProcessExcludes(IEnumerable<FileEntry> fileEntries, FileList thisInstance, dynamic rule, string name, IEnumerable<Rule> fileRules, string root) { var excludes = rule.exclude.Values; foreach (string exclude in excludes) { // first check to see if the exclude is another file list if (fileRules.GetRulesByParameter(exclude).Any()) { var excludedList = GetFileList(exclude, fileRules); if (excludedList == null) { AutopackageMessages.Invoke.Error( MessageCode.DependentFileListUnavailable, rule.SourceLocation, "File list '{0}' depends on file list '{1}' which is not availible.", name, exclude); continue; } if (excludedList == thisInstance) { // already complained about circular reference. continue; } // get just the file names var excludedFilePaths = excludedList.FileEntries.Select(each => each.SourcePath); // remove any files in our list that are in the list we're given fileEntries = fileEntries.Where(fileEntry => !excludedFilePaths.Contains(fileEntry.SourcePath)); continue; } // otherwise, see if the the exclude string is a match for anything in the fileset. fileEntries = fileEntries.Where(each => !each.SourcePath.NewIsWildcardMatch(exclude, true, root)); } return fileEntries; }
public static FileList GetFileList(string name, IEnumerable<Rule> fileRules) { var result = FileLists.Where(each => each.Name == name).FirstOrDefault(); if( result != null && !result._isReady) { // circular reference AutopackageMessages.Invoke.Error(MessageCode.CircularFileReference, result._rule.SourceLocation, "Circular file reference. '{0}' has a file include reference that includes itself.", name); return result; } var rules = fileRules.GetRulesByParameter(name); switch( rules.Count()) { case 0: AutopackageMessages.Invoke.Error(MessageCode.UnknownFileList, null, "Unknown file list '{0}'.", name); return null; case 1: // just right break; default: if (!AutopackageMain.Override) { AutopackageMessages.Invoke.Error( MessageCode.MultipleFileLists, fileRules.First().SourceLocation, "Multiple file lists with name '{0}'.", name); return null; } AutopackageMessages.Invoke.Warning(MessageCode.MultipleFileLists, fileRules.First().SourceLocation, "Multiple file lists with name '{0}', using last specified one.", name); break; } return new FileList(name, rules.First(), fileRules); }