This is an automated email from the ASF dual-hosted git repository.
mgubaidullin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
The following commit(s) were added to refs/heads/main by this push:
new 6c0d545b Fixes for Karavan 4.22.1
6c0d545b is described below
commit 6c0d545b543322e49689adc003cd75852aef5b8c
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Sun Sep 27 13:40:46 2026 -0400
Fixes for Karavan 4.22.1
---
.../camel/karavan/api/ProjectGitResource.java | 2 +-
.../org/apache/camel/karavan/loader/GitLoader.java | 2 +-
.../apache/camel/karavan/service/GitService.java | 90 ++++++++++++----------
.../camel/karavan/service/ProjectService.java | 78 +++++++++++--------
4 files changed, 97 insertions(+), 75 deletions(-)
diff --git
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
index d7ca982d..3f5cdcab 100644
---
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
+++
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
@@ -63,7 +63,7 @@ public class ProjectGitResource extends AbstractApiResource {
@Path("/")
public Response pullAll() {
try {
- projectService.importProjects(true);
+ projectService.importProjects();
return Response.ok().build();
} catch (Exception e) {
LOGGER.error(e.getMessage());
diff --git
a/karavan-app/src/main/java/org/apache/camel/karavan/loader/GitLoader.java
b/karavan-app/src/main/java/org/apache/camel/karavan/loader/GitLoader.java
index f8f32a94..e681fc13 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/loader/GitLoader.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/loader/GitLoader.java
@@ -62,7 +62,7 @@ public class GitLoader {
boolean git = gitService.checkGit();
LOGGER.info("Starting Project service: git is " + (git ? "ready" :
"not ready"));
if (gitService.checkGit()) {
- projectService.importProjects(false);
+ projectService.importProjects();
if (Objects.equals(environment, DEV)) {
addKameletsProject();
addBuildInProject(ProjectFolder.Type.templates.name());
diff --git
a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
index c0f22c7e..74a578b5 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
@@ -51,6 +51,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
+import java.util.function.Function;
import java.util.regex.Pattern;
@ApplicationScoped
@@ -62,49 +63,32 @@ public class GitService {
@Inject
Vertx vertx;
- private Git gitForImport;
-
private static final Logger LOGGER =
Logger.getLogger(GitService.class.getName());
- public Git getGitForImport() {
- if (gitForImport == null) {
- try {
- gitForImport = getGit(true,
vertx.fileSystem().createTempDirectoryBlocking("import"));
- } catch (Exception e) {
- LOGGER.error("Error", e);
- }
- }
- return gitForImport;
- }
-
public Tuple3<RevCommit, List<RemoteRefUpdate.Status>, List<String>>
commitAndPushProject(ProjectFolder projectFolder, List<ProjectFile> files,
String message, String authorName, String authorEmail, List<String> fileNames)
throws GitAPIException, IOException, URISyntaxException {
LOGGER.info("Commit and push project " + projectFolder.getProjectId());
GitConfig gitConfig = gitServiceAuth.getGitConfig();
String uuid = UUID.randomUUID().toString();
String folder = vertx.fileSystem().createTempDirectoryBlocking(uuid);
LOGGER.info("Temp folder created " + folder);
- Git git = getGit(true, folder);
- writeProjectToFolder(folder, projectFolder, files);
- addDeletedFilesToIndex(git, folder, projectFolder, files);
- return commitAddedAndPush(git, gitConfig.branch(), message,
authorName, authorEmail, fileNames, projectFolder.getProjectId());
- }
-
- public List<PathCommitDetails> readProjectsToImport() {
- Git importGit = getGitForImport();
- if (importGit != null) {
- return readProjectsFromRepository(importGit);
+ Git git = null;
+ try {
+ git = getGit(true, folder);
+ writeProjectToFolder(folder, projectFolder, files);
+ addDeletedFilesToIndex(git, folder, projectFolder, files);
+ return commitAddedAndPush(git, gitConfig.branch(), message,
authorName, authorEmail, fileNames, projectFolder.getProjectId());
+ } finally {
+ closeAndDelete(git, folder);
}
- return new ArrayList<>(0);
}
- public List<PathCommitDetails> readProjectFromRepository(String projectId)
throws GitAPIException, IOException, URISyntaxException {
- Git git = getGit(true,
vertx.fileSystem().createTempDirectoryBlocking(UUID.randomUUID().toString()));
- return readProjectsFromRepository(git).stream().filter(d ->
Objects.equals(d.projectId(), projectId)).toList();
+ public List<PathCommitDetails> readAllProjectsFromRepository() {
+ return withFreshClone("allProject", List.of(),
this::readProjectsFromRepository);
}
- public List<PathCommitDetails> readAllProjectsFromRepository() throws
GitAPIException, IOException, URISyntaxException {
- Git git = getGit(true,
vertx.fileSystem().createTempDirectoryBlocking(UUID.randomUUID().toString()));
- return readProjectsFromRepository(git);
+ public List<PathCommitDetails> readProjectFromRepository(String projectId)
{
+ return withFreshClone("project", List.of(), git ->
readProjectsFromRepository(git).stream()
+ .filter(d -> Objects.equals(d.projectId(),
projectId)).toList());
}
public List<PathCommitDetails> getLastCommitForEachFile(Git git) throws
IOException, GitAPIException {
@@ -360,23 +344,51 @@ public class GitService {
GitConfig gitConfig = gitServiceAuth.getGitConfig();
String uuid = UUID.randomUUID().toString();
String folder = vertx.fileSystem().createTempDirectoryBlocking(uuid);
- try (Git git = clone(folder, gitConfig.repository(),
gitConfig.branch())) {
+ Git git = null;
+ try {
+ git = clone(folder, gitConfig.repository(), gitConfig.branch());
LOGGER.info("Git is ready");
+ return true;
+ } catch (Exception e) {
+ LOGGER.error("Error connecting git: " + (e.getCause() != null ?
e.getCause().getMessage() : e.getMessage()));
+ return false;
+ } finally {
+ closeAndDelete(git, folder);
+ }
+ }
+
+ private <T> T withFreshClone(String prefix, T fallback, Function<Git, T>
reader) {
+ String folder = vertx.fileSystem().createTempDirectoryBlocking(prefix);
+ Git git = null;
+ try {
+ git = getGit(true, folder);
+ return git != null ? reader.apply(git) : fallback;
} catch (Exception e) {
- LOGGER.info("Error connecting git: " + (e.getCause() != null ?
e.getCause().getMessage() : e.getMessage()));
+ LOGGER.error("Error", e);
+ return fallback;
+ } finally {
+ closeAndDelete(git, folder);
+ }
+ }
+
+ private void closeAndDelete(Git git, String folder) {
+ if (git != null) {
+ git.close(); // JGit holds
pack files open
+ }
+ try {
+ vertx.fileSystem().deleteRecursiveBlocking(folder);
+ } catch (Exception e) {
+ LOGGER.warn("Could not delete temp folder " + folder, e);
}
- return true;
}
public List<PathCommitDetails> getStateForCommit(String projectId, String
commitId) {
+ return withFreshClone("commit", List.of(), git ->
readStateForCommit(git, projectId, commitId));
+ }
+
+ private List<PathCommitDetails> readStateForCommit(Git git, String
projectId, String commitId) {
List<PathCommitDetails> result = new ArrayList<>();
try {
- // Obtain the Git instance (reusing the import cache for read
operations)
- Git git = getGitForImport();
- if (git == null) {
- return result;
- }
-
Repository repository = git.getRepository();
// Resolve the specific commit ID
ObjectId commitObjectId = repository.resolve(commitId);
diff --git
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index 8f3ba700..d6a6c663 100644
---
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -382,12 +382,11 @@ public class ProjectService {
}
}
- public void importProjects(boolean onlyNew) {
+ public void importProjects() {
boolean isDev = "dev".equalsIgnoreCase(environment);
- boolean effectiveOnlyNew = isDev ? onlyNew : false;
- LOGGER.info("Import " + (effectiveOnlyNew ? "Only New" : "All") + "
projects from git: " + gitServiceAuth.getGitConfig().repository());
+ LOGGER.info("Import projects for " + environment + " from git: " +
gitServiceAuth.getGitConfig().repository());
try {
- List<PathCommitDetails> pathCommitDetails = effectiveOnlyNew ?
gitService.readAllProjectsFromRepository() : gitService.readProjectsToImport();
+ List<PathCommitDetails> pathCommitDetails =
gitService.readAllProjectsFromRepository();
List<PathCommitDetails> projectPaths =
pathCommitDetails.stream().filter(PathCommitDetails::isFolder).toList();
List<String> gitProjectIds =
projectPaths.stream().map(PathCommitDetails::projectId).toList();
@@ -418,7 +417,8 @@ public class ProjectService {
// In test/prod, add only projects that contain the respective
{environment}.kubernetes.yaml
if (!isDev && !isBuiltIn) {
- boolean hasEnvDeploymentFile =
hadEnvironmentSpecificDeploymentFile(folderFiles.stream().map(PathCommitDetails::fileName).collect(Collectors.toList()));
+ List<String> fileNames =
folderFiles.stream().map(PathCommitDetails::fileName).toList();
+ boolean hasEnvDeploymentFile =
hadEnvironmentSpecificDeploymentFile(fileNames);
if (!hasEnvDeploymentFile) {
LOGGER.info("Project " + folderName + " skipped!
(Missing " + environment + " deployment resource)");
@@ -426,37 +426,41 @@ public class ProjectService {
}
}
- boolean needImport = !effectiveOnlyNew ||
karavanCache.getProject(folderName) == null;
- LOGGER.info("Project " + folderName + " " + (needImport ? "is
loading!" : "skipped!"));
-
- if (needImport) {
- if
(folderName.equals(ProjectFolder.Type.templates.name())) {
- projectFolder = new
ProjectFolder(ProjectFolder.Type.templates.name(), "Templates",
folderDetails.commitTime(), ProjectFolder.Type.templates);
- } else if
(folderName.equals(ProjectFolder.Type.kamelets.name())) {
- projectFolder = new
ProjectFolder(ProjectFolder.Type.kamelets.name(), "Custom Kamelets",
folderDetails.commitTime(), ProjectFolder.Type.kamelets);
- } else if
(folderName.equals(ProjectFolder.Type.configuration.name())) {
- projectFolder = new
ProjectFolder(ProjectFolder.Type.configuration.name(), "Configuration",
folderDetails.commitTime(), ProjectFolder.Type.configuration);
- } else if
(folderName.equals(ProjectFolder.Type.documentation.name())) {
- projectFolder = new
ProjectFolder(ProjectFolder.Type.documentation.name(), "Documentation",
folderDetails.commitTime(), ProjectFolder.Type.documentation);
- } else {
- projectFolder = getProjectFromRepo(folderDetails,
folderFiles);
- }
+ // import projects
+ if (folderName.equals(ProjectFolder.Type.templates.name())) {
+ projectFolder = new
ProjectFolder(ProjectFolder.Type.templates.name(), "Templates",
folderDetails.commitTime(), ProjectFolder.Type.templates);
+ } else if
(folderName.equals(ProjectFolder.Type.kamelets.name())) {
+ projectFolder = new
ProjectFolder(ProjectFolder.Type.kamelets.name(), "Custom Kamelets",
folderDetails.commitTime(), ProjectFolder.Type.kamelets);
+ } else if
(folderName.equals(ProjectFolder.Type.configuration.name())) {
+ projectFolder = new
ProjectFolder(ProjectFolder.Type.configuration.name(), "Configuration",
folderDetails.commitTime(), ProjectFolder.Type.configuration);
+ } else if
(folderName.equals(ProjectFolder.Type.documentation.name())) {
+ projectFolder = new
ProjectFolder(ProjectFolder.Type.documentation.name(), "Documentation",
folderDetails.commitTime(), ProjectFolder.Type.documentation);
+ } else {
+ projectFolder = getProjectFromRepo(folderDetails,
folderFiles);
+ }
+
+ var projectInCache = karavanCache.getProject(folderName);
+ boolean isNotExisting = projectInCache == null;
+ LOGGER.info("Project " + folderName + (isNotExisting ? " is
creating!" : " updating!"));
+
+ projectFolderCommited = new
ProjectFolderCommited(projectFolder.getProjectId(), folderDetails.commitId(),
folderDetails.commitTime());
+ karavanCache.saveProjectCommited(projectFolderCommited);
+
+ if (isNotExisting || !isDev || projectInCache.getLastUpdate()
< projectFolder.getLastUpdate()) {
karavanCache.saveProject(projectFolder, true);
- projectFolderCommited = new
ProjectFolderCommited(projectFolder.getProjectId(), folderDetails.commitId(),
folderDetails.commitTime());
- karavanCache.saveProjectCommited(projectFolderCommited);
-
- folderFiles.forEach(fileDetails -> {
- var file = new ProjectFile(fileDetails.fileName(),
fileDetails.content(), folderName, fileDetails.commitTime());
- var commitedFile = ProjectFileCommited.fromFile(file,
fileDetails.commitId());
- karavanCache.saveProjectFileCommited(commitedFile);
- var fileInCache =
karavanCache.getProjectFile(file.getProjectId(), file.getName());
-
- // Enforce overwrites: Always rewrite files in
test/prod environments (bypass timestamp checks)
- if (fileInCache == null || !isDev ||
fileInCache.getLastUpdate() < file.getLastUpdate()) {
- karavanCache.saveProjectFile(file, null, false);
- }
- });
}
+
+ folderFiles.forEach(fileDetails -> {
+ var file = new ProjectFile(fileDetails.fileName(),
fileDetails.content(), folderName, fileDetails.commitTime());
+ var commitedFile = ProjectFileCommited.fromFile(file,
fileDetails.commitId());
+ karavanCache.saveProjectFileCommited(commitedFile);
+ var fileInCache =
karavanCache.getProjectFile(file.getProjectId(), file.getName());
+
+ // Enforce overwrites: Always rewrite files in test/prod
environments (bypass timestamp checks)
+ if (fileInCache == null || !isDev ||
fileInCache.getLastUpdate() < file.getLastUpdate()) {
+ karavanCache.saveProjectFile(file, null, false);
+ }
+ });
});
} catch (Exception e) {
LOGGER.error("Error during project import", e);
@@ -480,6 +484,12 @@ public class ProjectService {
public void revertProjectToCommit(String projectId, String commitId) {
var filesInGit = gitService.getStateForCommit(projectId, commitId);
+ // nothing was read: commit not found, or git unreachable. Do not wipe
the cache.
+ if (filesInGit.isEmpty()) {
+ LOGGER.error("Revert of project " + projectId + " to commit " +
commitId + " skipped: no files read from git");
+ return;
+ }
+
// remove files from cache
var fileNames =
karavanCache.getProjectFiles(projectId).stream().map(ProjectFile::getName).toList();
for (var cachedFileName : fileNames) {