|
7 | 7 | import java.util.List; |
8 | 8 | import java.util.Set; |
9 | 9 | import java.util.regex.Pattern; |
| 10 | +import java.util.stream.Collectors; |
10 | 11 |
|
11 | 12 | import com.semmle.js.extractor.ExtractorConfig.HTMLHandling; |
12 | 13 | import com.semmle.js.extractor.ExtractorConfig.Platform; |
@@ -77,8 +78,8 @@ public class Main { |
77 | 78 | private PathMatcher includeMatcher, excludeMatcher; |
78 | 79 | private FileExtractor fileExtractor; |
79 | 80 | private ExtractorState extractorState; |
80 | | - private final Set<File> projectFiles = new LinkedHashSet<>(); |
81 | | - private final Set<File> files = new LinkedHashSet<>(); |
| 81 | + private Set<File> projectFiles = new LinkedHashSet<>(); |
| 82 | + private Set<File> files = new LinkedHashSet<>(); |
82 | 83 | private final Set<File> extractedFiles = new LinkedHashSet<>(); |
83 | 84 |
|
84 | 85 | /* used to detect cyclic directory hierarchies */ |
@@ -138,6 +139,16 @@ public void run(String[] args) { |
138 | 139 | if (containsTypeScriptFiles()) { |
139 | 140 | tsParser.verifyInstallation(!ap.has(P_QUIET)); |
140 | 141 | } |
| 142 | + |
| 143 | + // Sort files for determinism |
| 144 | + projectFiles = projectFiles.stream() |
| 145 | + .sorted(AutoBuild.FILE_ORDERING) |
| 146 | + .collect(Collectors.toCollection(() -> new LinkedHashSet<>())); |
| 147 | + |
| 148 | + files = files.stream() |
| 149 | + .sorted(AutoBuild.FILE_ORDERING) |
| 150 | + .collect(Collectors.toCollection(() -> new LinkedHashSet<>())); |
| 151 | + |
141 | 152 | for (File projectFile : projectFiles) { |
142 | 153 |
|
143 | 154 | long start = verboseLogStartTimer(ap, "Opening project " + projectFile); |
|
0 commit comments