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) {

Reply via email to