Skip to content

Commit f09bc77

Browse files
committed
Consider generated and resources directories for cache invalidation
1 parent 7ac2141 commit f09bc77

File tree

21 files changed

+245
-23
lines changed

21 files changed

+245
-23
lines changed

cli/ballerina-cli/src/main/java/io/ballerina/cli/cmd/CommandUtil.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,11 @@
106106
import static io.ballerina.projects.util.ProjectConstants.DEPENDENCIES_TOML;
107107
import static io.ballerina.projects.util.ProjectConstants.DEPENDENCY_GRAPH_JSON;
108108
import static io.ballerina.projects.util.ProjectConstants.EXEC_BACKUP_DIR_NAME;
109+
import static io.ballerina.projects.util.ProjectConstants.GENERATED_MODULES_ROOT;
109110
import static io.ballerina.projects.util.ProjectConstants.LIB_DIR;
110111
import static io.ballerina.projects.util.ProjectConstants.MODULES_ROOT;
111112
import static io.ballerina.projects.util.ProjectConstants.PACKAGE_JSON;
113+
import static io.ballerina.projects.util.ProjectConstants.RESOURCE_DIR_NAME;
112114
import static io.ballerina.projects.util.ProjectConstants.SETTINGS_FILE_NAME;
113115
import static io.ballerina.projects.util.ProjectConstants.TEST_DIR_NAME;
114116
import static io.ballerina.projects.util.ProjectConstants.TOOL_DIR;
@@ -1331,13 +1333,35 @@ public static boolean isFilesModifiedSinceLastBuild(BuildJson buildJson, Project
13311333
boolean skipExecutable) throws IOException {
13321334
List<File> srcFilesToEvaluate = getSrcFiles(project);
13331335
List<File> testSrcFilesToEvaluate = getTestSrcFiles(project);
1334-
if (isProjectFilesModified(buildJson.getSrcMetaInfo(), srcFilesToEvaluate, project)) {
1336+
1337+
if (isProjectFilesModified(buildJson.getSrcMetaInfo(), srcFilesToEvaluate)) {
1338+
return true;
1339+
}
1340+
if (isTestExecution && isProjectFilesModified(buildJson.getTestSrcMetaInfo(), testSrcFilesToEvaluate)) {
13351341
return true;
13361342
}
1337-
if (isTestExecution && isProjectFilesModified(buildJson.getTestSrcMetaInfo(), testSrcFilesToEvaluate,
1338-
project)) {
1343+
Path resourcesPath = project.sourceRoot().resolve(RESOURCE_DIR_NAME);
1344+
if (Files.exists(resourcesPath)) {
1345+
List<File> filesInResourcesDir = getFilesInDir(resourcesPath);
1346+
if (isProjectFilesModified(buildJson.getResourcesMetaInfo(), filesInResourcesDir)) {
1347+
return true;
1348+
}
1349+
} else if (buildJson.getResourcesMetaInfo() != null) {
1350+
// resources/ directory existed in the previous build but not in the current build.
13391351
return true;
13401352
}
1353+
1354+
Path generatedPath = project.sourceRoot().resolve(GENERATED_MODULES_ROOT);
1355+
if (Files.exists(generatedPath)) {
1356+
List<File> filesInGeneratedDir = getFilesInDir(generatedPath);
1357+
if (isProjectFilesModified(buildJson.getGeneratedMetaInfo(), filesInGeneratedDir)) {
1358+
return true;
1359+
}
1360+
} else if (buildJson.getGeneratedMetaInfo() != null) {
1361+
// generated/ directory existed in the previous build but not in the current build.
1362+
return true;
1363+
}
1364+
13411365
if (isSettingsFileModified(buildJson)) {
13421366
return true;
13431367
}
@@ -1357,6 +1381,15 @@ public static boolean isFilesModifiedSinceLastBuild(BuildJson buildJson, Project
13571381
return isExecutableModified(buildJson, project);
13581382
}
13591383

1384+
public static List<File> getFilesInDir(Path dirPath) throws IOException {
1385+
try (var paths = Files.walk(dirPath)) {
1386+
return paths
1387+
.filter(Files::isRegularFile)
1388+
.map(Path::toFile)
1389+
.toList();
1390+
}
1391+
}
1392+
13601393
public static DependencyGraph<BuildProject> resolveWorkspaceDependencies(
13611394
WorkspaceProject workspaceProject, PrintStream outStream) {
13621395
outStream.println("Resolving workspace dependencies");
@@ -1373,7 +1406,7 @@ public static DependencyGraph<BuildProject> resolveWorkspaceDependencies(
13731406

13741407
private static boolean isTomlFileModified(BuildJson.FileMetaInfo tomlFileMetaInfo, File tomlFile) {
13751408
if (tomlFileMetaInfo == null) {
1376-
// No Cloud.toml in the project
1409+
// No metadata exists for this TOML file (file was not tracked in the previous build)
13771410
return tomlFile.exists();
13781411
}
13791412
try {
@@ -1440,9 +1473,10 @@ private static boolean isTestArtifactsModified(BuildJson buildJson, Project proj
14401473
return false;
14411474
}
14421475

1443-
private static boolean isProjectFilesModified(BuildJson.FileMetaInfo[] fileMetaInfos, List<File> filesToEvaluate,
1444-
Project project) {
1445-
if (fileMetaInfos == null || filesToEvaluate.size() != fileMetaInfos.length) {
1476+
private static boolean isProjectFilesModified(BuildJson.FileMetaInfo[] fileMetaInfos, List<File> filesToEvaluate) {
1477+
if (fileMetaInfos == null) {
1478+
return !filesToEvaluate.isEmpty();
1479+
} else if (filesToEvaluate.size() != fileMetaInfos.length) {
14461480
return true;
14471481
}
14481482
for (BuildJson.FileMetaInfo fileMetaInfo : fileMetaInfos) {

cli/ballerina-cli/src/main/java/io/ballerina/cli/task/CreateFingerprintTask.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import static io.ballerina.cli.cmd.CommandUtil.getSHA256Digest;
4040
import static io.ballerina.projects.util.ProjectConstants.BUILD_FILE;
4141
import static io.ballerina.projects.util.ProjectConstants.EXEC_BACKUP_DIR_NAME;
42+
import static io.ballerina.projects.util.ProjectConstants.GENERATED_MODULES_ROOT;
43+
import static io.ballerina.projects.util.ProjectConstants.RESOURCE_DIR_NAME;
4244
import static io.ballerina.projects.util.ProjectUtils.readBuildJson;
4345

4446

@@ -72,6 +74,7 @@ public void execute(Project project) {
7274
}
7375
}
7476

77+
7578
private void createFingerPrintForBallerinaToml(BuildJson buildJson, Project project) throws
7679
IOException, NoSuchAlgorithmException {
7780
File ballerinaTomlFile = project.sourceRoot().resolve(ProjectConstants.BALLERINA_TOML).toFile();
@@ -105,6 +108,29 @@ private static void createFingerPrintForProjectFiles(Project project, BuildJson
105108
}
106109
buildJson.setTestSrcMetaInfo(testSrcMetaInfoList.toArray(new BuildJson.FileMetaInfo[0]));
107110
}
111+
List<BuildJson.FileMetaInfo> resourcesMetaInfoList = new ArrayList<>();
112+
Path resourcesPath = project.sourceRoot().resolve(RESOURCE_DIR_NAME);
113+
if (Files.exists(resourcesPath)) {
114+
List<File> filesInDir = CommandUtil.getFilesInDir(resourcesPath);
115+
if (!filesInDir.isEmpty()) {
116+
for (File file : filesInDir) {
117+
resourcesMetaInfoList.add(getFileMetaInfo(file));
118+
}
119+
buildJson.setResourcesMetaInfo(resourcesMetaInfoList.toArray(new BuildJson.FileMetaInfo[0]));
120+
}
121+
}
122+
123+
List<BuildJson.FileMetaInfo> generatedMetaInfoList = new ArrayList<>();
124+
Path generatedDirPath = project.sourceRoot().resolve(GENERATED_MODULES_ROOT);
125+
if (Files.exists(generatedDirPath)) {
126+
List<File> filesInDir = CommandUtil.getFilesInDir(generatedDirPath);
127+
if (!filesInDir.isEmpty()) {
128+
for (File file : filesInDir) {
129+
generatedMetaInfoList.add(getFileMetaInfo(file));
130+
}
131+
buildJson.setGeneratedMetaInfo(generatedMetaInfoList.toArray(new BuildJson.FileMetaInfo[0]));
132+
}
133+
}
108134
}
109135

110136
private static void createFingerPrintForSettingsToml(BuildJson buildJson) throws IOException,
@@ -147,13 +173,16 @@ private static void createFingerPrintForArtifacts(Project project, BuildJson bui
147173
}
148174
}
149175

150-
private static BuildJson.FileMetaInfo getFileMetaInfo(File execFile) throws IOException, NoSuchAlgorithmException {
151-
BuildJson.FileMetaInfo execMetaInfo = new BuildJson.FileMetaInfo();
152-
execMetaInfo.setFile(execFile.getAbsolutePath());
153-
execMetaInfo.setLastModifiedTime(Files.getLastModifiedTime(execFile.toPath()).toMillis());
154-
execMetaInfo.setSize(Files.size(execFile.toPath()));
155-
execMetaInfo.setHash(getSHA256Digest(execFile));
156-
return execMetaInfo;
176+
private static BuildJson.FileMetaInfo getFileMetaInfo(File file) throws IOException, NoSuchAlgorithmException {
177+
BuildJson.FileMetaInfo fileMetaInfo = new BuildJson.FileMetaInfo();
178+
fileMetaInfo.setFile(file.getAbsolutePath());
179+
fileMetaInfo.setLastModifiedTime(Files.getLastModifiedTime(file.toPath()).toMillis());
180+
fileMetaInfo.setSize(Files.size(file.toPath()));
181+
if (file.isDirectory()) {
182+
return fileMetaInfo;
183+
}
184+
fileMetaInfo.setHash(getSHA256Digest(file));
185+
return fileMetaInfo;
157186
}
158187

159188
private static void writeBuildFile(Path buildFilePath, BuildJson buildJson) {

0 commit comments

Comments
 (0)