From facde0a4e15b0b22cd03107fe0eed01fdc0e11fe Mon Sep 17 00:00:00 2001 From: shizhendong Date: Wed, 13 Nov 2024 17:20:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20ASW-162=20=E8=A7=A3=E5=86=B3=20mr=20comm?= =?UTF-8?q?its,changes=20=E5=B1=95=E7=A4=BA=E4=BF=A1=E6=81=AF=E6=9C=89?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/entity/ApplicationMergeEntity.java | 3 +- .../asw/module/app/service/IGitService.java | 4 +- .../impl/ApplicationMergeServiceImpl.java | 93 +++++++++++-------- .../app/service/impl/GitServiceImpl.java | 73 ++++++++------- .../db/mapper/app/ApplicationMergeMapper.xml | 3 +- .../db/migration/V1.0.01__INIT_TABLES.sql | 3 +- 6 files changed, 103 insertions(+), 76 deletions(-) diff --git a/src/main/java/net/geedge/asw/module/app/entity/ApplicationMergeEntity.java b/src/main/java/net/geedge/asw/module/app/entity/ApplicationMergeEntity.java index 6b242eb..63cd4ef 100644 --- a/src/main/java/net/geedge/asw/module/app/entity/ApplicationMergeEntity.java +++ b/src/main/java/net/geedge/asw/module/app/entity/ApplicationMergeEntity.java @@ -15,7 +15,8 @@ public class ApplicationMergeEntity { private String id; private String sourceBranch; private String targetBranch; - private String commitId; + private String startCommitId; + private String endCommitId; private String title; private Integer removeSourceBranch = 0; private String description; diff --git a/src/main/java/net/geedge/asw/module/app/service/IGitService.java b/src/main/java/net/geedge/asw/module/app/service/IGitService.java index 939ceda..710b290 100644 --- a/src/main/java/net/geedge/asw/module/app/service/IGitService.java +++ b/src/main/java/net/geedge/asw/module/app/service/IGitService.java @@ -32,6 +32,8 @@ public interface IGitService { String getLatestCommitId(String workspaceId, String branch); + String getMergeBase(String workspaceId, String branchA, String branchB); + ObjectId insertBlobFileToDatabase(Repository repository, byte[] data) throws IOException; List> getDiffFileListInCommits(String workspaceId, String newCommitId, String oldCommitId); @@ -52,7 +54,7 @@ public interface IGitService { Map infoApplicationFileContent(String workspaceId, String branch, String applicationName, String commitId, String file); - List> listCommitAfterMergeBase(String workspaceId, String srcBranch, String tgtBranch); + List> listCommitRange(String workspaceId, String newCommitId, String oldCommitId); List getConflictFilePathInBranches(String workspaceId, String srcBranch, String tgtBranch); diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java index adf60d1..10fe30b 100644 --- a/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java @@ -39,15 +39,6 @@ public class ApplicationMergeServiceImpl extends ServiceImpl infoCommit = gitService.infoCommit(entity.getWorkspaceId(), commitId); - entity.setCommit(infoCommit); - } catch (Exception e) { - } - } - SysUserEntity user = userService.getById(entity.getCreateUserId()); entity.setCreateUser(user); return entity; @@ -57,18 +48,6 @@ public class ApplicationMergeServiceImpl extends ServiceImpl params) { Page page = new Query(ApplicationMergeEntity.class).getPage(params); List list = this.getBaseMapper().queryList(page, params); - - for (ApplicationMergeEntity mergeEntity : list) { - String commitId = mergeEntity.getCommitId(); - if (T.StrUtil.isNotEmpty(commitId)) { - try { - Map infoCommit = gitService.infoCommit(mergeEntity.getWorkspaceId(), commitId); - mergeEntity.setCommit(infoCommit); - } catch (Exception e) { - } - } - } - page.setRecords(list); return page; } @@ -81,6 +60,13 @@ public class ApplicationMergeServiceImpl extends ServiceImpl> listCommitAfterMergeBase = gitService.listCommitAfterMergeBase(workspaceId, sourceBranch, targetBranch); - return listCommitAfterMergeBase; + // newCommitId-oldCommitId 期间的提交信息 + List> commitRange = gitService.listCommitRange(workspaceId, newCommitId, oldCommitId); + return commitRange; } @Override @@ -113,14 +111,28 @@ public class ApplicationMergeServiceImpl extends ServiceImpl conflictFileList = gitService.getConflictFilePathInBranches(workspaceId, sourceBranch, targetBranch); + List conflictFileList = T.ListUtil.list(true); + // src branch changed files + String oldCommitId = entity.getStartCommitId(); + String newCommitId = null; + MergeRequestStatus mergeRequestStatus = MergeRequestStatus.getInstance(entity.getStatus()); + switch (mergeRequestStatus) { + case OPEN: { + newCommitId = gitService.getLatestCommitId(workspaceId, sourceBranch); + // open 状态下,获取 sourceBranch,targetBranch 冲突文件 + conflictFileList = gitService.getConflictFilePathInBranches(workspaceId, sourceBranch, targetBranch); + break; + } + case CLOSED: + case MERGED: { + newCommitId = entity.getEndCommitId(); + break; + } + } - // 获取 sourceBranch,targetBranch 文件差异 - String commitA = gitService.getLatestCommitId(workspaceId, sourceBranch); - String commitB = gitService.getLatestCommitId(workspaceId, targetBranch); - - List> diffFileListInCommits = gitService.getDiffFileListInCommits(workspaceId, commitA, commitB); + List> diffFileListInCommits = gitService.getDiffFileListInCommits(workspaceId, newCommitId, oldCommitId); + List finalConflictFileList = conflictFileList; diffFileListInCommits.parallelStream() .forEach(m -> { T.MapUtil.renameKey(m, "oldContent", "sourceContent"); @@ -132,19 +144,19 @@ public class ApplicationMergeServiceImpl extends ServiceImpl sourceCommit = gitService.infoCommit(workspaceId, commitA); - Map targetCommit = gitService.infoCommit(workspaceId, commitB); + Map sourceCommit = gitService.infoCommit(workspaceId, oldCommitId); + Map targetCommit = gitService.infoCommit(workspaceId, newCommitId); Map m = T.MapUtil.builder() .put("sourceBranch", sourceBranch) .put("targetBranch", targetBranch) - .put("sourceCommitId", commitA) - .put("targetCommitId", commitB) + .put("sourceCommitId", oldCommitId) + .put("targetCommitId", newCommitId) .put("sourceCommit", sourceCommit) .put("targetCommit", targetCommit) .put("files", diffFileListInCommits) @@ -243,7 +255,7 @@ public class ApplicationMergeServiceImpl extends ServiceImpl() .eq(ApplicationMergeEntity::getId, mrId) - .set(ApplicationMergeEntity::getCommitId, entity.getCommitId()) + .set(ApplicationMergeEntity::getEndCommitId, entity.getEndCommitId()) .set(ApplicationMergeEntity::getStatus, entity.getStatus()) .set(ApplicationMergeEntity::getMessage, entity.getMessage()) ); @@ -273,9 +285,12 @@ public class ApplicationMergeServiceImpl extends ServiceImpl() .eq(ApplicationMergeEntity::getId, mrId) .set(ApplicationMergeEntity::getStatus, updateStatus) + .set(ApplicationMergeEntity::getEndCommitId, latestCommitId) ); return entity; } diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/GitServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/GitServiceImpl.java index dcb15a0..4f12815 100644 --- a/src/main/java/net/geedge/asw/module/app/service/impl/GitServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/app/service/impl/GitServiceImpl.java @@ -27,7 +27,6 @@ import org.eclipse.jgit.merge.MergeStrategy; import org.eclipse.jgit.merge.RecursiveMerger; import org.eclipse.jgit.merge.ThreeWayMerger; import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevSort; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.revwalk.filter.RevFilter; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; @@ -338,6 +337,19 @@ public class GitServiceImpl implements IGitService { } } + @Override + public String getMergeBase(String workspaceId, String branchA, String branchB) { + try (Git git = this.getGitInstance(workspaceId); + Repository repository = git.getRepository();) { + ObjectId branchAId = repository.resolve(branchA); + ObjectId branchBId = repository.resolve(branchB); + + return this.getMergeBase(repository, branchAId, branchBId); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + /** * 获取 commitIdA -> commitIdB 文件差异 * @@ -348,6 +360,7 @@ public class GitServiceImpl implements IGitService { */ @Override public List> getDiffFileListInCommits(String workspaceId, String commitIdA, String commitIdB) { + log.info("[getDiffFileListInCommits] [begin] [workspaceId: {}] [commitIdA: {}] [commitIdB: {}]", workspaceId, commitIdA, commitIdB); try (Git git = this.getGitInstance(workspaceId); Repository repository = git.getRepository(); RevWalk revWalk = new RevWalk(repository); @@ -940,51 +953,45 @@ public class GitServiceImpl implements IGitService { } /** - * 获取 srcBranch tgtBranch 共同祖先之后, srcBranch 的提交记录 + * commit range + * 沿着 parent(0) 的主路径提交列表,忽略所有分支路径的提交 * * @param workspaceId - * @param srcBranch - * @param tgtBranch + * @param newCommitId + * @param oldCommitId * @return */ - @Override - public List> listCommitAfterMergeBase(String workspaceId, String srcBranch, String tgtBranch) { - log.info("[listCommitAfterMergeBase] [begin] [workspaceId: {}] [srcBranch: {}] [tgtBranch: {}]", workspaceId, srcBranch, tgtBranch); + public List> listCommitRange(String workspaceId, String newCommitId, String oldCommitId) { + log.info("[listCommitRange] [begin] [workspaceId: {}] [newCommitId: {}] [oldCommitId: {}]", workspaceId, newCommitId, oldCommitId); List> commitList = T.ListUtil.list(true); try (Git git = this.getGitInstance(workspaceId); Repository repository = git.getRepository();) { - ObjectId branch1Id = repository.resolve(srcBranch); - ObjectId branch2Id = repository.resolve(tgtBranch); - // Find the merge base - String mergeBaseId = this.getMergeBase(repository, branch1Id, branch2Id); - log.info("[listCommitAfterMergeBase] [mergeBase: {}]", mergeBaseId); - if (T.StrUtil.isEmpty(mergeBaseId)) { - return commitList; - } - - // Walk branch1's commits since the merge base try (RevWalk revWalk = new RevWalk(repository)) { - revWalk.sort(RevSort.TOPO); + RevCommit revCommit = revWalk.parseCommit(repository.resolve(newCommitId)); - RevCommit mergeBase = revWalk.parseCommit(ObjectId.fromString(mergeBaseId)); - revWalk.markStart(revWalk.parseCommit(branch1Id)); - revWalk.markUninteresting(mergeBase); - - for (RevCommit commit : revWalk) { - commitList.add(this.buildAswCommitInfo(commit)); - - List parentIds = Arrays.stream(commit.getParents()).map(RevCommit::getName).collect(Collectors.toList()); - if (parentIds.contains(mergeBaseId)) { + Set visitedCommits = new HashSet<>(); + while (revCommit != null && !visitedCommits.contains(revCommit.getId())) { + if (oldCommitId != null && revCommit.getId().getName().equals(oldCommitId)) { break; } + + commitList.add(this.buildAswCommitInfo(revCommit)); + visitedCommits.add(revCommit.getId()); + + // 沿着 parent(0) 前进 + if (revCommit.getParentCount() > 0) { + revCommit = revWalk.parseCommit(revCommit.getParent(0)); + } else { + revCommit = null; + } } + } catch (IOException e) { + log.error(e, "[listCommitRange] [error]"); + throw new RuntimeException(e); + } finally { + log.info("[listCommitRange] [finshed] [workspaceId: {}] [commits size: {}]", workspaceId, commitList.size()); } - } catch (IOException e) { - log.error(e, "[listCommitAfterMergeBase] [error]"); - throw new RuntimeException(e.getMessage()); - } finally { - log.info("[listCommitAfterMergeBase] [finshed] [workspaceId: {}] [commits size: {}]", workspaceId, commitList.size()); } return commitList; } @@ -1162,8 +1169,8 @@ public class GitServiceImpl implements IGitService { return mergeBase.getName(); } catch (Exception e) { log.error(e, "Failed to determine merge base"); + throw new RuntimeException(e); } - return null; } /** diff --git a/src/main/resources/db/mapper/app/ApplicationMergeMapper.xml b/src/main/resources/db/mapper/app/ApplicationMergeMapper.xml index ca0ef6d..8a6396f 100644 --- a/src/main/resources/db/mapper/app/ApplicationMergeMapper.xml +++ b/src/main/resources/db/mapper/app/ApplicationMergeMapper.xml @@ -7,7 +7,8 @@ - + + diff --git a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql index bfb48c3..50daf76 100644 --- a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql +++ b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql @@ -361,7 +361,8 @@ CREATE TABLE `application_merge` ( `id` VARCHAR(64) NOT NULL COMMENT '主键', `source_branch` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '源分支', `target_branch` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '目标分支', - `commit_id` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '提交ID', + `start_commit_id` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '起始提交ID,即source和target分支的共同parent id', + `end_commit_id` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '终止提交ID,记录合并后的commit id', `title` VARCHAR(4096) NOT NULL DEFAULT '' COMMENT '标题', `remove_source_branch` int(1) NOT NULL DEFAULT 0 COMMENT '是否删除源分支, 1:删除;0:不删除 默认:0', `description` text NOT NULL DEFAULT '' COMMENT '描述信息',