From cfbc691c7c75a8ba9c20d0cd499a77d555d2934b Mon Sep 17 00:00:00 2001
From: liaozan <378024053@qq.com>
Date: Wed, 26 Jul 2023 10:10:45 +0800
Subject: [PATCH] Polish
---
initializer-backend/pom.xml | 6 +-
.../initializer/runner/ArchetypePreparer.java | 2 +-
.../initializer/service/ArchetypeService.java | 51 ++++++-----
.../initializer/util/GitlabUtils.java | 89 +++++++++++++++++++
.../{maven => util}/MavenUtils.java | 88 ++----------------
5 files changed, 127 insertions(+), 109 deletions(-)
create mode 100644 initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java
rename initializer-backend/src/main/java/com/schbrain/archetype/initializer/{maven => util}/MavenUtils.java (51%)
diff --git a/initializer-backend/pom.xml b/initializer-backend/pom.xml
index 7a4a379..6ab0916 100644
--- a/initializer-backend/pom.xml
+++ b/initializer-backend/pom.xml
@@ -63,8 +63,8 @@
integration-maven-plugin
- pl.project13.maven
- git-commit-id-plugin
+ io.github.git-commit-id
+ git-commit-id-maven-plugin
maven-resources-plugin
@@ -93,4 +93,4 @@
-
\ No newline at end of file
+
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
index f59ad12..9334415 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java
@@ -3,7 +3,7 @@ package com.schbrain.archetype.initializer.runner;
import cn.hutool.core.io.FileUtil;
import cn.hutool.system.SystemUtil;
import com.schbrain.archetype.initializer.config.properties.ArchetypeProperties;
-import com.schbrain.archetype.initializer.maven.MavenUtils;
+import com.schbrain.archetype.initializer.util.MavenUtils;
import com.schbrain.common.exception.BaseException;
import com.schbrain.common.util.EnvUtils;
import com.schbrain.framework.support.spring.OnceApplicationContextEventListener;
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
index 346934a..e737c56 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java
@@ -1,15 +1,18 @@
package com.schbrain.archetype.initializer.service;
+import cn.hutool.cache.Cache;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.io.file.PathUtil;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.system.SystemUtil;
-import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.archetype.initializer.response.PreviewFileTree;
+import com.schbrain.archetype.initializer.util.GitlabUtils;
+import com.schbrain.archetype.initializer.util.MavenUtils;
import com.schbrain.common.exception.BaseException;
import com.schbrain.common.web.utils.ServletUtils;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -24,6 +27,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.time.Duration;
import java.util.Arrays;
import java.util.Comparator;
@@ -41,24 +45,31 @@ public class ArchetypeService {
private static final String GITKEEP = ".gitkeep";
- private final TimedCache archetypeNameCache = new TimedCache<>(Duration.ofHours(1).toMillis());
+ private final Cache archetypeNameCache = new TimedCache<>(Duration.ofMinutes(5).toMillis());
private final Path gitKeepFile = createGitKeepFile(SystemUtil.getUserInfo().getTempDir());
public String generate(ArchetypeGenerateParam param) throws FileNotFoundException {
- String generateId = MavenUtils.generate(param);
- archetypeNameCache.put(generateId, param.getArtifactId());
- preview(generateId);
- return generateId;
+ Pair generated = MavenUtils.generate(param);
+ String generatedId = generated.getKey();
+ File generatedFile = generated.getRight();
+ // generate .gitkeep
+ preview(generatedId);
+ archetypeNameCache.put(generatedId, param.getArtifactId());
+ if (param.isInitGitRepo()) {
+ Path directory = Paths.get(generatedFile.getAbsolutePath(), param.getArtifactId());
+ GitlabUtils.initGitRepo(directory, param.getRepoGroupId(), param);
+ }
+ return generatedId;
}
- public List preview(String id) throws FileNotFoundException {
- File generatedFiles = getGeneratedFiles(id);
+ public List preview(String generatedId) throws FileNotFoundException {
+ File generatedFiles = getGeneratedFiles(generatedId);
return List.of(buildFileTree(generatedFiles));
}
- public void download(String id) throws IOException {
- File generatedFiles = ZipUtil.zip(getGeneratedFiles(id));
+ public void download(String generatedId) throws IOException {
+ File generatedFiles = ZipUtil.zip(getGeneratedFiles(generatedId));
FileInputStream inputStream = new FileInputStream(generatedFiles);
HttpServletResponse response = ServletUtils.getResponse();
response.addHeader(HttpHeaders.CONTENT_DISPOSITION, contentDisposition(generatedFiles));
@@ -66,10 +77,10 @@ public class ArchetypeService {
StreamUtils.copy(inputStream, response.getOutputStream());
}
- private PreviewFileTree buildFileTree(File root) {
- File[] fileItems = Optional.ofNullable(root.listFiles()).orElse(new File[0]);
+ private PreviewFileTree buildFileTree(File directory) {
+ File[] fileItems = Optional.ofNullable(directory.listFiles()).orElse(new File[0]);
if (fileItems.length == 0) {
- Path target = Path.of(root.getPath(), GITKEEP);
+ Path target = Path.of(directory.getPath(), GITKEEP);
fileItems = new File[]{PathUtil.copy(gitKeepFile, target).toFile()};
}
List children = Arrays.stream(fileItems)
@@ -84,7 +95,7 @@ public class ArchetypeService {
})
.sorted(Comparator.comparing(PreviewFileTree::getIsFile))
.collect(Collectors.toList());
- return new PreviewFileTree(root, children);
+ return new PreviewFileTree(directory, children);
}
private Path createGitKeepFile(String directory) {
@@ -97,12 +108,12 @@ public class ArchetypeService {
}
}
- private File getGeneratedFiles(String id) throws FileNotFoundException {
- File archetypeDirectory = MavenUtils.getArchetypeDirectory(id);
+ private File getGeneratedFiles(String generatedId) throws FileNotFoundException {
+ File archetypeDirectory = MavenUtils.getArchetypeDirectory(generatedId);
if (!archetypeDirectory.exists()) {
throw new FileNotFoundException(archetypeDirectory.getAbsolutePath());
}
- String artifactId = archetypeNameCache.get(id);
+ String artifactId = archetypeNameCache.get(generatedId);
if (!StringUtils.hasText(artifactId)) {
throw new FileNotFoundException("文件已过期,请重新生成");
}
@@ -110,11 +121,7 @@ public class ArchetypeService {
}
private String contentDisposition(File file) {
- return ContentDisposition
- .attachment()
- .filename(file.getName())
- .build()
- .toString();
+ return ContentDisposition.attachment().filename(file.getName()).build().toString();
}
}
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java
new file mode 100644
index 0000000..0acf675
--- /dev/null
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/GitlabUtils.java
@@ -0,0 +1,89 @@
+package com.schbrain.archetype.initializer.util;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
+import com.schbrain.common.exception.BaseException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.URIish;
+import org.gitlab4j.api.GitLabApi;
+import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.ProtectedBranchesApi;
+import org.gitlab4j.api.models.Group;
+import org.gitlab4j.api.models.Project;
+import org.gitlab4j.api.models.ProtectedBranch;
+
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.util.List;
+
+/**
+ * @author liaozan
+ * @since 2023/7/26
+ */
+@Slf4j
+public class GitlabUtils {
+
+ private static final List ADDITIONAL_BRANCHES = List.of("release", "main");
+
+ public static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) {
+ try {
+ Git git = Git.init().setInitialBranch("develop").setDirectory(directory.toFile()).call();
+ git.add().addFilepattern(".").call();
+ git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call();
+ for (String branch : ADDITIONAL_BRANCHES) {
+ git.checkout().setName(branch).setCreateBranch(true).call();
+ }
+
+ if (repoGroupId != null) {
+ GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class);
+ Group group = gitLabApi.getGroupApi().getGroup(repoGroupId);
+ String groupPath = group.getFullPath();
+ String projectName = param.getArtifactId();
+ String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, projectName);
+ URIish urIish = new URIish(repositoryUrl);
+ git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call();
+ git.push()
+ .setRemote("origin")
+ .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class))
+ .setPushAll()
+ .setForce(true)
+ .call();
+ Project project = getProject(gitLabApi, groupPath, projectName);
+ if (project == null) {
+ return;
+ }
+ updateProtectedBranches(gitLabApi, project);
+ updateProjectDefaultBranch(gitLabApi, project);
+ }
+ } catch (GitAPIException | GitLabApiException | URISyntaxException e) {
+ log.warn("Git repo init failed", e);
+ throw new BaseException("Git仓库初始化失败");
+ }
+ }
+
+ private static Project getProject(GitLabApi gitLabApi, String groupPath, String projectName) throws GitLabApiException {
+ String projectPath = String.format("%s/%s", groupPath, projectName);
+ return gitLabApi.getProjectApi().getProject(projectPath);
+ }
+
+ private static void updateProjectDefaultBranch(GitLabApi gitLabApi, Project project) throws GitLabApiException {
+ project.setDefaultBranch("main");
+ gitLabApi.getProjectApi().updateProject(project);
+ }
+
+ private static void updateProtectedBranches(GitLabApi gitlabApi, Project project) throws GitLabApiException {
+ ProtectedBranchesApi protectedBranchesApi = gitlabApi.getProtectedBranchesApi();
+ String projectPath = project.getPathWithNamespace();
+ List protectedBranches = protectedBranchesApi.getProtectedBranches(projectPath);
+ if (CollectionUtils.isNotEmpty(protectedBranches)) {
+ for (ProtectedBranch protectedBranch : protectedBranches) {
+ protectedBranchesApi.unprotectBranch(projectPath, protectedBranch.getName());
+ }
+ }
+ }
+
+}
diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java
similarity index 51%
rename from initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
rename to initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java
index 6851eb2..99b5abf 100644
--- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java
+++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/util/MavenUtils.java
@@ -1,36 +1,21 @@
-package com.schbrain.archetype.initializer.maven;
+package com.schbrain.archetype.initializer.util;
import cn.hutool.core.io.FileUtil;
-import cn.hutool.extra.spring.SpringUtil;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
-import com.schbrain.common.exception.BaseException;
import com.schbrain.common.util.IdWorker;
import com.schbrain.common.util.JacksonUtils;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.maven.cli.MavenCli;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.io.DefaultSettingsWriter;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.URIish;
-import org.gitlab4j.api.GitLabApi;
-import org.gitlab4j.api.GitLabApiException;
-import org.gitlab4j.api.ProtectedBranchesApi;
-import org.gitlab4j.api.models.Group;
-import org.gitlab4j.api.models.Project;
-import org.gitlab4j.api.models.ProtectedBranch;
import java.io.File;
import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Collections;
-import java.util.List;
import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY;
@@ -43,8 +28,6 @@ public class MavenUtils {
private static final File SETTINGS_FILE = new File(MavenCli.USER_MAVEN_CONFIGURATION_HOME, "settings.xml");
- private static final List ADDITIONAL_BRANCHES = List.of("release", "main");
-
static {
System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME");
initSettingsFile();
@@ -57,7 +40,7 @@ public class MavenUtils {
log.info("Success install archive from : {}", workDirectory);
}
- public static String generate(ArchetypeGenerateParam param) {
+ public static Pair generate(ArchetypeGenerateParam param) {
log.info("Prepare to generate archetype project: {}", JacksonUtils.toJsonString(param, true));
String id = IdWorker.getIdStr();
File archetype = getArchetypeDirectory(id);
@@ -65,11 +48,7 @@ public class MavenUtils {
String[] args = getArchetypeGenerateArgs(param, SETTINGS_FILE.getAbsolutePath(), outputDirectory);
MavenCli.doMain(args, null);
log.info("Generate archetype project at {}", outputDirectory);
- if (param.isInitGitRepo()) {
- Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId());
- initGitRepo(directory, param.getRepoGroupId(), param);
- }
- return id;
+ return ImmutablePair.of(id, archetype);
}
public static File getArchetypeDirectory(String id) {
@@ -77,52 +56,6 @@ public class MavenUtils {
return new File(tmpDirPath, id);
}
- private static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) {
- try {
- Git git = Git.init().setInitialBranch("develop").setDirectory(directory.toFile()).call();
- git.add().addFilepattern(".").call();
- git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call();
- for (String branch : ADDITIONAL_BRANCHES) {
- git.checkout().setName(branch).setCreateBranch(true).call();
- }
-
- if (repoGroupId != null) {
- GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class);
- Group group = gitLabApi.getGroupApi().getGroup(repoGroupId);
- String groupPath = group.getFullPath();
- String projectName = param.getArtifactId();
- String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, projectName);
- URIish urIish = new URIish(repositoryUrl);
- git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call();
- git.push()
- .setRemote("origin")
- .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class))
- .setPushAll()
- .setForce(true)
- .call();
- Project project = getProject(gitLabApi, groupPath, projectName);
- if (project == null) {
- return;
- }
- updateProjectDefaultBranch(gitLabApi, project);
- updateProtectedBranches(gitLabApi, project);
- }
- } catch (GitAPIException | GitLabApiException | URISyntaxException e) {
- log.warn("Git repo init failed", e);
- throw new BaseException("Git仓库初始化失败");
- }
- }
-
- private static void updateProjectDefaultBranch(GitLabApi gitLabApi, Project project) throws GitLabApiException {
- project.setDefaultBranch("main");
- gitLabApi.getProjectApi().updateProject(project);
- }
-
- private static Project getProject(GitLabApi gitLabApi, String groupPath, String projectName) throws GitLabApiException {
- String projectPath = String.format("%s/%s", groupPath, projectName);
- return gitLabApi.getProjectApi().getProject(projectPath);
- }
-
private static void initSettingsFile() {
Settings settings = new Settings();
settings.setLocalRepository("/data/maven/repository");
@@ -184,15 +117,4 @@ public class MavenUtils {
};
}
- private static void updateProtectedBranches(GitLabApi gitlabApi, Project project) throws GitLabApiException {
- ProtectedBranchesApi protectedBranchesApi = gitlabApi.getProtectedBranchesApi();
- String projectPath = project.getPathWithNamespace();
- List protectedBranches = protectedBranchesApi.getProtectedBranches(projectPath);
- if (CollectionUtils.isNotEmpty(protectedBranches)) {
- for (ProtectedBranch protectedBranch : protectedBranches) {
- protectedBranchesApi.unprotectBranch(projectPath, protectedBranch.getName());
- }
- }
- }
-
}
--
GitLab