feat: ASW-87 新增 application branch 接口
This commit is contained in:
7
pom.xml
7
pom.xml
@@ -179,6 +179,13 @@
|
|||||||
<version>2.12.0</version>
|
<version>2.12.0</version>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user