Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
FileEnumerationBuildStep.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using System.ComponentModel;
6 using System.IO;
7 using System.Linq;
8 using System.Threading.Tasks;
9 
10 namespace SiliconStudio.BuildEngine
11 {
12  [Description("File enumeration")]
13  [Obsolete("This class is not maintained.")]
15  {
16  public BuildStep Template { get { return template; } set { template = value; if (template != null) template.Parent = this; } }
17  private BuildStep template;
18 
19  public List<string> SearchPattern { get; set; }
20 
21  public List<string> ExcludePattern { get; set; }
22 
23  public IEnumerable<string> Files { get; protected set; }
24 
26  {
27  SearchPattern = new List<string>();
28  ExcludePattern = new List<string>();
29  Files = Enumerable.Empty<string>();
30  }
31 
32  /// <inheritdoc/>
33  public override string ToString()
34  {
35  lock (Files)
36  {
37  return "File enumeration" + (Files.FirstOrDefault() != null ? " (" + Files.Count() + " files)" : "");
38  }
39  }
40 
41  /// <inheritdoc/>
42  public override BuildStep Clone()
43  {
44  var clone = new FileEnumerationBuildStep();
45  if (template != null)
46  clone.Template = template.Clone();
47  clone.SearchPattern = SearchPattern.ToList();
48  clone.ExcludePattern = ExcludePattern.ToList();
49  return clone;
50  }
51 
52  public override async Task<ResultStatus> Execute(IExecuteContext executeContext, BuilderContext builderContext)
53  {
54  Steps = new List<BuildStep>();
55  var files = Enumerable.Empty<string>();
56 
57  foreach (string pattern in SearchPattern)
58  {
59  string path = Path.GetDirectoryName(pattern);
60  string filePattern = Path.GetFileName(pattern);
61  if (!string.IsNullOrEmpty(path) && !string.IsNullOrEmpty(filePattern))
62  {
63  files = files.Concat(Directory.EnumerateFiles(path, filePattern));
64  }
65  else
66  {
67  files = files.Concat(Directory.EnumerateFiles(pattern));
68  }
69  }
70 
71  var excludes = Enumerable.Empty<string>();
72 
73  foreach (string pattern in ExcludePattern)
74  {
75  string path = Path.GetDirectoryName(pattern);
76  string filePattern = Path.GetFileName(pattern);
77  if (!string.IsNullOrEmpty(path) && !string.IsNullOrEmpty(filePattern))
78  {
79  excludes = excludes.Concat(Directory.EnumerateFiles(path, filePattern));
80  }
81  else
82  {
83  excludes = excludes.Concat(Directory.EnumerateFiles(pattern));
84  }
85  }
86 
87  var buildStepToWait = new List<BuildStep>();
88 
89  lock (Files)
90  {
91  Files = files.Where(x => !excludes.Contains(x));
92  foreach (string file in Files)
93  {
94  executeContext.Variables["FILE"] = file;
95  var fileBuildStep = Template.Clone();
96  ((List<BuildStep>)Steps).Add(fileBuildStep);
97  buildStepToWait.Add(fileBuildStep);
98  executeContext.ScheduleBuildStep(fileBuildStep);
99  }
100  }
101 
102  await CompleteCommands(executeContext, buildStepToWait);
103 
104  return ResultStatus.Successful;
105  }
106  }
107 }
A BuildStep that can spawn multiple BuildStep. Input and output tracking and merging will be performe...
override async Task< ResultStatus > Execute(IExecuteContext executeContext, BuilderContext builderContext)
Execute the BuildStep, usually resulting in scheduling tasks in the scheduler
override BuildStep Clone()
Clone this Build Step.