diff --git a/git-scm-handler-helper/pom.xml b/git-scm-handler-helper/pom.xml
new file mode 100644
index 00000000..037a9c3f
--- /dev/null
+++ b/git-scm-handler-helper/pom.xml
@@ -0,0 +1,18 @@
+
+ 4.0.0
+
+ io.github.Riduidel.aadarchi
+ system
+ 0.1.13-SNAPSHOT
+
+ git-scm-handler-helper
+
+
+ org.eclipse.jgit
+ org.eclipse.jgit
+
+
+
+
\ No newline at end of file
diff --git a/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperator.java b/git-scm-handler-helper/src/main/java/org/ndx/aadarchi/gitlab/GitOperator.java
similarity index 68%
rename from github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperator.java
rename to git-scm-handler-helper/src/main/java/org/ndx/aadarchi/gitlab/GitOperator.java
index 3f9b124e..db5d5878 100644
--- a/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperator.java
+++ b/git-scm-handler-helper/src/main/java/org/ndx/aadarchi/gitlab/GitOperator.java
@@ -1,4 +1,4 @@
-package org.ndx.aadarchi.github;
+package org.ndx.aadarchi.gitlab;
import java.io.File;
import java.io.IOException;
@@ -8,35 +8,29 @@
import java.util.logging.Logger;
import java.util.stream.Collectors;
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-
-import org.apache.deltaspike.core.api.config.ConfigProperty;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
-import com.structurizr.annotation.Component;
-
/**
- * Component dedicated to low-level git operations
- * @author Nicolas
+ * A class providing basic it operations
*/
-@Component
-@ApplicationScoped
public class GitOperator {
- @Inject @ConfigProperty(name=Constants.CONFIG_GITHUB_LOGIN) private String login;
- @Inject @ConfigProperty(name=Constants.CONFIG_GITHUB_TOKEN) private String token;
+ private static final Logger logger = Logger.getLogger(GitOperator.class.getName());
+ private String login;
+ private String token;
private Set branchesToCheckout;
- @Inject
- public void setBranchesToCheckout(@ConfigProperty(name=Constants.CONFIG_GIT_BRANCHES_TO_CHECKOUT, defaultValue = "develop, main, main") String names) {
+ /**
+ * Set the branches to checkout from a comma-separated string
+ * @param names
+ */
+ public void setBranchesToCheckout(String names) {
this.branchesToCheckout = Arrays.asList(names.split(",")).stream()
.map(name -> name.trim())
.collect(Collectors.toSet());
}
- @Inject Logger logger;
/**
* Clone the repo
@@ -46,10 +40,6 @@ public void setBranchesToCheckout(@ConfigProperty(name=Constants.CONFIG_GIT_BRAN
* @throws IOException if local file operation fails
*/
public void clone(String from, File into) throws GitAPIException, IOException {
- if(login==null || login.isBlank()) {
- throw new UnsupportedOperationException(
- String.format("Unable to checkout projects of no Github login is provided. Please set the %s property to a non-null value", Constants.CONFIG_GITHUB_LOGIN));
- }
if(into.exists()) {
if(new File(into, ".git").exists()) {
logger.info(String.format("%s seems to already be a git repository, we consider job's done.", into.getAbsolutePath()));
@@ -84,9 +74,29 @@ public void clone(String from, File into) throws GitAPIException, IOException {
.setAllPaths(true)
.setName(from);
}, () -> {
- logger.warning(String.format("We found none of the %s branches in remote (but found %s). Please add one to %s in order for checkout to work",
- branchesToCheckout, branchesNames, Constants.CONFIG_GIT_BRANCHES_TO_CHECKOUT));
+ logger.warning(String.format("We found none of the %s branches in remote (but found %s). Please add one to branches to checkout in order for checkout to work",
+ branchesToCheckout, branchesNames));
});
}
}
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public Set getBranchesToCheckout() {
+ return branchesToCheckout;
+ }
}
\ No newline at end of file
diff --git a/github-scm-handler/pom.xml b/github-scm-handler/pom.xml
index 7739a424..8f652200 100644
--- a/github-scm-handler/pom.xml
+++ b/github-scm-handler/pom.xml
@@ -19,6 +19,11 @@
github-vfs
${project.version}
+
+ io.github.Riduidel.aadarchi
+ git-scm-handler-helper
+ ${project.version}
+
${project.groupId}
markdown-to-asciidoc
@@ -28,11 +33,6 @@
org.kohsuke
github-api
-
-
- org.eclipse.jgit
- org.eclipse.jgit
-
com.pivovarit
throwing-function
diff --git a/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperatorProducer.java b/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperatorProducer.java
new file mode 100644
index 00000000..ad483145
--- /dev/null
+++ b/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperatorProducer.java
@@ -0,0 +1,42 @@
+package org.ndx.aadarchi.github;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.deltaspike.core.api.config.ConfigProperty;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.ListBranchCommand.ListMode;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.ndx.aadarchi.gitlab.GitOperator;
+
+import com.structurizr.annotation.Component;
+
+/**
+ * Component dedicated to low-level git operations
+ * @author Nicolas
+ */
+public class GitOperatorProducer {
+ @Produces @Named("github")
+ public GitOperator buildGitOperator(
+ @ConfigProperty(name=Constants.CONFIG_GITHUB_LOGIN) String login,
+ @ConfigProperty(name=Constants.CONFIG_GITHUB_TOKEN) String token,
+ @ConfigProperty(name=Constants.CONFIG_GIT_BRANCHES_TO_CHECKOUT, defaultValue = "develop, main, main") String names) {
+ GitOperator returned = new GitOperator();
+ returned.setLogin(login);
+ returned.setToken(token);
+ returned.setBranchesToCheckout(names);
+ return returned;
+ }
+}
\ No newline at end of file
diff --git a/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GithubSCMHandler.java b/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GithubSCMHandler.java
index 7eb531da..d7a772d1 100644
--- a/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GithubSCMHandler.java
+++ b/github-scm-handler/src/main/java/org/ndx/aadarchi/github/GithubSCMHandler.java
@@ -9,6 +9,7 @@
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
+import javax.inject.Named;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
@@ -20,6 +21,7 @@
import org.ndx.aadarchi.base.utils.FileContentCache;
import org.ndx.aadarchi.base.utils.icon.FontIcon;
import org.ndx.aadarchi.github.vfs.GitHubFileSystemProvider;
+import org.ndx.aadarchi.gitlab.GitOperator;
import com.structurizr.annotation.Component;
@@ -29,7 +31,7 @@ public class GithubSCMHandler implements SCMHandler {
@Inject Logger logger;
@Inject GitHub github;
@Inject FileContentCache fileCache;
- @Inject Instance cloner;
+ @Inject @Named("github") Instance cloner;
@Inject @FontIcon(name="github") String githubIcon;
@Inject GitHubFileSystemProvider gitHubFileSystem;
@Override
diff --git a/gitlab-scm-handler/pom.xml b/gitlab-scm-handler/pom.xml
index 2b6f69aa..0f740ebc 100644
--- a/gitlab-scm-handler/pom.xml
+++ b/gitlab-scm-handler/pom.xml
@@ -19,6 +19,11 @@
gitlab-vfs
${project.version}
+
+ io.github.Riduidel.aadarchi
+ git-scm-handler-helper
+ ${project.version}
+
org.gitlab4j
gitlab4j-api
@@ -27,6 +32,10 @@
com.pivovarit
throwing-function
+
+ com.pivovarit
+ throwing-function
+
org.junit.jupiter
junit-jupiter-api
diff --git a/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/Constants.java b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/Constants.java
index 17d133f6..78c019fd 100644
--- a/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/Constants.java
+++ b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/Constants.java
@@ -6,7 +6,9 @@
public interface Constants {
String CONFIG_GITLAB_TOKEN = ModelElementKeys.PREFIX+"gitlab.token";
+ String CONFIG_GITLAB_LOGIN = ModelElementKeys.PREFIX+"gitlab.login";
String CONFIG_GITLAB_URL = ModelElementKeys.PREFIX+"gitlab.url";
+ String CONFIG_GIT_BRANCHES_TO_CHECKOUT = ModelElementKeys.PREFIX+"git.branches.to.checkout";
static boolean isGitLabProject(GitLabApi api, String project) {
return project.contains(api.getGitLabServerUrl());
}
diff --git a/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitOperatorProducer.java b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitOperatorProducer.java
new file mode 100644
index 00000000..330ad4c9
--- /dev/null
+++ b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitOperatorProducer.java
@@ -0,0 +1,42 @@
+package org.ndx.aadarchi.gitlab;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.deltaspike.core.api.config.ConfigProperty;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.ListBranchCommand.ListMode;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.ndx.aadarchi.gitlab.GitOperator;
+
+import com.structurizr.annotation.Component;
+
+/**
+ * Component dedicated to low-level git operations
+ * @author Nicolas
+ */
+public class GitOperatorProducer {
+ @Produces @Named("gitlab")
+ public GitOperator buildGitOperator(
+ @ConfigProperty(name=Constants.CONFIG_GITLAB_LOGIN) String login,
+ @ConfigProperty(name=Constants.CONFIG_GITLAB_TOKEN) String token,
+ @ConfigProperty(name=Constants.CONFIG_GIT_BRANCHES_TO_CHECKOUT, defaultValue = "develop, main, main") String names) {
+ GitOperator returned = new GitOperator();
+ returned.setLogin(login);
+ returned.setToken(token);
+ returned.setBranchesToCheckout(names);
+ return returned;
+ }
+}
\ No newline at end of file
diff --git a/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitlabSCMHandler.java b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitlabSCMHandler.java
index 0348b162..991e6334 100644
--- a/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitlabSCMHandler.java
+++ b/gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitlabSCMHandler.java
@@ -1,21 +1,31 @@
package org.ndx.aadarchi.gitlab;
-
import java.io.File;
import java.io.IOException;
+import javax.enterprise.inject.Instance;
import javax.inject.Inject;
+import javax.inject.Named;
import org.apache.commons.vfs2.FileObject;
+import org.apache.commons.vfs2.FileSystemException;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.gitlab4j.api.GitLabApiException;
import org.ndx.aadarchi.base.enhancers.scm.SCMHandler;
import org.ndx.aadarchi.base.utils.icon.FontIcon;
+import org.ndx.aadarchi.gitlab.vfs.GitLabFileSystemProvider;
import com.structurizr.annotation.Component;
@Component
public class GitlabSCMHandler implements SCMHandler {
private @Inject GitLabContainer gitlab;
- @Inject @FontIcon(name="gitlab") String gitlabIcon;
+ @Inject @Named("gitlab") Instance cloner;
+ @Inject
+ GitLabFileSystemProvider gitlabFileSystem;
+ @Inject
+ @FontIcon(name = "gitlab")
+ String gitlabIcon;
@Override
public boolean canHandle(String project) {
@@ -34,11 +44,22 @@ public String asciidocText() {
@Override
public void checkout(String projectUrl, File checkoutLocation) throws IOException {
- throw new UnsupportedOperationException(String.format("SCMHandler#checkout(%s,%s) is not yet implemented in GitlabSCMHandler. Sorry", projectUrl, checkoutLocation.getAbsolutePath()));
+ if(Constants.isGitLabProject(gitlab.getApi(), projectUrl)) {
+ try {
+ String httpTransportUrl = gitlab.getApi().getProjectApi().getProject(projectUrl).getHttpUrlToRepo();
+ cloner.get().clone(httpTransportUrl, checkoutLocation);
+ } catch (GitLabApiException | GitAPIException e) {
+ throw new IOException(String.format("Unable to clone %s to %s", projectUrl, checkoutLocation.getAbsolutePath()), e);
+ }
+ }
}
@Override
public FileObject getProjectRoot(String project) {
- throw new UnsupportedOperationException("TODO Implement "+getClass().getSimpleName()+"#getProjectRoot()");
+ try {
+ return gitlabFileSystem.getProjectRoot(project);
+ } catch (FileSystemException e) {
+ throw new GitLabHandlerException("Unable to obtain VFS", e);
+ }
}
}
diff --git a/pom.xml b/pom.xml
index 8ae1bf5f..cb613cc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,6 +82,7 @@
structurizr-components-detector
aadarchi-test-utils
freemarker-cdi-producer
+ git-scm-handler-helper