From 1cd49853dc2539a4ff102893683d197f86635afd Mon Sep 17 00:00:00 2001 From: Patrik Korytar Date: Tue, 30 Jun 2026 13:18:35 +0200 Subject: [PATCH 1/5] NCL-9724 Bump jsonrpc2-base to v2.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e0cb1748..31befbf5d 100644 --- a/pom.xml +++ b/pom.xml @@ -373,7 +373,7 @@ com.thetransactioncompany jsonrpc2-base - 2.2 + 2.2.1 From 041f91c16b91529d259d632fa178816d4fe23395 Mon Sep 17 00:00:00 2001 From: Patrik Korytar Date: Tue, 30 Jun 2026 13:44:55 +0200 Subject: [PATCH 2/5] NCL-9724 Remove scm provider git implementation --- pom.xml | 8 +- source-code-manager/pom.xml | 4 - .../java/org/jboss/da/scm/impl/ScmFacade.java | 120 +++++++++--------- .../jboss/da/test/server/scm/SCMTestIT.java | 4 +- .../reports/align/align-test-wrong.json | 2 +- 5 files changed, 66 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index 31befbf5d..a6de0a7d2 100644 --- a/pom.xml +++ b/pom.xml @@ -91,8 +91,7 @@ 3.37.0 1.6.3 - - 1.13.0 + 2.2.1 2.27.0 @@ -358,11 +357,6 @@ maven-scm-api ${mvn-scm.version} - - org.apache.maven.scm - maven-scm-provider-jgit - ${mvn-scm.version} - org.apache.maven.scm maven-scm-provider-svnexe diff --git a/source-code-manager/pom.xml b/source-code-manager/pom.xml index bfa107603..efc0caf08 100644 --- a/source-code-manager/pom.xml +++ b/source-code-manager/pom.xml @@ -25,10 +25,6 @@ org.apache.maven.scm maven-scm-api - - org.apache.maven.scm - maven-scm-provider-jgit - org.apache.maven.scm maven-scm-provider-svnexe diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java index f142af32c..a1e3c3cbe 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java @@ -2,21 +2,21 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import jakarta.enterprise.context.ApplicationScoped; +import org.apache.commons.io.FileUtils; import org.apache.maven.scm.ScmException; import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.ScmTag; -import org.apache.maven.scm.command.add.AddScmResult; -import org.apache.maven.scm.command.checkin.CheckInScmResult; import org.apache.maven.scm.command.checkout.CheckOutScmResult; import org.apache.maven.scm.manager.BasicScmManager; import org.apache.maven.scm.manager.NoSuchScmProviderException; import org.apache.maven.scm.manager.ScmManager; -import org.apache.maven.scm.provider.git.jgit.JGitScmProvider; import org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider; import org.apache.maven.scm.repository.ScmRepository; import org.apache.maven.scm.repository.ScmRepositoryException; @@ -38,14 +38,15 @@ public class ScmFacade { public ScmFacade() { scmManager = new BasicScmManager(); - // Add new providers here - scmManager.setScmProvider(SCMType.GIT.toString(), new JGitScmProvider()); + // git is handled via the git command (see gitCliClone) + // add new (non-git) providers here scmManager.setScmProvider(SCMType.SVN.toString(), new SvnExeScmProvider()); } /** * Tries to do a shallow clone (clone only the requested revision) of the remote repository to the local directory. * If it is not possible to do that, then it does the full clone. + * For a git repository, it tries to do it using the git tool, otherwise uses ScmManager. * * @param scmType Type of the repository * @param scmUrl URL to the repository @@ -59,7 +60,11 @@ public void shallowCloneRepository(SCMType scmType, String scmUrl, String revisi cloneTo.mkdir(); } - if (shallowClone(scmType, scmUrl, revision, cloneTo)) { + if (scmType == SCMType.GIT) { + if (!gitCliClone(scmType, scmUrl, revision, cloneTo)) { + throw new ScmException( + "Cloning of git repository " + scmUrl + " at revision " + revision + " failed."); + } return; } @@ -76,7 +81,6 @@ public void shallowCloneRepository(SCMType scmType, String scmUrl, String revisi * @throws ScmException Thrown if the clone of the repository fails */ public void cloneRepository(SCMType scmType, String scmUrl, String revision, File cloneTo) throws ScmException { - // if we can't shallow clone, then do the full git clone ScmRepository repo = getScmRepository(scmType.getSCMUrl(scmUrl), scmManager); CheckOutScmResult checkOut = scmManager.checkOut(repo, new ScmFileSet(cloneTo), new ScmTag(revision)); if (!checkOut.isSuccess()) { @@ -84,35 +88,6 @@ public void cloneRepository(SCMType scmType, String scmUrl, String revision, Fil } } - /** - * Stages selected local files in the SCM repository and pushes them to the remote repository. - * - * @param scmType Type of the repository - * @param scmUrl URL to the repository - * @param baseDir Directory of the local repository - * @param files Files, which should be pushed to the remote - * @param commitMessage Commit message - * @throws ScmException Thrown if the operation with the repository fails - */ - public void commitAndPush(SCMType scmType, String scmUrl, File baseDir, List files, String commitMessage) - throws ScmException { - ScmRepository repo = getScmRepository(scmType.getSCMUrl(scmUrl), scmManager); - ScmFileSet scmFileSet = new ScmFileSet(baseDir, files); - AddScmResult addResult = scmManager.add(repo, scmFileSet); - - if (!addResult.isSuccess()) - throw new ScmException( - "The manager wasn't able to ADD these files " + scmFileSet.toString() + " to the repository " - + repo); - - CheckInScmResult pushResult = scmManager.checkIn(repo, scmFileSet, commitMessage); - - if (!pushResult.isSuccess()) - throw new ScmException( - "The manager wasn't able to PUSH these files " + scmFileSet.toString() + " to the repository " - + repo); - } - private ScmRepository getScmRepository(String scmUrl, ScmManager scmManager) throws ScmException { try { return scmManager.makeScmRepository(scmUrl); @@ -124,7 +99,9 @@ private ScmRepository getScmRepository(String scmUrl, ScmManager scmManager) thr } /** - * If we were able to shallow clone, this function will return true. false otherwise + * Clones the repository using the git. A branch or tag is cloned shallowly. + * Commit hash cannot be cloned shallowly and falls back to a full clone. + * Returns true if the clone succeeded, false otherwise. * * @param scmType type of scmUrl * @param scmUrl link of repo to clone @@ -132,33 +109,60 @@ private ScmRepository getScmRepository(String scmUrl, ScmManager scmManager) thr * @param cloneTo directory to clone the scmUrl * @return */ - private boolean shallowClone(SCMType scmType, String scmUrl, String revision, File cloneTo) { - // we only support git for shallow cloning - if (!scmType.equals(SCMType.GIT)) { - return false; + private boolean gitCliClone(SCMType scmType, String scmUrl, String revision, File cloneTo) { + if (revision == null || revision.isEmpty()) { + return runGit(cloneTo, "clone", "--depth", "1", scmUrl, "."); } - try { - ProcessBuilder pb; - if (revision == null || revision.isEmpty()) { - pb = new ProcessBuilder("git", "clone", "--depth", "1", scmUrl, "."); - } else { - pb = new ProcessBuilder("git", "clone", "--depth", "1", "--branch", revision, scmUrl, "."); - } - pb.directory(cloneTo); + // works when the revision is a branch or tag name + if (runGit(cloneTo, "clone", "--depth", "1", "--branch", revision, scmUrl, ".")) { + return true; + } + + cleanDirectory(cloneTo); + + // revision is most likely a commit hash (cannot be cloned shallowly) + if (runGit(cloneTo, "clone", scmUrl, ".") && runGit(cloneTo, "checkout", revision)) { + return true; + } + + cleanDirectory(cloneTo); + return false; + } + + private boolean runGit(File workingDir, String... args) { + List command = new ArrayList<>(args.length + 1); + command.add("git"); + Collections.addAll(command, args); - Map env = pb.environment(); + ProcessBuilder pb = new ProcessBuilder(command); + pb.directory(workingDir); + pb.redirectOutput(ProcessBuilder.Redirect.DISCARD); + pb.redirectError(ProcessBuilder.Redirect.DISCARD); - // need to add those variables to tell git not to prompt us if repository does not exist - env.put("GIT_ASKPASS", "/bin/echo"); // git <= 2.3 - env.put("GIT_TERMINAL_PROMPT", "0"); // git > 2.3 + Map env = pb.environment(); - Process p = pb.start(); - int status = p.waitFor(); - return status == 0; - } catch (IOException | InterruptedException ex) { - logger.error("Could not shallow clone", ex); + // need to add those variables to tell git not to prompt us if repository does not exist + env.put("GIT_ASKPASS", "/bin/echo"); // git <= 2.3 + env.put("GIT_TERMINAL_PROMPT", "0"); // git > 2.3 + + try { + return pb.start().waitFor() == 0; + } catch (IOException ex) { + logger.error("Could not run git {}", String.join(" ", args), ex); return false; + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + logger.error("Interrupted while running git {}", String.join(" ", args), ex); + return false; + } + } + + private void cleanDirectory(File directory) { + try { + FileUtils.cleanDirectory(directory); + } catch (IOException ex) { + logger.warn("Could not clean directory {}", directory, ex); } } } diff --git a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java index a90f42939..9867b99ab 100644 --- a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java +++ b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java @@ -66,13 +66,13 @@ public void shouldFailClone_Ssh() throws Exception { try { testDaGitClone("git@github.com:project-ncl/dependency-analysis.git"); } catch (ScmException e) { - // Verify the stack trace is indeed the expected private key failure and not something else + // Verify the failure is the expected clone failure and not something else StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); String trace = sw.toString(); // stack trace as a string - assertTrue(trace.contains("JGit checkout failure!")); + assertTrue(trace.contains("Cloning of git repository")); } } diff --git a/testsuite/src/test/rest/v-1/expectedResponse/reports/align/align-test-wrong.json b/testsuite/src/test/rest/v-1/expectedResponse/reports/align/align-test-wrong.json index 76dcd3c5e..871be7f67 100644 --- a/testsuite/src/test/rest/v-1/expectedResponse/reports/align/align-test-wrong.json +++ b/testsuite/src/test/rest/v-1/expectedResponse/reports/align/align-test-wrong.json @@ -1,5 +1,5 @@ { "errorType": "SCM_ENDPOINT", "errorMessage": "Exception thrown in SCM analysis", - "details": "Exception while executing SCM command." + "details": "Cloning of git repository https://github.com/project-ncl/dependency-analysis2.git at revision 0.6.1 failed." } From 06f482687c0d495c1fd05aacfb39ed946151f625 Mon Sep 17 00:00:00 2001 From: Patrik Korytar Date: Tue, 30 Jun 2026 15:13:24 +0200 Subject: [PATCH 3/5] NCL-9724 Remove infinispan coming from partyline --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index a6de0a7d2..2d63bde68 100644 --- a/pom.xml +++ b/pom.xml @@ -329,6 +329,14 @@ org.commonjava.maven.galley * + + + org.infinispan + * + From 4a20d9c93a7e0e12cc9f4997c4c16712bf6574fb Mon Sep 17 00:00:00 2001 From: Patrik Korytar Date: Wed, 22 Jul 2026 16:08:10 +0200 Subject: [PATCH 4/5] NCL-9724 Extract git commands and introduce SmallRye ProcessBuilder --- source-code-manager/pom.xml | 4 + .../java/org/jboss/da/scm/impl/ScmFacade.java | 94 ++------------- .../jboss/da/scm/impl/git/GitCommands.java | 112 ++++++++++++++++++ .../jboss/da/scm/impl/git/GitException.java | 15 +++ .../org/jboss/da/scm/impl/git/GitUtils.java | 50 ++++++++ .../jboss/da/test/server/scm/SCMTestIT.java | 8 +- 6 files changed, 198 insertions(+), 85 deletions(-) create mode 100644 source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitCommands.java create mode 100644 source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitException.java create mode 100644 source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitUtils.java diff --git a/source-code-manager/pom.xml b/source-code-manager/pom.xml index efc0caf08..36fb0dc22 100644 --- a/source-code-manager/pom.xml +++ b/source-code-manager/pom.xml @@ -49,6 +49,10 @@ commons-io commons-io + + io.smallrye.common + smallrye-common-process + diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java index a1e3c3cbe..8de292600 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java @@ -1,15 +1,10 @@ package org.jboss.da.scm.impl; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; -import org.apache.commons.io.FileUtils; import org.apache.maven.scm.ScmException; import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.ScmTag; @@ -21,24 +16,24 @@ import org.apache.maven.scm.repository.ScmRepository; import org.apache.maven.scm.repository.ScmRepositoryException; import org.jboss.da.scm.api.SCMType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.jboss.da.scm.impl.git.GitCommands; +import org.jboss.da.scm.impl.git.GitException; /** * Facade, which simplifies operations with the SCM repositories - * */ @ApplicationScoped public class ScmFacade { - private static final Logger logger = LoggerFactory.getLogger(ScmFacade.class); - private final ScmManager scmManager; + @Inject + GitCommands gitCommands; + public ScmFacade() { scmManager = new BasicScmManager(); - // git is handled via the git command (see gitCliClone) + // git is handled via the git command (see GitCommands) // add new (non-git) providers here scmManager.setScmProvider(SCMType.SVN.toString(), new SvnExeScmProvider()); } @@ -61,9 +56,12 @@ public void shallowCloneRepository(SCMType scmType, String scmUrl, String revisi } if (scmType == SCMType.GIT) { - if (!gitCliClone(scmType, scmUrl, revision, cloneTo)) { + try { + gitCommands.cloneRepository(scmUrl, revision, cloneTo); + } catch (GitException ex) { throw new ScmException( - "Cloning of git repository " + scmUrl + " at revision " + revision + " failed."); + "Cloning of git repository " + scmUrl + " at revision " + revision + " failed.", + ex); } return; } @@ -97,72 +95,4 @@ private ScmRepository getScmRepository(String scmUrl, ScmManager scmManager) thr throw new ScmException("Error while connecting to the repository", ex); } } - - /** - * Clones the repository using the git. A branch or tag is cloned shallowly. - * Commit hash cannot be cloned shallowly and falls back to a full clone. - * Returns true if the clone succeeded, false otherwise. - * - * @param scmType type of scmUrl - * @param scmUrl link of repo to clone - * @param revision specific revision to clone - * @param cloneTo directory to clone the scmUrl - * @return - */ - private boolean gitCliClone(SCMType scmType, String scmUrl, String revision, File cloneTo) { - if (revision == null || revision.isEmpty()) { - return runGit(cloneTo, "clone", "--depth", "1", scmUrl, "."); - } - - // works when the revision is a branch or tag name - if (runGit(cloneTo, "clone", "--depth", "1", "--branch", revision, scmUrl, ".")) { - return true; - } - - cleanDirectory(cloneTo); - - // revision is most likely a commit hash (cannot be cloned shallowly) - if (runGit(cloneTo, "clone", scmUrl, ".") && runGit(cloneTo, "checkout", revision)) { - return true; - } - - cleanDirectory(cloneTo); - return false; - } - - private boolean runGit(File workingDir, String... args) { - List command = new ArrayList<>(args.length + 1); - command.add("git"); - Collections.addAll(command, args); - - ProcessBuilder pb = new ProcessBuilder(command); - pb.directory(workingDir); - pb.redirectOutput(ProcessBuilder.Redirect.DISCARD); - pb.redirectError(ProcessBuilder.Redirect.DISCARD); - - Map env = pb.environment(); - - // need to add those variables to tell git not to prompt us if repository does not exist - env.put("GIT_ASKPASS", "/bin/echo"); // git <= 2.3 - env.put("GIT_TERMINAL_PROMPT", "0"); // git > 2.3 - - try { - return pb.start().waitFor() == 0; - } catch (IOException ex) { - logger.error("Could not run git {}", String.join(" ", args), ex); - return false; - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - logger.error("Interrupted while running git {}", String.join(" ", args), ex); - return false; - } - } - - private void cleanDirectory(File directory) { - try { - FileUtils.cleanDirectory(directory); - } catch (IOException ex) { - logger.warn("Could not clean directory {}", directory, ex); - } - } } diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitCommands.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitCommands.java new file mode 100644 index 000000000..cad98b7a3 --- /dev/null +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitCommands.java @@ -0,0 +1,112 @@ +package org.jboss.da.scm.impl.git; + +import static org.jboss.da.scm.impl.git.GitUtils.DEFAULT_REMOTE_NAME; +import static org.jboss.da.scm.impl.git.GitUtils.FETCH_HEAD; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import jakarta.enterprise.context.ApplicationScoped; + +import org.apache.commons.io.FileUtils; +import org.jboss.pnc.common.log.LogSanitizer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.smallrye.common.process.AbstractExecutionException; +import io.smallrye.common.process.ProcessBuilder; + +/** + * Composes the git commands (using {@link GitUtils}) and executes them as shell processes. + */ +@ApplicationScoped +public class GitCommands { + + private static final Logger logger = LoggerFactory.getLogger(GitCommands.class); + + private static final int MAX_LINE_LENGTH = 8192; + + /** + * Clones the repository at the given revision into the given directory. + *

+ * Fetching the requested revision shallowly for branches, tags, and commit hashes alike. + * Is shallow clone fails, it falls back to a full clone followed by a checkout. + * + * @param url URL of the repository to clone + * @param revision revision to clone, the default branch is cloned when null or empty + * @param cloneTo directory to clone the repository into + * @throws GitException thrown if the repository could not be cloned + */ + public void cloneRepository(String url, String revision, File cloneTo) { + if (revision == null || revision.isEmpty()) { + if (!execute(cloneTo, GitUtils.clone(url, true))) { + throw new GitException("Could not clone repository " + LogSanitizer.clean(url)); + } + return; + } + + if (shallowFetchRevision(url, revision, cloneTo)) { + return; + } + + logger.info( + "Could not fetch revision {} of {} shallowly, falling back to a full clone", + LogSanitizer.clean(revision), + LogSanitizer.clean(url)); + cleanDirectory(cloneTo); + + if (!execute(cloneTo, GitUtils.clone(url, false)) || !execute(cloneTo, GitUtils.checkout(revision))) { + cleanDirectory(cloneTo); + throw new GitException( + "Could not clone repository " + LogSanitizer.clean(url) + " at revision " + + LogSanitizer.clean(revision)); + } + } + + private boolean shallowFetchRevision(String url, String revision, File cloneTo) { + return execute(cloneTo, GitUtils.init()) + && execute(cloneTo, GitUtils.addRemote(DEFAULT_REMOTE_NAME, url)) + && execute(cloneTo, GitUtils.fetchRef(DEFAULT_REMOTE_NAME, revision, true)) + && execute(cloneTo, GitUtils.checkout(FETCH_HEAD)); + } + + /** + * Runs the given command in the given working directory. Returns true if it exited successfully, false otherwise. + */ + private boolean execute(File workingDir, List command) { + StringBuilder errorOutput = new StringBuilder(); + + ProcessBuilder processBuilder = ProcessBuilder.newBuilder(command.get(0)) + .arguments(command.subList(1, command.size())) + .directory(workingDir.toPath()) + // need to add those variables to tell git not to prompt us if repository does not exist + .modifyEnvironment(env -> { + env.put("GIT_ASKPASS", "/bin/echo"); // git <= 2.3 + env.put("GIT_TERMINAL_PROMPT", "0"); // git > 2.3 + }); + processBuilder.output().discard(); + processBuilder.error() + .logOnSuccess(false) + .consumeLinesWith(MAX_LINE_LENGTH, line -> errorOutput.append(line).append(System.lineSeparator())); + + try { + processBuilder.run(); + return true; + } catch (AbstractExecutionException ex) { + logger.info( + "Command '{}' failed: {}", + String.join(" ", command), + errorOutput.toString()); + return false; + } + } + + private void cleanDirectory(File directory) { + try { + FileUtils.cleanDirectory(directory); + } catch (IOException ex) { + logger.warn("Could not clean directory {}", LogSanitizer.clean(directory.toString()), ex); + } + } +} diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitException.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitException.java new file mode 100644 index 000000000..6855aeaee --- /dev/null +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitException.java @@ -0,0 +1,15 @@ +package org.jboss.da.scm.impl.git; + +/** + * Thrown when a git command fails. + */ +public class GitException extends RuntimeException { + + public GitException(String message) { + super(message); + } + + public GitException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitUtils.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitUtils.java new file mode 100644 index 000000000..1f770ed5e --- /dev/null +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/git/GitUtils.java @@ -0,0 +1,50 @@ +package org.jboss.da.scm.impl.git; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utility to compose the full git commands. + */ +public class GitUtils { + + public static final String DEFAULT_REMOTE_NAME = "origin"; + + public static final String FETCH_HEAD = "FETCH_HEAD"; + + private GitUtils() { + } + + public static List init() { + return List.of("git", "init"); + } + + public static List addRemote(String remote, String url) { + return List.of("git", "remote", "add", remote, url); + } + + public static List fetchRef(String remote, String ref, boolean fetchShallowly) { + List command = new ArrayList<>(List.of("git", "fetch", remote, ref)); + if (fetchShallowly) { + command.add("--depth=1"); + } + + return command; + } + + public static List checkout(String ref) { + return List.of("git", "checkout", ref); + } + + public static List clone(String url, boolean cloneShallowly) { + List command = new ArrayList<>(List.of("git", "clone")); + if (cloneShallowly) { + command.add("--depth=1"); + } + + command.add(url); + command.add("."); + + return command; + } +} diff --git a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java index 9867b99ab..3e32d6db1 100644 --- a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java +++ b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java @@ -12,6 +12,8 @@ import java.nio.file.Paths; import java.util.Scanner; +import jakarta.inject.Inject; + import org.apache.commons.io.FileUtils; import org.apache.maven.scm.ScmException; import org.jboss.da.scm.api.SCMType; @@ -24,9 +26,11 @@ @QuarkusTest public class SCMTestIT { + @Inject + ScmFacade scm; + private void testDaGitClone(String scmUrl) throws Exception { Path tempDir = Files.createTempDirectory("da_temp_git_clone"); - ScmFacade scm = new ScmFacade(); try { // the git commit is actually the one for tag 0.2.0 @@ -86,7 +90,6 @@ public void shouldBeAbleToCloneGitTag() throws Exception { // this test should use the shallow cloning feature Path tempDir = Files.createTempDirectory("da_temp_git_clone"); - ScmFacade scm = new ScmFacade(); try { scm.shallowCloneRepository( @@ -117,7 +120,6 @@ public void shouldBeAbleToCloneGitTag() throws Exception { @Test public void shouldCloneSvnRepository() throws Exception { Path tempDir = Files.createTempDirectory("da_temp_svn_checkout"); - ScmFacade scm = new ScmFacade(); try { // revision makes no sense for SVN From 1184df253edd99b6bd7016ac21fac12b8537a708 Mon Sep 17 00:00:00 2001 From: Patrik Korytar Date: Wed, 22 Jul 2026 16:58:55 +0200 Subject: [PATCH 5/5] NCL-9724 Remove SVN type and Maven SCM dependency --- .../communication/scm/api/SCMConnector.java | 2 +- .../scm/impl/SCMConnectorImpl.java | 39 +++------- pom.xml | 15 ---- .../da/reports/api/ReportsGenerator.java | 2 +- .../backend/api/DependencyTreeGenerator.java | 2 +- .../impl/DependencyTreeGeneratorImpl.java | 2 +- .../da/reports/impl/ReportsGeneratorImpl.java | 9 +-- .../rest/exceptions/AllExceptionsMapper.java | 2 +- .../jboss/da/rest/facade/ReportsFacade.java | 2 +- .../org/jboss/da/rest/reports/Reports.java | 2 +- source-code-manager/pom.xml | 8 -- .../main/java/org/jboss/da/scm/api/SCM.java | 5 +- .../java/org/jboss/da/scm/api/SCMType.java | 25 ------- .../org/jboss/da/scm/api/ScmException.java | 15 ++++ .../java/org/jboss/da/scm/impl/SCMImpl.java | 9 +-- .../org/jboss/da/scm/impl/SCMSpecifier.java | 5 -- .../java/org/jboss/da/scm/impl/ScmFacade.java | 75 +++---------------- .../communication/GalleyWrapperTestIT.java | 5 +- .../server/communication/SCMRemoteTestIT.java | 2 +- .../jboss/da/test/server/scm/SCMTestIT.java | 41 +--------- 20 files changed, 55 insertions(+), 212 deletions(-) delete mode 100644 source-code-manager/src/main/java/org/jboss/da/scm/api/SCMType.java create mode 100644 source-code-manager/src/main/java/org/jboss/da/scm/api/ScmException.java diff --git a/communication/src/main/java/org/jboss/da/communication/scm/api/SCMConnector.java b/communication/src/main/java/org/jboss/da/communication/scm/api/SCMConnector.java index 272da1332..d417f1b93 100644 --- a/communication/src/main/java/org/jboss/da/communication/scm/api/SCMConnector.java +++ b/communication/src/main/java/org/jboss/da/communication/scm/api/SCMConnector.java @@ -5,12 +5,12 @@ import java.util.Optional; import java.util.Set; -import org.apache.maven.scm.ScmException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.pom.model.MavenProject; import org.jboss.da.communication.repository.model.GAVDependencyTree; import org.jboss.da.model.rest.GA; import org.jboss.da.model.rest.GAV; +import org.jboss.da.scm.api.ScmException; /** * diff --git a/communication/src/main/java/org/jboss/da/communication/scm/impl/SCMConnectorImpl.java b/communication/src/main/java/org/jboss/da/communication/scm/impl/SCMConnectorImpl.java index eb924a7cd..130fe5d91 100644 --- a/communication/src/main/java/org/jboss/da/communication/scm/impl/SCMConnectorImpl.java +++ b/communication/src/main/java/org/jboss/da/communication/scm/impl/SCMConnectorImpl.java @@ -9,7 +9,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.pom.api.PomAnalyzer; import org.jboss.da.communication.pom.model.MavenProject; @@ -18,7 +17,7 @@ import org.jboss.da.model.rest.GA; import org.jboss.da.model.rest.GAV; import org.jboss.da.scm.api.SCM; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; /** * @@ -36,10 +35,7 @@ public class SCMConnectorImpl implements SCMConnector { @Override public GAVDependencyTree getDependencyTreeOfRevision(String scmUrl, String revision, GAV gav) throws ScmException, PomAnalysisException { - // git clone - // TODO: hardcoded to git right now - // TODO: enable the svn test if svn support is added - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); GAVDependencyTree gavDependencyTree = pomAnalyzer.readRelationships(tempDir, gav); return gavDependencyTree; @@ -48,10 +44,7 @@ public GAVDependencyTree getDependencyTreeOfRevision(String scmUrl, String revis @Override public Set getToplevelDependencyOfRevision(String scmUrl, String revision, GAV gav) throws ScmException, PomAnalysisException { - // git clone - // TODO: hardcoded to git right now - // TODO: enable the svn test if svn support is added - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.getToplevelDependency(tempDir, gav); } @@ -62,10 +55,7 @@ public GAVDependencyTree getDependencyTreeOfRevision( String revision, String pomPath, List repositories) throws ScmException, PomAnalysisException { - // git clone - // TODO: hardcoded to git right now - // TODO: enable the svn test if svn support is added - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); GAVDependencyTree gavDependencyTree = pomAnalyzer.readRelationships(tempDir, pomPath, repositories); @@ -78,10 +68,7 @@ public Set getToplevelDependencyOfRevision( String revision, String pomPath, List repositories) throws ScmException, PomAnalysisException { - // git clone - // TODO: hardcoded to git right now - // TODO: enable the svn test if svn support is added - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.getToplevelDependency(tempDir, pomPath, repositories); } @@ -92,27 +79,21 @@ public Optional getPom(String scmUrl, String revision, String pomP pomPath += "/pom.xml"; } - // git clone - // TODO: hardcoded to git right now - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.readPom(new File(tempDir, pomPath)); } @Override public boolean isGAVInRepository(String scmUrl, String revision, GAV gav) throws ScmException { - // git clone - // TODO: hardcoded to git right now - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.getPOMFileForGAV(tempDir, gav).isPresent(); } @Override public Optional getPom(String scmUrl, String revision, GAV gav) throws ScmException { - // git clone - // TODO: hardcoded to git right now - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.getPOMFileForGAV(tempDir, gav).flatMap(file -> pomAnalyzer.readPom(file)); } @@ -123,9 +104,7 @@ public Map> getDependenciesOfModules( String revision, String pomPath, List repositories) throws ScmException, PomAnalysisException { - // git clone - // TODO: hardcoded to git right now - File tempDir = scmManager.cloneRepository(SCMType.GIT, scmUrl, revision); + File tempDir = scmManager.cloneRepository(scmUrl, revision); return pomAnalyzer.getDependenciesOfModules(tempDir, pomPath, repositories); } diff --git a/pom.xml b/pom.xml index 2d63bde68..e09de39a7 100644 --- a/pom.xml +++ b/pom.xml @@ -91,8 +91,6 @@ 3.37.0 1.6.3 - 2.2.1 - 2.27.0 @@ -359,19 +357,6 @@ provided - - - org.apache.maven.scm - maven-scm-api - ${mvn-scm.version} - - - org.apache.maven.scm - maven-scm-provider-svnexe - ${mvn-scm.version} - - - com.thetransactioncompany jsonrpc2-base diff --git a/reports-backend/src/main/java/org/jboss/da/reports/api/ReportsGenerator.java b/reports-backend/src/main/java/org/jboss/da/reports/api/ReportsGenerator.java index 7f84c7fb7..6c3e10b1c 100644 --- a/reports-backend/src/main/java/org/jboss/da/reports/api/ReportsGenerator.java +++ b/reports-backend/src/main/java/org/jboss/da/reports/api/ReportsGenerator.java @@ -4,7 +4,6 @@ import java.util.Optional; import java.util.Set; -import org.apache.maven.scm.ScmException; import org.jboss.da.common.CommunicationException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.reports.model.api.SCMLocator; @@ -15,6 +14,7 @@ import org.jboss.da.reports.model.response.LookupReport; import org.jboss.da.reports.model.response.NPMLookupReport; import org.jboss.da.reports.model.response.NPMVersionsReport; +import org.jboss.da.scm.api.ScmException; /** * diff --git a/reports-backend/src/main/java/org/jboss/da/reports/backend/api/DependencyTreeGenerator.java b/reports-backend/src/main/java/org/jboss/da/reports/backend/api/DependencyTreeGenerator.java index fdde89ee3..6d211c87e 100644 --- a/reports-backend/src/main/java/org/jboss/da/reports/backend/api/DependencyTreeGenerator.java +++ b/reports-backend/src/main/java/org/jboss/da/reports/backend/api/DependencyTreeGenerator.java @@ -1,10 +1,10 @@ package org.jboss.da.reports.backend.api; -import org.apache.maven.scm.ScmException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.repository.model.GAVDependencyTree; import org.jboss.da.model.rest.GAV; import org.jboss.da.reports.model.api.SCMLocator; +import org.jboss.da.scm.api.ScmException; /** * diff --git a/reports-backend/src/main/java/org/jboss/da/reports/backend/impl/DependencyTreeGeneratorImpl.java b/reports-backend/src/main/java/org/jboss/da/reports/backend/impl/DependencyTreeGeneratorImpl.java index 54474d082..ecc4c5a15 100644 --- a/reports-backend/src/main/java/org/jboss/da/reports/backend/impl/DependencyTreeGeneratorImpl.java +++ b/reports-backend/src/main/java/org/jboss/da/reports/backend/impl/DependencyTreeGeneratorImpl.java @@ -9,7 +9,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.pom.model.MavenProject; import org.jboss.da.communication.repository.model.GAVDependencyTree; @@ -19,6 +18,7 @@ import org.jboss.da.reports.backend.api.DependencyTreeGenerator; import org.jboss.da.reports.backend.api.GAVToplevelDependencies; import org.jboss.da.reports.model.api.SCMLocator; +import org.jboss.da.scm.api.ScmException; /** * diff --git a/reports-backend/src/main/java/org/jboss/da/reports/impl/ReportsGeneratorImpl.java b/reports-backend/src/main/java/org/jboss/da/reports/impl/ReportsGeneratorImpl.java index d64538dfa..03ad93310 100644 --- a/reports-backend/src/main/java/org/jboss/da/reports/impl/ReportsGeneratorImpl.java +++ b/reports-backend/src/main/java/org/jboss/da/reports/impl/ReportsGeneratorImpl.java @@ -27,8 +27,6 @@ import jakarta.validation.ValidationException; import org.apache.commons.lang3.BooleanUtils; -import org.apache.maven.scm.ScmException; -import org.codehaus.plexus.util.StringUtils; import org.jboss.da.common.CommunicationException; import org.jboss.da.common.config.Configuration; import org.jboss.da.common.logging.UserLog; @@ -69,7 +67,7 @@ import org.jboss.da.reports.model.response.NPMLookupReport; import org.jboss.da.reports.model.response.NPMVersionsReport; import org.jboss.da.scm.api.SCM; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; import org.jboss.pnc.common.log.LogSanitizer; import org.jboss.pnc.common.version.SuffixedVersion; import org.jboss.pnc.common.version.VersionAnalyzer; @@ -231,9 +229,8 @@ public Optional getAdvancedReportFromSCM(SCMReportReques GAVDependencyTree dt = dependencyTreeGenerator.getDependencyTree(scml); Optional artifactReport = createReport(dt); - // TODO: hardcoded to git // hopefully we'll get the cached cloned folder for this repo - File repoFolder = scmManager.cloneRepository(SCMType.GIT, scml.getScmUrl(), scml.getRevision()); + File repoFolder = scmManager.cloneRepository(scml.getScmUrl(), scml.getRevision()); return artifactReport.map(r -> generateAdvancedArtifactReport(r, repoFolder)); } @@ -705,7 +702,7 @@ private static List toWhitelisted(Set whitel private LookupMode getLookupMode(String modeName, String suffix) { LookupMode mode; - if (StringUtils.isEmpty(modeName)) { + if (modeName == null || modeName.isEmpty()) { mode = new LookupMode(); mode.setName("ON_THE_FLY_MODE"); mode.getBuildCategories().add(BuildCategory.STANDARD); diff --git a/reports-rest/src/main/java/org/jboss/da/rest/exceptions/AllExceptionsMapper.java b/reports-rest/src/main/java/org/jboss/da/rest/exceptions/AllExceptionsMapper.java index 99714682d..58c473750 100644 --- a/reports-rest/src/main/java/org/jboss/da/rest/exceptions/AllExceptionsMapper.java +++ b/reports-rest/src/main/java/org/jboss/da/rest/exceptions/AllExceptionsMapper.java @@ -14,11 +14,11 @@ import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; -import org.apache.maven.scm.ScmException; import org.jboss.da.common.CommunicationException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.repository.api.RepositoryException; import org.jboss.da.model.rest.ErrorMessage; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.validation.ValidationException; import org.slf4j.Logger; diff --git a/reports-rest/src/main/java/org/jboss/da/rest/facade/ReportsFacade.java b/reports-rest/src/main/java/org/jboss/da/rest/facade/ReportsFacade.java index c0d74ed83..3b68bb298 100644 --- a/reports-rest/src/main/java/org/jboss/da/rest/facade/ReportsFacade.java +++ b/reports-rest/src/main/java/org/jboss/da/rest/facade/ReportsFacade.java @@ -9,7 +9,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; import org.jboss.da.common.CommunicationException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.reports.api.AdvancedArtifactReport; @@ -31,6 +30,7 @@ import org.jboss.da.reports.model.response.NPMLookupReport; import org.jboss.da.reports.model.response.NPMVersionsReport; import org.jboss.da.reports.model.response.Report; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.validation.Validation; import org.jboss.da.validation.ValidationException; diff --git a/reports-rest/src/main/java/org/jboss/da/rest/reports/Reports.java b/reports-rest/src/main/java/org/jboss/da/rest/reports/Reports.java index 6a140bb07..a33bf5200 100644 --- a/reports-rest/src/main/java/org/jboss/da/rest/reports/Reports.java +++ b/reports-rest/src/main/java/org/jboss/da/rest/reports/Reports.java @@ -12,7 +12,6 @@ import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response.Status; -import org.apache.maven.scm.ScmException; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.enums.SchemaType; import org.eclipse.microprofile.openapi.annotations.media.Content; @@ -36,6 +35,7 @@ import org.jboss.da.reports.model.response.NPMVersionsReport; import org.jboss.da.reports.model.response.Report; import org.jboss.da.rest.facade.ReportsFacade; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.validation.ValidationException; import org.jboss.pnc.common.log.LogSanitizer; import org.slf4j.Logger; diff --git a/source-code-manager/pom.xml b/source-code-manager/pom.xml index 36fb0dc22..a7bd0680e 100644 --- a/source-code-manager/pom.xml +++ b/source-code-manager/pom.xml @@ -21,14 +21,6 @@ org.slf4j slf4j-api - - org.apache.maven.scm - maven-scm-api - - - org.apache.maven.scm - maven-scm-provider-svnexe - io.quarkus diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/api/SCM.java b/source-code-manager/src/main/java/org/jboss/da/scm/api/SCM.java index 3e30bc7de..1e988f374 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/api/SCM.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/api/SCM.java @@ -4,8 +4,6 @@ import java.time.Duration; import java.time.temporal.TemporalAmount; -import org.apache.maven.scm.ScmException; - /** * * @author Honza Brázdil <jbrazdil@redhat.com> @@ -22,12 +20,11 @@ public interface SCM { * As long as it is referenced the repository will stay cloned. The repository will stay cloned for at least * {@link SCM#TIME_TO_KEEP} after the File object was garbage collected. * - * @param scmType * @param scmUrl * @param revision * @return * @throws ScmException * @see SCM#TIME_TO_KEEP */ - File cloneRepository(SCMType scmType, String scmUrl, String revision) throws ScmException; + File cloneRepository(String scmUrl, String revision) throws ScmException; } diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/api/SCMType.java b/source-code-manager/src/main/java/org/jboss/da/scm/api/SCMType.java deleted file mode 100644 index 606b34c8a..000000000 --- a/source-code-manager/src/main/java/org/jboss/da/scm/api/SCMType.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.jboss.da.scm.api; - -/** - * Enum to represent the SCM types supported by SCM. If a new type is added here, please also provide a provide in the - * SCM class. - */ -public enum SCMType { - GIT("GIT"), SVN("SVN"); - - private final String provider; - - SCMType(String provider) { - this.provider = provider; - } - - /** - * Returns provided url in Maven SCM format. - * - * @param url - * @return - */ - public String getSCMUrl(String url) { - return String.format("scm:%s:%s", provider, url); - } -} diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/api/ScmException.java b/source-code-manager/src/main/java/org/jboss/da/scm/api/ScmException.java new file mode 100644 index 000000000..b45a0f94e --- /dev/null +++ b/source-code-manager/src/main/java/org/jboss/da/scm/api/ScmException.java @@ -0,0 +1,15 @@ +package org.jboss.da.scm.api; + +/** + * Thrown when an operation with an SCM repository fails. + */ +public class ScmException extends Exception { + + public ScmException(String message) { + super(message); + } + + public ScmException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMImpl.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMImpl.java index 3201002e4..3bc424d10 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMImpl.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMImpl.java @@ -11,9 +11,8 @@ import jakarta.inject.Inject; import org.apache.commons.io.FileUtils; -import org.apache.maven.scm.ScmException; import org.jboss.da.scm.api.SCM; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; import org.jboss.pnc.common.log.LogSanitizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +33,8 @@ public class SCMImpl implements SCM { SCMCache cache; @Override - public File cloneRepository(SCMType scmType, String scmUrl, String revision) throws ScmException { - SCMSpecifier spec = new SCMSpecifier(scmType, scmUrl, revision); + public File cloneRepository(String scmUrl, String revision) throws ScmException { + SCMSpecifier spec = new SCMSpecifier(scmUrl, revision); FutureReference fref = cache.get(spec); @@ -47,7 +46,7 @@ public File cloneRepository(SCMType scmType, String scmUrl, String revision) thr LogSanitizer.clean(spec.toString()), LogSanitizer.clean(tempDir.toString())); try { - scm.shallowCloneRepository(scmType, scmUrl, revision, tempDir); + scm.cloneRepository(scmUrl, revision, tempDir); DirectoryReference ref = new DirectoryReference(tempDir); fref.complete(ref); return tempDir; diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMSpecifier.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMSpecifier.java index 53e25a752..aa009372e 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMSpecifier.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/SCMSpecifier.java @@ -1,7 +1,5 @@ package org.jboss.da.scm.impl; -import org.jboss.da.scm.api.SCMType; - import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -16,9 +14,6 @@ @ToString public class SCMSpecifier { - @Getter - private final SCMType scmType; - @Getter private final String scmUrl; diff --git a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java index 8de292600..035618e93 100644 --- a/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java +++ b/source-code-manager/src/main/java/org/jboss/da/scm/impl/ScmFacade.java @@ -5,17 +5,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; -import org.apache.maven.scm.ScmFileSet; -import org.apache.maven.scm.ScmTag; -import org.apache.maven.scm.command.checkout.CheckOutScmResult; -import org.apache.maven.scm.manager.BasicScmManager; -import org.apache.maven.scm.manager.NoSuchScmProviderException; -import org.apache.maven.scm.manager.ScmManager; -import org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider; -import org.apache.maven.scm.repository.ScmRepository; -import org.apache.maven.scm.repository.ScmRepositoryException; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.scm.impl.git.GitCommands; import org.jboss.da.scm.impl.git.GitException; @@ -25,74 +15,29 @@ @ApplicationScoped public class ScmFacade { - private final ScmManager scmManager; - @Inject GitCommands gitCommands; - public ScmFacade() { - scmManager = new BasicScmManager(); - - // git is handled via the git command (see GitCommands) - // add new (non-git) providers here - scmManager.setScmProvider(SCMType.SVN.toString(), new SvnExeScmProvider()); - } - /** - * Tries to do a shallow clone (clone only the requested revision) of the remote repository to the local directory. - * If it is not possible to do that, then it does the full clone. - * For a git repository, it tries to do it using the git tool, otherwise uses ScmManager. + * Clones the remote repository at the given revision to the local directory. + * The revision is cloned shallowly if possible, otherwise the whole repository is cloned. * - * @param scmType Type of the repository * @param scmUrl URL to the repository * @param revision Revision of the repository, which should be cloned * @param cloneTo Directory, where the repository should be cloned * @throws ScmException Thrown if the clone of the repository fails */ - public void shallowCloneRepository(SCMType scmType, String scmUrl, String revision, File cloneTo) - throws ScmException { + public void cloneRepository(String scmUrl, String revision, File cloneTo) throws ScmException { if (!cloneTo.exists()) { cloneTo.mkdir(); } - if (scmType == SCMType.GIT) { - try { - gitCommands.cloneRepository(scmUrl, revision, cloneTo); - } catch (GitException ex) { - throw new ScmException( - "Cloning of git repository " + scmUrl + " at revision " + revision + " failed.", - ex); - } - return; - } - - cloneRepository(scmType, scmUrl, revision, cloneTo); - } - - /** - * Process full clone of the remote repository to the local directory. - * - * @param scmType Type of the repository - * @param scmUrl URL to the repository - * @param revision Revision of the repository, which should be cloned - * @param cloneTo Directory, where the repository should be cloned - * @throws ScmException Thrown if the clone of the repository fails - */ - public void cloneRepository(SCMType scmType, String scmUrl, String revision, File cloneTo) throws ScmException { - ScmRepository repo = getScmRepository(scmType.getSCMUrl(scmUrl), scmManager); - CheckOutScmResult checkOut = scmManager.checkOut(repo, new ScmFileSet(cloneTo), new ScmTag(revision)); - if (!checkOut.isSuccess()) { - throw new ScmException("Repository was not cloned: " + checkOut.getProviderMessage()); - } - } - - private ScmRepository getScmRepository(String scmUrl, ScmManager scmManager) throws ScmException { try { - return scmManager.makeScmRepository(scmUrl); - } catch (NoSuchScmProviderException ex) { - throw new ScmException("Could not find a provider.", ex); - } catch (ScmRepositoryException ex) { - throw new ScmException("Error while connecting to the repository", ex); + gitCommands.cloneRepository(scmUrl, revision, cloneTo); + } catch (GitException ex) { + throw new ScmException( + "Cloning of git repository " + scmUrl + " at revision " + revision + " failed.", + ex); } } -} +} \ No newline at end of file diff --git a/testsuite/src/test/java/org/jboss/da/test/server/communication/GalleyWrapperTestIT.java b/testsuite/src/test/java/org/jboss/da/test/server/communication/GalleyWrapperTestIT.java index 9b8557493..4b0c44fe1 100644 --- a/testsuite/src/test/java/org/jboss/da/test/server/communication/GalleyWrapperTestIT.java +++ b/testsuite/src/test/java/org/jboss/da/test/server/communication/GalleyWrapperTestIT.java @@ -12,7 +12,6 @@ import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; import org.commonjava.maven.galley.maven.parse.MavenPomReader; import org.commonjava.maven.galley.maven.rel.MavenModelProcessor; import org.commonjava.maven.galley.maven.rel.ModelProcessorConfig; @@ -25,7 +24,7 @@ import org.jboss.da.communication.repository.model.GAVDependencyTree; import org.jboss.da.model.rest.GAV; import org.jboss.da.scm.api.SCM; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.test.server.AbstractServerTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -76,7 +75,7 @@ public class GalleyWrapperTestIT extends AbstractServerTest { @BeforeEach public void cloneRepo() throws ScmException { clonedRepository = scm - .cloneRepository(SCMType.GIT, "https://github.com/project-ncl/dependency-analysis.git", VERSION); + .cloneRepository("https://github.com/project-ncl/dependency-analysis.git", VERSION); } private void printDeptree(GAVDependencyTree tree, String prefix) { diff --git a/testsuite/src/test/java/org/jboss/da/test/server/communication/SCMRemoteTestIT.java b/testsuite/src/test/java/org/jboss/da/test/server/communication/SCMRemoteTestIT.java index c3b294de5..445bff952 100644 --- a/testsuite/src/test/java/org/jboss/da/test/server/communication/SCMRemoteTestIT.java +++ b/testsuite/src/test/java/org/jboss/da/test/server/communication/SCMRemoteTestIT.java @@ -9,11 +9,11 @@ import jakarta.inject.Inject; -import org.apache.maven.scm.ScmException; import org.jboss.da.communication.pom.PomAnalysisException; import org.jboss.da.communication.repository.model.GAVDependencyTree; import org.jboss.da.communication.scm.api.SCMConnector; import org.jboss.da.model.rest.GAV; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.test.server.AbstractServerTest; import org.junit.jupiter.api.Test; diff --git a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java index 3e32d6db1..a9a146a0f 100644 --- a/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java +++ b/testsuite/src/test/java/org/jboss/da/test/server/scm/SCMTestIT.java @@ -15,8 +15,7 @@ import jakarta.inject.Inject; import org.apache.commons.io.FileUtils; -import org.apache.maven.scm.ScmException; -import org.jboss.da.scm.api.SCMType; +import org.jboss.da.scm.api.ScmException; import org.jboss.da.scm.impl.ScmFacade; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -34,7 +33,7 @@ private void testDaGitClone(String scmUrl) throws Exception { try { // the git commit is actually the one for tag 0.2.0 - scm.shallowCloneRepository(SCMType.GIT, scmUrl, "05ea9e1", tempDir.toFile()); + scm.cloneRepository(scmUrl, "05ea9e1", tempDir.toFile()); Path pomPath = Paths.get(tempDir.toString(), "pom.xml"); assertTrue(pomPath.toFile().exists()); @@ -92,8 +91,7 @@ public void shouldBeAbleToCloneGitTag() throws Exception { Path tempDir = Files.createTempDirectory("da_temp_git_clone"); try { - scm.shallowCloneRepository( - SCMType.GIT, + scm.cloneRepository( "https://github.com/project-ncl/dependency-analysis.git", "0.4.2", tempDir.toFile()); @@ -116,37 +114,4 @@ public void shouldBeAbleToCloneGitTag() throws Exception { } } - @Disabled - @Test - public void shouldCloneSvnRepository() throws Exception { - Path tempDir = Files.createTempDirectory("da_temp_svn_checkout"); - - try { - // revision makes no sense for SVN - scm.shallowCloneRepository( - SCMType.SVN, - "http://svn.apache.org/repos/asf/commons/proper/cli/tags/cli-1.3.1/", - "", - tempDir.toFile()); - - Path pomPath = Paths.get(tempDir.toString(), "pom.xml"); - assertTrue(pomPath.toFile().exists()); - - // check if the pom.xml we checkout has version 0.2.0 - boolean checkoutVersionOneThreeOne = false; - - Scanner scanner = new Scanner(pomPath.toFile()); - - // old-school xml reading - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - if (line.trim().equals("1.3.1")) { - checkoutVersionOneThreeOne = true; - } - } - assertTrue(checkoutVersionOneThreeOne); - } finally { - FileUtils.deleteDirectory(tempDir.toFile()); - } - } }