public void ParseAndApply(FileFilter result, Stream inputFilterFile, Dictionary <string, Action <FileFilter> > customDirectives) { var isSlashed = false; Action init = () => { isSlashed = false; }; Func <char, bool> splitter = c => { if (c == '\\') { isSlashed = true; return(false); } if (c == ' ' && !isSlashed) { return(true); } isSlashed = false; return(false); }; using (var reader = new StreamReader(inputFilterFile)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); if (line.TrimStart().StartsWith("#") || line.Trim() == "") { continue; } var mode = line.Split(splitter, 2).ToStringArray()[0]; switch (mode) { case "include": result.ApplyInclude(line.Init(init).Split(splitter, 2).ToStringArray()[1]); break; case "exclude": result.ApplyExclude(line.Init(init).Split(splitter, 2).ToStringArray()[1]); break; case "rewrite": result.ApplyRewrite(line.Init(init).Split(splitter, 3).ToStringArray()[1], line.Split(splitter, 3).ToStringArray()[2]); break; default: if (customDirectives.ContainsKey(mode)) { customDirectives[mode](result); } break; } } } return; }
public int ExecuteForTemplate(Execution execution) { if (!Directory.Exists(execution.PackageSourceFolder)) { throw new InvalidOperationException("The source folder " + execution.PackageSourceFolder + " does not exist."); } RedirectableConsole.WriteLine("Starting package creation for " + execution.PackagePlatform); var filter = new FileFilter(_getRecursiveUtilitiesInPath.GetRecursiveFilesInPath(execution.PackageSourceFolder)); if (execution.PackageFilterFile != null) { using (var reader = new StreamReader(execution.PackageFilterFile)) { var contents = reader.ReadToEnd(); contents = contents.Replace("%PLATFORM%", execution.PackagePlatform); using (var inputStream = new MemoryStream(Encoding.ASCII.GetBytes(contents))) { this.m_FileFilterParser.ParseAndApply(filter, inputStream, new Dictionary <string, Action <FileFilter> >()); } } } else { filter.ApplyInclude("^.*$"); filter.ApplyExclude("^\\.git/.*$"); filter.ApplyExclude("^\\.hg/.*$"); filter.ApplyExclude("^\\.svn/.*$"); } if (File.Exists(execution.PackageDestinationFile)) { RedirectableConsole.WriteLine("The destination file " + execution.PackageDestinationFile + " already exists; it will be overwritten."); File.Delete(execution.PackageDestinationFile); } filter.ImplyDirectories(); var filterDictionary = filter.ToDictionary(k => k.Key, v => v.Value); if (!filter.ContainsTargetPath("Build/")) { RedirectableConsole.WriteLine("ERROR: The Build directory does not exist in the source folder."); if (execution.PackageFilterFile != null) { this.PrintFilterMappings(filter); } return(1); } if (!filter.ContainsTargetPath("Build/Projects/")) { RedirectableConsole.WriteLine("ERROR: The Build\\Projects directory does not exist in the source folder."); if (execution.PackageFilterFile != null) { this.PrintFilterMappings(filter); } return(1); } if (!filter.ContainsTargetPath("Build/Module.xml")) { RedirectableConsole.WriteLine("ERROR: The Build\\Module.xml file does not exist in the source folder."); if (execution.PackageFilterFile != null) { this.PrintFilterMappings(filter); } return(1); } if (filter.ContainsTargetPath("Protobuild.exe")) { RedirectableConsole.WriteLine("ERROR: The Protobuild.exe file should not be included in the package file."); if (execution.PackageFilterFile != null) { this.PrintFilterMappings(filter); } return(1); } using (var target = new FileStream(execution.PackageDestinationFile, FileMode.CreateNew, FileAccess.Write, FileShare.None)) { _packageCreator.Create( target, filter, execution.PackageSourceFolder, execution.PackageFormat, execution.PackagePlatform, execution.PackageDestinationFile); } RedirectableConsole.WriteLine("\rPackage written to " + execution.PackageDestinationFile + " successfully."); return(0); }