Example #1
0
        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;
        }
Example #2
0
        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;
        }
Example #3
0
        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);
        }