feat: ASW-87 新增 application branch 接口

This commit is contained in:
shizhendong
2024-10-11 11:05:51 +08:00
parent 46d9614603
commit 9a85280ca2
4 changed files with 257 additions and 0 deletions

View File

@@ -179,6 +179,13 @@
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>7.0.0.202409031743-r</version>
</dependency>
</dependencies>
<build>

View File

@@ -0,0 +1,52 @@
package net.geedge.asw.module.app.controller;
import net.geedge.asw.common.util.ASWException;
import net.geedge.asw.common.util.R;
import net.geedge.asw.common.util.RCode;
import net.geedge.asw.common.util.T;
import net.geedge.asw.module.app.service.IGitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/workspace")
public class GitController {
@Autowired
private IGitService gitService;
@GetMapping("/{workspaceId}/branch")
public R listBranch(@PathVariable("workspaceId") String workspaceId,
@RequestParam(value = "search", required = false) String search) {
List<Map<Object, Object>> list = gitService.listBranch(workspaceId, search);
return R.ok().putData("record", list);
}
@GetMapping("/{workspaceId}/branch/{branchName}")
public R infoBranch(@PathVariable("workspaceId") String workspaceId, @PathVariable("branchName") String branchName) {
Map<Object, Object> record = gitService.infoBranch(workspaceId, branchName);
return R.ok().putData("record", record);
}
@PostMapping("/{workspaceId}/branch")
public R newBranch(@PathVariable("workspaceId") String workspaceId, @RequestBody Map<String, String> requestBody) {
String branch = T.MapUtil.getStr(requestBody, "branch", "");
String ref = T.MapUtil.getStr(requestBody, "ref", "");
if (T.StrUtil.hasEmpty(branch, ref)) {
throw new ASWException(RCode.PARAM_CANNOT_EMPTY);
}
Map<Object, Object> record = gitService.newBranch(workspaceId, branch, ref);
return R.ok().putData("record", record);
}
@DeleteMapping("/{workspaceId}/branch/{branchName}")
public R deleteBranch(@PathVariable("workspaceId") String workspaceId, @PathVariable("branchName") String branchName) {
gitService.deleteBranch(workspaceId, branchName);
return R.ok();
}
}

View File

@@ -0,0 +1,16 @@
package net.geedge.asw.module.app.service;
import java.util.List;
import java.util.Map;
public interface IGitService {
List<Map<Object, Object>> listBranch(String workspaceId, String search);
Map<Object, Object> infoBranch(String workspaceId, String branchName);
Map<Object, Object> newBranch(String workspaceId, String branchName, String ref);
void deleteBranch(String workspaceId, String branchName);
}

View File

