From 00cfb4a1afd8026f69d7d231adb4e2f34f51e2b9 Mon Sep 17 00:00:00 2001 From: Nicolas Delsaux Date: Thu, 15 Feb 2024 18:58:11 +0100 Subject: [PATCH] A non-nonsense (and quite working) implementation of gitlab scm provider (because yes, I finally got the hands on a non-trivial gitlab project, and it's dope) --- git-scm-handler-helper/pom.xml | 18 +++++++ .../org/ndx/aadarchi/gitlab}/GitOperator.java | 54 +++++++++++-------- github-scm-handler/pom.xml | 10 ++-- .../aadarchi/github/GitOperatorProducer.java | 42 +++++++++++++++ .../ndx/aadarchi/github/GithubSCMHandler.java | 4 +- gitlab-scm-handler/pom.xml | 9 ++++ .../org/ndx/aadarchi/gitlab/Constants.java | 2 + .../aadarchi/gitlab/GitOperatorProducer.java | 42 +++++++++++++++ .../ndx/aadarchi/gitlab/GitlabSCMHandler.java | 29 ++++++++-- pom.xml | 1 + 10 files changed, 179 insertions(+), 32 deletions(-) create mode 100644 git-scm-handler-helper/pom.xml rename {github-scm-handler/src/main/java/org/ndx/aadarchi/github => git-scm-handler-helper/src/main/java/org/ndx/aadarchi/gitlab}/GitOperator.java (68%) create mode 100644 github-scm-handler/src/main/java/org/ndx/aadarchi/github/GitOperatorProducer.java create mode 100644 gitlab-scm-handler/src/main/java/org/ndx/aadarchi/gitlab/GitOperatorProducer.java 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