From f3599e6ed662a70bcbe2bf17f8733c61e19bfbf7 Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Thu, 14 Apr 2022 00:16:15 +0800 Subject: [PATCH] feat: support init git repo --- .../initializer/maven/MavenUtils.java | 20 +++++++++++++++++++ .../param/ArchetypeGenerateParam.java | 4 ++++ .../initializer/service/ArchetypeService.java | 10 +++++++--- initializer-ui/package.json | 6 +++--- initializer-ui/src/components/starter.vue | 9 +++++++-- 5 files changed, 41 insertions(+), 8 deletions(-) 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/maven/MavenUtils.java index 4130e3e..41414ee 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java @@ -2,6 +2,7 @@ package com.schbrain.archetype.initializer.maven; import cn.hutool.core.io.FileUtil; 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; @@ -10,9 +11,13 @@ 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 java.io.File; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collections; import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY; @@ -47,6 +52,9 @@ public class MavenUtils { String[] args = getArchetypeGenerateArgs(param, getSettingsFile().getAbsolutePath(), outputDirectory); mavenCli.doMain(args, null, System.out, System.err); log.info("Generate archetype project at {}", outputDirectory); + if (param.isInitGitRepo()) { + initGitRepo(Paths.get(archetype.getAbsolutePath(), param.getArtifactId())); + } return id; } @@ -55,6 +63,18 @@ public class MavenUtils { return new File(tmpDirPath, id); } + private static void initGitRepo(Path directory) { + try { + Git git = Git.init().setDirectory(directory.toFile()).call(); + git.add().addFilepattern(".").call(); + git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call(); + git.close(); + } catch (GitAPIException e) { + log.warn("Git repo init failed", e); + throw new BaseException("Git仓库初始化失败"); + } + } + private static File getSettingsFile() { if (SETTINGS_FILE.exists()) { return SETTINGS_FILE; diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java index d42e967..7cdf493 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java @@ -36,6 +36,10 @@ public class ArchetypeGenerateParam { * 子模块前缀 */ private String subModuleNamePrefix; + /** + * 是否初始化 git 仓库 + */ + private boolean initGitRepo; public String getSubModuleNamePrefix() { if (!StringUtils.hasText(this.subModuleNamePrefix)) { 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 f992d03..baeeddf 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,5 +1,6 @@ package com.schbrain.archetype.initializer.service; +import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ZipUtil; import com.schbrain.archetype.initializer.maven.MavenUtils; @@ -13,17 +14,17 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; +import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.time.Duration; import java.util.Arrays; import java.util.Comparator; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -33,7 +34,7 @@ import java.util.stream.Collectors; @Service public class ArchetypeService { - private final Map archetypeNameCache = new ConcurrentHashMap<>(); + private final TimedCache archetypeNameCache = new TimedCache<>(Duration.ofDays(1).toMillis()); @Autowired private ArchetypePreparer archetypePreparer; @@ -89,6 +90,9 @@ public class ArchetypeService { throw new FileNotFoundException(archetypeDirectory.getAbsolutePath()); } String artifactId = archetypeNameCache.get(id); + if (!StringUtils.hasText(artifactId)) { + throw new FileNotFoundException("文件已过期,请重新生成"); + } return new File(archetypeDirectory, artifactId); } diff --git a/initializer-ui/package.json b/initializer-ui/package.json index d259595..e165a62 100644 --- a/initializer-ui/package.json +++ b/initializer-ui/package.json @@ -6,7 +6,7 @@ "build": "vite build --mode production" }, "dependencies": { - "vue": "^3.2.31", + "vue": "^3.2.32", "axios": "^0.26.1", "ant-design-vue": "^3.1.1", "highlight.js": "^11.5.1", @@ -15,7 +15,7 @@ "devDependencies": { "@vitejs/plugin-vue": "^2.3.1", "typescript": "^4.6.3", - "vite": "^2.9.1", - "vue-tsc": "^0.34.5" + "vite": "^2.9.2", + "vue-tsc": "^0.34.6" } } \ No newline at end of file diff --git a/initializer-ui/src/components/starter.vue b/initializer-ui/src/components/starter.vue index 16dfbfa..415b041 100644 --- a/initializer-ui/src/components/starter.vue +++ b/initializer-ui/src/components/starter.vue @@ -15,6 +15,9 @@ + + 初始化 Git 仓库 +
生成 @@ -46,7 +49,8 @@ interface FormState { groupId: string, artifactId: string, version: string, - packageName: string + packageName: string, + initGitRepo: boolean } interface FileNode { @@ -70,7 +74,8 @@ const formState = reactive({ groupId: '', artifactId: '', version: '1.0.0-SNAPSHOT', - packageName: '' + packageName: '', + initGitRepo: true }) const formRules = { -- GitLab