@@ -0,0 +1,182 @@
package net.geedge.asw.module.app.service.impl;
import cn.hutool.log.Log;
import net.geedge.asw.common.util.ASWException;
import net.geedge.asw.common.util.RCode;
import net.geedge.asw.common.util.T;
import net.geedge.asw.module.app.service.IGitService;
import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
import net.geedge.asw.module.workspace.service.IWorkspaceService;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class GitServiceImpl implements IGitService {
private final static Log log = Log.get();
/**
* 本地分支引用前缀
*/
public static final String LOCAL_BRANCH_PREFIX = "refs/heads/";
@Autowired
private IWorkspaceService workspaceService;
/**
* get repository path
* path= {webRootPath}/workspeace/{workspace.name}
*/
private File getRepoDirPath(String workspaceId) {
WorkspaceEntity workspace = workspaceService.getById(workspaceId);
File repoDir = T.FileUtil.file(T.WebPathUtil.getRootPath(), "workspeace", workspace.getName());
return repoDir;
}
/**
* get git instance
*/
private Git getGitInstance(File repoDir) {
try {
if (T.FileUtil.exist(repoDir) && T.FileUtil.file(repoDir, ".git").exists()) {
log.info("[getGitInstance] [open exist repository] [path: {}]", repoDir);
FileRepositoryBuilder builder = new FileRepositoryBuilder();
builder.setGitDir(T.FileUtil.file(repoDir, ".git"));
builder.readEnvironment();
builder.findGitDir();
return new Git(builder.build());
} else {
log.info("[getGitInstance] [init new repository] [path: {}]", repoDir);
// init
Git git = Git.init().setDirectory(repoDir).call();
// config
StoredConfig config = git.getRepository().getConfig();
config.setString("user", null, "name", "asw");
config.setString("user", null, "email", "asw@geedgenetworks.com");
config.save();
return git;
}
} catch (IOException | GitAPIException | IllegalStateException e) {
log.error(e, "[getGitInstance] [error] [path: {}]", repoDir);
throw new RuntimeException(e);
}
}
@Override
public List<Map<Object, Object>> listBranch(String workspaceId, String search) {
List<Map<Object, Object>> resultList = T.ListUtil.list(true);
File repoDir = this.getRepoDirPath(workspaceId);
try (Git git = this.getGitInstance(repoDir)) {
// List<Ref> call = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
// 默认行为,进查询本地分支
List<Ref> call = git.branchList().call();
RevWalk revCommits = new RevWalk(git.getRepository());
for (Ref ref : call) {
String branchName = ref.getName();
// 返回时去掉前缀
branchName = branchName.replaceAll(LOCAL_BRANCH_PREFIX, "");
if (T.StrUtil.isNotEmpty(search)) {
if (!T.StrUtil.contains(branchName, search)) {
continue;
}
}
Map<Object, Object> m = T.MapUtil.builder()
.put("name", branchName)
.build();
RevCommit commit = revCommits.parseCommit(ref.getObjectId());
List<String> parentIds = Arrays.stream(commit.getParents()).map(RevCommit::getName).collect(Collectors.toList());
Map<Object, Object> m1 = new LinkedHashMap<>();
m1.put("id", commit.getName());
m1.put("shortId", T.StrUtil.subPre(commit.getName(), 8));
m1.put("createdAt", commit.getCommitTime());
m1.put("title", commit.getShortMessage());
m1.put("message", commit.getFullMessage());
m1.put("parentIds", parentIds);
PersonIdent authorIdent = commit.getAuthorIdent();
m1.put("authorName", authorIdent.getName());
m1.put("authorEmail", authorIdent.getEmailAddress());
m1.put("authoredDate", authorIdent.getWhen().getTime());
PersonIdent committerIdent = commit.getCommitterIdent();
m1.put("committerName", committerIdent.getName());
m1.put("committerEmail", committerIdent.getEmailAddress());
m1.put("committedDate", committerIdent.getWhen().getTime());
m.put("commit", m1);
resultList.add(m);
}
} catch (GitAPIException | IOException e) {
log.error(e, "[listBranch] [error] [workspaceId: {}]", workspaceId);
throw new ASWException(RCode.ERROR);
}
return resultList;
}
@Override
public Map<Object, Object> infoBranch(String workspaceId, String branchName) {
List<Map<Object, Object>> listBranch = this.listBranch(workspaceId, branchName);
// 分支不存在
if (T.CollUtil.isEmpty(listBranch)) {
throw new ASWException(RCode.SYS_RECORD_NOT_FOUND);
}
return T.CollUtil.getFirst(listBranch);
}
@Override
public Map<Object, Object> newBranch(String workspaceId, String branchName, String ref) {
File repoDir = this.getRepoDirPath(workspaceId);
try (Git git = this.getGitInstance(repoDir)) {
git.branchCreate()
.setName(branchName)
.setStartPoint(ref)
.call();
return this.infoBranch(workspaceId, branchName);
} catch (GitAPIException e) {
log.error(e, "[newBranch] [error] [workspaceId: {}] [branchName: {}] [ref: {}]", workspaceId, branchName, ref);
throw new ASWException(RCode.ERROR);
}
}
@Override
public void deleteBranch(String workspaceId, String branchName) {
File repoDir = this.getRepoDirPath(workspaceId);
try (Git git = this.getGitInstance(repoDir)) {
git.branchDelete()
.setBranchNames(branchName)
.call();
} catch (GitAPIException e) {
log.error(e, "[deleteBranch] [error] [workspaceId: {}] [branchName: {}]", workspaceId, branchName);
throw new ASWException(RCode.ERROR);
}
}
}