List<AffectedModule> (@Nullable Map<String, Map<String, BuildTargetState>> currentModulesState, @NotNull Map<String, Map<String, BuildTargetState>> commitModulesState, boolean checkExistance) { long start = System.currentTimeMillis(); List<AffectedModule> affectedModules = new ArrayList<>(); Map<String, String> oldModulesMap = new HashMap<>(); myOldModulesPaths = new ArrayList<>(); if (currentModulesState == null) { commitModulesState.forEach((type, map) -> { map.forEach((name, state) -> { affectedModules.add(new AffectedModule(type, name, state.getHash(), getBuildDirRelativeFile(state.getRelativePath()))); }); }); LOG.warn("Project doesn't contain metadata, force to download " + affectedModules.size() + " modules."); List<AffectedModule> result = mergeAffectedModules(affectedModules, commitModulesState); long total = System.currentTimeMillis() - start; LOG.info("Compilation output affected for the " + result.size() + " modules. Computation took " + total + "ms"); return result; } // Add new build types Set<String> newBuildTypes = new HashSet<>(commitModulesState.keySet()); newBuildTypes.removeAll(currentModulesState.keySet()); newBuildTypes.forEach(type -> { commitModulesState.get(type).forEach((name, state) -> { affectedModules.add(new AffectedModule(type, name, state.getHash(), getBuildDirRelativeFile(state.getRelativePath()))); }); }); // Calculate old paths for remove Set<String> oldBuildTypes = new HashSet<>(currentModulesState.keySet()); oldBuildTypes.removeAll(commitModulesState.keySet()); oldBuildTypes.forEach(type -> { currentModulesState.get(type).forEach((name, state) -> { oldModulesMap.put(name, state.getRelativePath()); }); }); commitModulesState.forEach((type, map) -> { Map<String, BuildTargetState> currentTypeState = currentModulesState.get(type); // New build type already added above if (currentTypeState == null) return; // Add new build modules Set<String> newBuildModules = new HashSet<>(map.keySet()); newBuildModules.removeAll(currentTypeState.keySet()); newBuildModules.forEach(name -> { BuildTargetState state = map.get(name); affectedModules.add(new AffectedModule(type, name, state.getHash(), getBuildDirRelativeFile(state.getRelativePath()))); }); // Calculate old modules paths for remove Set<String> oldBuildModules = new HashSet<>(currentTypeState.keySet()); oldBuildModules.removeAll(map.keySet()); oldBuildModules.forEach(name -> { BuildTargetState state = currentTypeState.get(name); oldModulesMap.put(name, state.getRelativePath()); }); // In another case compare modules inside the same build type map.forEach((name, state) -> { BuildTargetState currentTargetState = currentTypeState.get(name); if (currentTargetState == null || !state.equals(currentTargetState)) { affectedModules.add(new AffectedModule(type, name, state.getHash(), getBuildDirRelativeFile(state.getRelativePath()))); return; } File outFile = getBuildDirRelativeFile(state.getRelativePath()); if (checkExistance && (!outFile.exists() || ArrayUtil.isEmpty(outFile.listFiles()))) { affectedModules.add(new AffectedModule(type, name, state.getHash(), outFile)); } }); }); // Check that old modules not exist in other build types myOldModulesPaths = oldModulesMap.entrySet().stream().filter(entry -> { for (Map.Entry<String, Map<String, BuildTargetState>> commitEntry : commitModulesState.entrySet()) { BuildTargetState targetState = commitEntry.getValue().get(entry.getKey()); if (targetState != null && targetState.getRelativePath().equals(entry.getValue())) return false; } return true; }).map(entry -> getBuildDirRelativeFile(entry.getValue())) .collect(Collectors.toList()); List<AffectedModule> result = mergeAffectedModules(affectedModules, commitModulesState); long total = System.currentTimeMillis() - start; LOG.info("Compilation output affected for the " + result.size() + " modules. Computation took " + total + "ms"); return result; }