diff --git a/README.md b/README.md index 361c8bae599af19cb190f0897d30ef0a44f652c9..990a583826af9dfde1e3845e7cbaf729f76e3c1a 100644 --- a/README.md +++ b/README.md @@ -14,58 +14,286 @@ #### 2、运行项目,访问http://127.0.0.1:8085/doc.html 2.1 输入git地址,填写差异分支的旧版本,新版本,执行,就可以获取差异信息 2.2 { - "code": 10000, - "msg": "业务处理成功", - "data": [ - { - "classFile": "com/dr/code/diff/config/GitConfig", - "methodInfos": [ - { - "methodName": "cloneRepository", - "parameters": "String gitUrl,String codePath,String commitId" - }, - { - "methodName": "diffMethods", - "parameters": "DiffMethodParams diffMethodParams" - }, - { - "methodName": "getClassMethods", - "parameters": "String oldClassFile,String mewClassFile,DiffEntry diffEntry" - } - ], - "type": "MODIFY" - }, - { - "classFile": "com/dr/code/diff/controller/CodeDiffController", - "methodInfos": [ - { - "methodName": "getList", - "parameters": "@ApiParam(required = true, name = \"gitUrl\", value = \"git远程仓库地址\") @RequestParam(value = \"gitUrl\") String gitUrl,@ApiParam(required = true, name = \"baseVersion\", value = \"git原始分支或tag\") @RequestParam(value = \"baseVersion\") String baseVersion,@ApiParam(required = true, name = \"nowVersion\", value = \"git现分支或tag\") @RequestParam(value = \"nowVersion\") String nowVersion" - } - ], - "type": "MODIFY" - }, - { - "classFile": "com/dr/code/diff/service/impl/CodeDiffServiceImpl", - "methodInfos": [ - { - "methodName": "getDiffCode", - "parameters": "DiffMethodParams diffMethodParams" - } - ], - "type": "MODIFY" - }, - { - "classFile": "com/dr/common/utils/string/ScmStringUtil", - "methodInfos": [], - "type": "ADD" - } - ], - "uniqueData": "[{\"classFile\":\"com/dr/code/diff/config/GitConfig\",\"methodInfos\":[{\"methodName\":\"cloneRepository\",\"parameters\":\"String gitUrl,String codePath,String commitId\"},{\"methodName\":\"diffMethods\",\"parameters\":\"DiffMethodParams diffMethodParams\"},{\"methodName\":\"getClassMethods\",\"parameters\":\"String oldClassFile,String mewClassFile,DiffEntry diffEntry\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/code/diff/controller/CodeDiffController\",\"methodInfos\":[{\"methodName\":\"getList\",\"parameters\":\"@ApiParam(required = true, name = \\\"gitUrl\\\", value = \\\"git远程仓库地址\\\") @RequestParam(value = \\\"gitUrl\\\") String gitUrl,@ApiParam(required = true, name = \\\"baseVersion\\\", value = \\\"git原始分支或tag\\\") @RequestParam(value = \\\"baseVersion\\\") String baseVersion,@ApiParam(required = true, name = \\\"nowVersion\\\", value = \\\"git现分支或tag\\\") @RequestParam(value = \\\"nowVersion\\\") String nowVersion\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/code/diff/service/impl/CodeDiffServiceImpl\",\"methodInfos\":[{\"methodName\":\"getDiffCode\",\"parameters\":\"DiffMethodParams diffMethodParams\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/common/utils/string/ScmStringUtil\",\"methodInfos\":[],\"type\":\"ADD\"}]" - } + "code": 10000, + "msg": "业务处理成功", + "data": [ + { + "classFile": "com/dr/application/InstallCert", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/controller/Calculable", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/controller/JenkinsPluginController", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/controller/LoginController", + "methodInfos": [ + { + "methodName": "captcha", + "parameters": "HttpServletRequest&HttpServletResponse" + }, + { + "methodName": "login", + "parameters": "LoginUserParam&HttpServletRequest" + }, + { + "methodName": "testInt", + "parameters": "int&char" + }, + { + "methodName": "testInt", + "parameters": "String&int" + }, + { + "methodName": "testInt", + "parameters": "short&int" + }, + { + "methodName": "testInt", + "parameters": "int[]" + }, + { + "methodName": "testInt", + "parameters": "T[]" + }, + { + "methodName": "testInt", + "parameters": "Calculable&int&int" + }, + { + "methodName": "testInt", + "parameters": "Map&List&Set" + }, + { + "methodName": "display", + "parameters": "" + }, + { + "methodName": "a", + "parameters": "InnerClass" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/application/app/controller/RoleController", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/controller/TestController", + "methodInfos": [ + { + "methodName": "test", + "parameters": "" + }, + { + "methodName": "getPom", + "parameters": "HttpServletResponse" + }, + { + "methodName": "getDeList", + "parameters": "" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/application/app/controller/view/RoleViewController", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/param/AddRoleParam", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/vo/DependencyVO", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/vo/JenkinsPluginsVO", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/app/vo/RoleVO", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/config/ExceptionAdvice", + "methodInfos": [ + { + "methodName": "handleException", + "parameters": "Exception" + }, + { + "methodName": "handleMissingServletRequestParameterException", + "parameters": "MissingServletRequestParameterException" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/application/config/GitConfig", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/config/JenkinsConfig", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/ddd/StaticTest", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/ddd/Test", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/application/util/GitAdapter", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/common/errorcode/BizCode", + "methodInfos": [ + { + "methodName": "getCode", + "parameters": "" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/common/response/ApiResponse", + "methodInfos": [ + { + "methodName": "success", + "parameters": "" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/jenkins/JenkinsApplication", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/config/JenkinsConfigure", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/controller/JenkinsController", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/controller/TestApi", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/dto/JobAddDto", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/service/JenkinsService", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/service/impl/JenkinsServiceImpl", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/util/GenerateUniqueIdUtil", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/vo/DeviceVo", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/vo/GoodsVO", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/jenkins/vo/JobAddVo", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/repository/user/dto/query/RoleQueryDto", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/repository/user/dto/result/RoleResultDto", + "methodInfos": null, + "type": "ADD" + }, + { + "classFile": "com/dr/user/service/impl/PermissionServiceImpl", + "methodInfos": [ + { + "methodName": "getPermissionByRoles", + "parameters": "List" + }, + { + "methodName": "buildMenuTree", + "parameters": "List" + }, + { + "methodName": "getSubMenus", + "parameters": "Long&Map>" + } + ], + "type": "MODIFY" + }, + { + "classFile": "com/dr/user/service/impl/RoleServiceImpl", + "methodInfos": [ + { + "methodName": "getByUserId", + "parameters": "Long" + }, + { + "methodName": "getListByPage", + "parameters": "RoleQueryDto" + } + ], + "type": "MODIFY" + } + ], + "uniqueData": "[{\"classFile\":\"com/dr/application/InstallCert\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/controller/Calculable\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/controller/JenkinsPluginController\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/controller/LoginController\",\"methodInfos\":[{\"methodName\":\"captcha\",\"parameters\":\"HttpServletRequest&HttpServletResponse\"},{\"methodName\":\"login\",\"parameters\":\"LoginUserParam&HttpServletRequest\"},{\"methodName\":\"testInt\",\"parameters\":\"int&char\"},{\"methodName\":\"testInt\",\"parameters\":\"String&int\"},{\"methodName\":\"testInt\",\"parameters\":\"short&int\"},{\"methodName\":\"testInt\",\"parameters\":\"int[]\"},{\"methodName\":\"testInt\",\"parameters\":\"T[]\"},{\"methodName\":\"testInt\",\"parameters\":\"Calculable&int&int\"},{\"methodName\":\"testInt\",\"parameters\":\"Map&List&Set\"},{\"methodName\":\"display\",\"parameters\":\"\"},{\"methodName\":\"a\",\"parameters\":\"InnerClass\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/application/app/controller/RoleController\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/controller/TestController\",\"methodInfos\":[{\"methodName\":\"test\",\"parameters\":\"\"},{\"methodName\":\"getPom\",\"parameters\":\"HttpServletResponse\"},{\"methodName\":\"getDeList\",\"parameters\":\"\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/application/app/controller/view/RoleViewController\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/param/AddRoleParam\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/vo/DependencyVO\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/vo/JenkinsPluginsVO\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/app/vo/RoleVO\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/config/ExceptionAdvice\",\"methodInfos\":[{\"methodName\":\"handleException\",\"parameters\":\"Exception\"},{\"methodName\":\"handleMissingServletRequestParameterException\",\"parameters\":\"MissingServletRequestParameterException\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/application/config/GitConfig\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/config/JenkinsConfig\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/ddd/StaticTest\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/ddd/Test\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/application/util/GitAdapter\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/common/errorcode/BizCode\",\"methodInfos\":[{\"methodName\":\"getCode\",\"parameters\":\"\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/common/response/ApiResponse\",\"methodInfos\":[{\"methodName\":\"success\",\"parameters\":\"\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/jenkins/JenkinsApplication\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/config/JenkinsConfigure\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/controller/JenkinsController\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/controller/TestApi\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/dto/JobAddDto\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/service/JenkinsService\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/service/impl/JenkinsServiceImpl\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/util/GenerateUniqueIdUtil\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/vo/DeviceVo\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/vo/GoodsVO\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/jenkins/vo/JobAddVo\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/repository/user/dto/query/RoleQueryDto\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/repository/user/dto/result/RoleResultDto\",\"methodInfos\":[],\"type\":\"ADD\"},{\"classFile\":\"com/dr/user/service/impl/PermissionServiceImpl\",\"methodInfos\":[{\"methodName\":\"getPermissionByRoles\",\"parameters\":\"List\"},{\"methodName\":\"buildMenuTree\",\"parameters\":\"List\"},{\"methodName\":\"getSubMenus\",\"parameters\":\"Long&Map>\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/user/service/impl/RoleServiceImpl\",\"methodInfos\":[{\"methodName\":\"getByUserId\",\"parameters\":\"Long\"},{\"methodName\":\"getListByPage\",\"parameters\":\"RoleQueryDto\"}],\"type\":\"MODIFY\"}]" + } 在linux系统部署时请注意修改代码的基础路径和日志路径,如: ```angular2html java -jar -Dlog.path=/app/data2/devops/code-diff/logs -Dgit.local.base.dir=/app/data2/devops/code-diff/ application-1.0.0-SNAPSHOT.jar ``` + +#近期github不稳定,请访问https://gitee.com/Dray/code-diff.git diff --git a/application/src/main/java/com/dr/code/diff/config/CustomizeConfig.java b/application/src/main/java/com/dr/code/diff/config/CustomizeConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9c9cf7c9150b771fbcce01d115a8629a202fd7a0 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/config/CustomizeConfig.java @@ -0,0 +1,56 @@ +package com.dr.code.diff.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * @ProjectName: cmdb + * @Package: com.dr.cmdb.application.config + * @Description: 自定义参数 + * @Author: duanrui + * @CreateDate: 2021/3/18 9:49 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Data +@Configuration +public class CustomizeConfig { + + + /** + * git账号 + */ + @Value(value = "${git.userName}") + private String gitUserName; + /** + * git密码 + */ + @Value(value = "${git.password}") + private String gitPassWord; + + /** + * git下载代码到本地的根目录 + */ + @Value(value = "${git.local.base.dir}") + private String gitLocalBaseRepoDir; + + + /** + * git账号 + */ + @Value(value = "${svn.userName}") + private String svnUserName; + /** + * git密码 + */ + @Value(value = "${svn.password}") + private String svnPassWord; + + /** + * git下载代码到本地的根目录 + */ + @Value(value = "${svn.local.base.dir}") + private String svnLocalBaseRepoDir; +} diff --git a/application/src/main/java/com/dr/code/diff/controller/CodeDiffController.java b/application/src/main/java/com/dr/code/diff/controller/CodeDiffController.java index 83294ab22eda071206d37cd80bfa46061d54a0ca..799c74f6dba242c24573b03ac495c347c6612790 100644 --- a/application/src/main/java/com/dr/code/diff/controller/CodeDiffController.java +++ b/application/src/main/java/com/dr/code/diff/controller/CodeDiffController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.dr.code.diff.dto.ClassInfoResult; import com.dr.code.diff.dto.DiffMethodParams; +import com.dr.code.diff.enums.CodeManageTypeEnum; import com.dr.code.diff.service.CodeDiffService; import com.dr.code.diff.vo.result.CodeDiffResultVO; import com.dr.common.response.UniqueApoResponse; @@ -35,9 +36,9 @@ public class CodeDiffController { @Autowired private CodeDiffService codeDiffService; - @ApiOperation("获取差异代码") - @RequestMapping(value = "/list", method = RequestMethod.GET) - public UniqueApoResponse> getList( + @ApiOperation("git获取差异代码") + @RequestMapping(value = "git/list", method = RequestMethod.GET) + public UniqueApoResponse> getGitList( @ApiParam(required = true, name = "gitUrl", value = "git远程仓库地址") @RequestParam(value = "gitUrl") String gitUrl, @ApiParam(required = true, name = "baseVersion", value = "git原始分支或tag") @@ -45,9 +46,31 @@ public class CodeDiffController { @ApiParam(required = true, name = "nowVersion", value = "git现分支或tag") @RequestParam(value = "nowVersion") String nowVersion) { DiffMethodParams diffMethodParams = DiffMethodParams.builder() - .gitUrl(gitUrl) + .repoUrl(gitUrl) .baseVersion(baseVersion) .nowVersion(nowVersion) + .codeManageTypeEnum(CodeManageTypeEnum.GIT) + .build(); + List diffCodeList = codeDiffService.getDiffCode(diffMethodParams); + List codeDiffResultVOS = OrikaMapperUtils.mapList(diffCodeList, ClassInfoResult.class, CodeDiffResultVO.class); + return new UniqueApoResponse>().success(codeDiffResultVOS, JSON.toJSONString(codeDiffResultVOS,SerializerFeature.WriteNullListAsEmpty)); + } + + + @ApiOperation("svn获取差异代码") + @RequestMapping(value = "svn/list", method = RequestMethod.GET) + public UniqueApoResponse> getSvnList( + @ApiParam(required = true, name = "svnUrl", value = "svn远程仓库地址,如svn:192.168.0.1:3690/svn") + @RequestParam(value = "svnUrl") String svnUrl, + @ApiParam(required = true, name = "baseVersion", value = "svn原始分支,如:1") + @RequestParam(value = "baseVersion") String baseVersion, + @ApiParam(required = true, name = "nowVersion", value = "svn现分支,如:2") + @RequestParam(value = "nowVersion") String nowVersion) { + DiffMethodParams diffMethodParams = DiffMethodParams.builder() + .repoUrl(svnUrl) + .baseVersion(baseVersion) + .nowVersion(nowVersion) + .codeManageTypeEnum(CodeManageTypeEnum.SVN) .build(); List diffCodeList = codeDiffService.getDiffCode(diffMethodParams); List codeDiffResultVOS = OrikaMapperUtils.mapList(diffCodeList, ClassInfoResult.class, CodeDiffResultVO.class); diff --git a/application/src/main/java/com/dr/code/diff/dto/DiffEntryDto.java b/application/src/main/java/com/dr/code/diff/dto/DiffEntryDto.java new file mode 100644 index 0000000000000000000000000000000000000000..b1116632fd12d9be461e2ad4fc0c903f27b0afbe --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/dto/DiffEntryDto.java @@ -0,0 +1,29 @@ +package com.dr.code.diff.dto; + +import lombok.Data; +import org.eclipse.jgit.diff.DiffEntry; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.dto + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 18:34 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Data +public class DiffEntryDto { + + + /** + * 文件包名 + */ + protected String newPath; + + /** + * 文件变更类型 + */ + private DiffEntry.ChangeType changeType; +} diff --git a/application/src/main/java/com/dr/code/diff/dto/DiffMethodParams.java b/application/src/main/java/com/dr/code/diff/dto/DiffMethodParams.java index 591dc3bc9d3a9a20fdbf3146450bdd34a16385e5..9efe09afa029fe95e17ee603a7c4a1c577950788 100644 --- a/application/src/main/java/com/dr/code/diff/dto/DiffMethodParams.java +++ b/application/src/main/java/com/dr/code/diff/dto/DiffMethodParams.java @@ -1,5 +1,6 @@ package com.dr.code.diff.dto; +import com.dr.code.diff.enums.CodeManageTypeEnum; import lombok.Builder; import lombok.Data; @@ -21,7 +22,7 @@ public class DiffMethodParams { /** * git 远程仓库地址 */ - private String gitUrl; + private String repoUrl; /** * git原始分支或tag @@ -34,4 +35,10 @@ public class DiffMethodParams { private String nowVersion; + /** + * 版本控制类型 + */ + private CodeManageTypeEnum codeManageTypeEnum; + + } diff --git a/application/src/main/java/com/dr/code/diff/dto/VersionControlDto.java b/application/src/main/java/com/dr/code/diff/dto/VersionControlDto.java new file mode 100644 index 0000000000000000000000000000000000000000..c3069dc7139894268dda738cf63660c1b27d32aa --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/dto/VersionControlDto.java @@ -0,0 +1,47 @@ +package com.dr.code.diff.dto; + +import com.dr.code.diff.enums.CodeManageTypeEnum; +import lombok.Builder; +import lombok.Data; +import org.eclipse.jgit.diff.DiffEntry; + +import java.util.List; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.dto + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 10:10 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Data +public class VersionControlDto { + + /** + * 远程仓库地址 + */ + private String repoUrl; + + /** + * git原始分支或tag/svn 版本 + */ + private String baseVersion; + + /** + * git现分支或tag、svn 版本 + */ + private String nowVersion; + + + /** + * 版本控制类型 + */ + private CodeManageTypeEnum codeManageTypeEnum; + + + + private List diffClasses; +} diff --git a/application/src/main/java/com/dr/code/diff/enums/CodeManageTypeEnum.java b/application/src/main/java/com/dr/code/diff/enums/CodeManageTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..cbe1dfd388af135ab3321509b7453792782fe10c --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/enums/CodeManageTypeEnum.java @@ -0,0 +1,54 @@ +package com.dr.code.diff.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author rui.duan + * @version 1.0 + * @className WarehousingReceiptStatusEnum + * @description 代码管理工具枚举 + * @date 2019-06-10 11:39 + */ +@Getter +@AllArgsConstructor +public enum CodeManageTypeEnum { + //待通知 + GIT(0,"git"), + + SVN(1,"svn"),; + + private Integer code; + private String value; + + + /** + * 根据code获取值 + * @param code + * @return + */ + public static String getValueByCode(Integer code) { + CodeManageTypeEnum[] values = CodeManageTypeEnum.values(); + for (CodeManageTypeEnum type : values) { + if (type.code.equals(code)) { + return type.value; + } + } + return null; + } + + /** + * 根据value获取code + * @param value + * @return + */ + public static Integer getCodeByValue(String value) { + CodeManageTypeEnum[] values = CodeManageTypeEnum.values(); + for (CodeManageTypeEnum type : values) { + if (type.value.equalsIgnoreCase(value)) { + return type.code; + } + } + return null; + } +} diff --git a/application/src/main/java/com/dr/code/diff/service/CodeDiffService.java b/application/src/main/java/com/dr/code/diff/service/CodeDiffService.java index 7d2a4d08ebb9842c2774f2c36aa7556499017a84..14578b4e221b0f2c83bf8caa02174ea73f9f450f 100644 --- a/application/src/main/java/com/dr/code/diff/service/CodeDiffService.java +++ b/application/src/main/java/com/dr/code/diff/service/CodeDiffService.java @@ -26,4 +26,5 @@ public interface CodeDiffService { */ List getDiffCode(DiffMethodParams diffMethodParams); + } diff --git a/application/src/main/java/com/dr/code/diff/service/impl/CodeDiffServiceImpl.java b/application/src/main/java/com/dr/code/diff/service/impl/CodeDiffServiceImpl.java index a49ad11a558372f99c966be74d16990c027ea49f..e4e0b7d5e21c6e47c1e7757b34ce064f331ee32d 100644 --- a/application/src/main/java/com/dr/code/diff/service/impl/CodeDiffServiceImpl.java +++ b/application/src/main/java/com/dr/code/diff/service/impl/CodeDiffServiceImpl.java @@ -1,9 +1,13 @@ package com.dr.code.diff.service.impl; -import com.dr.code.diff.config.GitConfig; import com.dr.code.diff.dto.ClassInfoResult; import com.dr.code.diff.dto.DiffMethodParams; +import com.dr.code.diff.dto.VersionControlDto; import com.dr.code.diff.service.CodeDiffService; +import com.dr.code.diff.vercontrol.VersionControlHandlerFactory; +import com.dr.code.diff.vercontrol.git.GitVersionControl; +import com.dr.code.diff.vercontrol.svn.SvnVersionControl; +import com.dr.common.utils.mapper.OrikaMapperUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,11 +28,16 @@ import java.util.List; @Slf4j public class CodeDiffServiceImpl implements CodeDiffService { - @Autowired - private GitConfig gitConfig; - + /** + * @param diffMethodParams + * @date:2021/1/9 + * @className:CodeDiffService + * @author:Administrator + * @description: 获取差异代码 + */ @Override public List getDiffCode(DiffMethodParams diffMethodParams) { - return gitConfig.diffMethods(diffMethodParams); + VersionControlDto dto = OrikaMapperUtils.map(diffMethodParams, VersionControlDto.class); + return VersionControlHandlerFactory.processHandler(dto); } } diff --git a/application/src/main/java/com/dr/code/diff/config/GitConfig.java b/application/src/main/java/com/dr/code/diff/util/GitRepoUtil.java similarity index 45% rename from application/src/main/java/com/dr/code/diff/config/GitConfig.java rename to application/src/main/java/com/dr/code/diff/util/GitRepoUtil.java index 8ea056211909224853b6617572449d027dd94de3..3a97b0363cb604785dcd2295ba2087873f035851 100644 --- a/application/src/main/java/com/dr/code/diff/config/GitConfig.java +++ b/application/src/main/java/com/dr/code/diff/util/GitRepoUtil.java @@ -1,9 +1,5 @@ -package com.dr.code.diff.config; +package com.dr.code.diff.util; -import com.dr.code.diff.dto.ClassInfoResult; -import com.dr.code.diff.dto.DiffMethodParams; -import com.dr.code.diff.dto.MethodInfoResult; -import com.dr.code.diff.util.MethodParserUtils; import com.dr.common.errorcode.BizCode; import com.dr.common.exception.BizException; import com.dr.common.log.LoggerUtil; @@ -13,7 +9,6 @@ import com.google.common.base.Strings; import lombok.extern.slf4j.Slf4j; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; @@ -22,51 +17,23 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.eclipse.jgit.treewalk.AbstractTreeIterator; import org.eclipse.jgit.treewalk.CanonicalTreeParser; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.CollectionUtils; -import javax.annotation.Resource; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.stream.Collectors; /** - * @author rui.duan - * @version 1.0 - * @className GitConfig - * @description git配置类 - * @date 2021/01/11 2:30 下午 + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.util + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 11:16 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 */ -@Configuration @Slf4j -public class GitConfig { +public class GitRepoUtil { - /** - * git账号 - */ - @Value(value = "${git.userName}") - private String gitUserName; - /** - * git密码 - */ - @Value(value = "${git.password}") - private String gitPassWord; - - /** - * git下载代码到本地的根目录 - */ - @Value(value = "${git.local.base.dir}") - private String localBaseRepoDir; - - - @Resource(name = "asyncExecutor") - private Executor executor; /** * 克隆代码到本地 @@ -78,7 +45,7 @@ public class GitConfig { * @throws GitAPIException * @throws IOException */ - public Git cloneRepository(String gitUrl, String codePath, String commitId) { + public static Git cloneRepository(String gitUrl, String codePath, String commitId,String gitUserName,String gitPassWord) { Git git = null; try { if (!checkGitWorkSpace(gitUrl, codePath)) { @@ -108,134 +75,6 @@ public class GitConfig { return git; } - /** - * 判断工作目录是否存在,本来可以每次拉去代码时删除再拉取,但是这样代码多的化IO比较大,所以就代码可以复用 - * - * @param codePath - * @return - */ - public Boolean checkGitWorkSpace(String gitUrl, String codePath) throws IOException { - Boolean isExist = Boolean.FALSE; - File RepoGitDir = new File(codePath + "/.git"); - if (!RepoGitDir.exists()) { - return false; - } - Git git = Git.open(new File(codePath)); - if (null == git) { - return isExist; - } - Repository repository = git.getRepository(); - //解析本地代码,获取远程uri,是否是我们需要的git远程仓库 - String repoUrl = repository.getConfig().getString("remote", "origin", "url"); - if (gitUrl.equals(repoUrl)) { - isExist = Boolean.TRUE; - } else { - LoggerUtil.info(log, "本地存在其他仓的代码,先删除"); - FileUtil.removeDir(new File(codePath)); - } - return isExist; - } - - /** - * 获取差异方法 - * - * @param diffMethodParams - * @return - */ - public List diffMethods(DiffMethodParams diffMethodParams) { - try { - //原有代码git对象 - Git baseGit = cloneRepository(diffMethodParams.getGitUrl(), getLocalDir(diffMethodParams.getGitUrl(), localBaseRepoDir, diffMethodParams.getBaseVersion()), diffMethodParams.getBaseVersion()); - //现有代码git对象 - Git nowGit = cloneRepository(diffMethodParams.getGitUrl(), getLocalDir(diffMethodParams.getGitUrl(), localBaseRepoDir, diffMethodParams.getNowVersion()), diffMethodParams.getNowVersion()); - AbstractTreeIterator baseTree = prepareTreeParser(baseGit.getRepository(), diffMethodParams.getBaseVersion()); - AbstractTreeIterator nowTree = prepareTreeParser(nowGit.getRepository(), diffMethodParams.getNowVersion()); - //获取两个版本之间的差异代码 - List diff = nowGit.diff().setOldTree(baseTree).setNewTree(nowTree).setShowNameAndStatusOnly(true).call(); - //过滤出有效的差异代码 - Collection validDiffList = diff.stream() - //只计算java文件 - .filter(e -> e.getNewPath().endsWith(".java")) - //排除测试文件 - .filter(e -> e.getNewPath().contains("src/main/java")) - //只计算新增和变更文件 - .filter(e -> DiffEntry.ChangeType.ADD.equals(e.getChangeType()) || DiffEntry.ChangeType.MODIFY.equals(e.getChangeType())) - .collect(Collectors.toList()); - if (CollectionUtils.isEmpty(validDiffList)) { - return null; - } - /** - * 多线程获取旧代码和新代码的差异类及差异方法 - */ - List> priceFuture = validDiffList.stream().map(item -> getClassMethods(getClassFile(baseGit, item.getNewPath()), getClassFile(nowGit, item.getNewPath()), item)).collect(Collectors.toList()); - return priceFuture.stream().map(CompletableFuture::join).filter(Objects::nonNull).collect(Collectors.toList()); - } catch (GitAPIException e) { - e.printStackTrace(); - } - return null; - } - - /** - * 获取class文件的地址 - * - * @param git - * @param classPackage - * @return - */ - private String getClassFile(Git git, String classPackage) { - StringBuilder builder = new StringBuilder(git.getRepository().getDirectory().getParent()); - return builder.append("/") - .append(classPackage).toString(); - } - - /** - * 获取类的增量方法 - * - * @param oldClassFile 旧类的本地地址 - * @param mewClassFile 新类的本地地址 - * @param diffEntry 差异类 - * @return - */ - private CompletableFuture getClassMethods(String oldClassFile, String mewClassFile, DiffEntry diffEntry) { - //多线程获取差异方法,此处只要考虑增量代码太多的情况下,每个类都需要遍历所有方法,采用多线程方式加快速度 - return CompletableFuture.supplyAsync(() -> { - String className = diffEntry.getNewPath().split("\\.")[0].split("src/main/java/")[1]; - //新增类直接标记,不用计算方法 - if (DiffEntry.ChangeType.ADD.equals(diffEntry.getChangeType())) { - return ClassInfoResult.builder() - .classFile(className) - .type(DiffEntry.ChangeType.ADD.name()) - .build(); - } - List diffMethods; - //获取新类的所有方法 - List newMethodInfoResults = MethodParserUtils.parseMethods(mewClassFile); - //如果新类为空,没必要比较 - if (CollectionUtils.isEmpty(newMethodInfoResults)) { - return null; - } - //获取旧类的所有方法 - List oldMethodInfoResults = MethodParserUtils.parseMethods(oldClassFile); - //如果旧类为空,新类的方法所有为增量 - if (CollectionUtils.isEmpty(oldMethodInfoResults)) { - diffMethods = newMethodInfoResults; - } else { //否则,计算增量方法 - List md5s = oldMethodInfoResults.stream().map(MethodInfoResult::getMd5).collect(Collectors.toList()); - diffMethods = newMethodInfoResults.stream().filter(m -> !md5s.contains(m.getMd5())).collect(Collectors.toList()); - } - //没有增量方法,过滤掉 - if (CollectionUtils.isEmpty(diffMethods)) { - return null; - } - ClassInfoResult result = ClassInfoResult.builder() - .classFile(className) - .methodInfos(diffMethods) - .type(DiffEntry.ChangeType.MODIFY.name()) - .build(); - return result; - }, executor); - } - /** * 将代码转成树状 @@ -274,6 +113,7 @@ public class GitConfig { if (Strings.isNullOrEmpty(gitUrl)) { return ""; } + localDir.append("/"); String repoName = Splitter.on("/") .splitToStream(gitUrl).reduce((first, second) -> second) .map(e -> Splitter.on(".").splitToStream(e).findFirst().get()).get(); @@ -281,9 +121,49 @@ public class GitConfig { localDir.append("/"); localDir.append(version); return localDir.toString(); + } + + /** + * 判断工作目录是否存在,本来可以每次拉去代码时删除再拉取,但是这样代码多的化IO比较大,所以就代码可以复用 + * + * @param codePath + * @return + */ + public static Boolean checkGitWorkSpace(String gitUrl, String codePath) throws IOException { + Boolean isExist = Boolean.FALSE; + File RepoGitDir = new File(codePath + "/.git"); + if (!RepoGitDir.exists()) { + return false; + } + Git git = Git.open(new File(codePath)); + if (null == git) { + return isExist; + } + Repository repository = git.getRepository(); + //解析本地代码,获取远程uri,是否是我们需要的git远程仓库 + String repoUrl = repository.getConfig().getString("remote", "origin", "url"); + if (gitUrl.equals(repoUrl)) { + isExist = Boolean.TRUE; + } else { + LoggerUtil.info(log, "本地存在其他仓的代码,先删除"); + FileUtil.removeDir(new File(codePath)); + } + return isExist; } -} + /** + * 获取class文件的地址 + * + * @param git + * @param classPackage + * @return + */ + public String getClassFile(Git git, String classPackage) { + StringBuilder builder = new StringBuilder(git.getRepository().getDirectory().getParent()); + return builder.append("/") + .append(classPackage).toString(); + } +} diff --git a/application/src/main/java/com/dr/code/diff/util/SvnRepoUtil.java b/application/src/main/java/com/dr/code/diff/util/SvnRepoUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..7fa81f6398e098f9342d255f8b83a1fcda09516c --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/util/SvnRepoUtil.java @@ -0,0 +1,77 @@ +package com.dr.code.diff.util; + +import com.dr.code.diff.vercontrol.svn.MySVNEditor; +import com.dr.common.errorcode.BizCode; +import com.dr.common.exception.BizException; +import com.dr.common.log.LoggerUtil; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import org.tmatesoft.svn.core.SVNDepth; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; +import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; +import org.tmatesoft.svn.core.io.ISVNEditor; +import org.tmatesoft.svn.core.io.SVNRepository; +import org.tmatesoft.svn.core.io.SVNRepositoryFactory; +import org.tmatesoft.svn.core.wc.*; + +import java.io.File; +import java.io.IOException; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.util + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 11:16 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +public class SvnRepoUtil { + + /** + * @date:2021/4/5 + * @className:SvnRepoUtil + * @author:Administrator + * @description: 获取svn代码仓 + */ + public static void cloneRepository(String repoUrl, String codePath, String commitId, String userName, String password) { + try { + ISVNOptions options = SVNWCUtil.createDefaultOptions(true); + SVNUpdateClient updateClient = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password).getUpdateClient(); + updateClient.doCheckout(SVNURL.parseURIEncoded(repoUrl), new File(codePath), SVNRevision.create(Long.parseLong(commitId)), SVNRevision.create(Long.parseLong(commitId)), SVNDepth.INFINITY, false); + } catch (SVNException e) { + e.printStackTrace(); + } + } + + + public static SVNDiffClient getSVNDiffClient(String userName, String password) { + ISVNOptions options = SVNWCUtil.createDefaultOptions(true); + //实例化客户端管理类 + return SVNClientManager.newInstance((DefaultSVNOptions) options, userName, password).getDiffClient(); + } + + + public static String getLocalDir(String gitUrl, String localBaseRepoDir, String version) { + StringBuilder localDir = new StringBuilder(localBaseRepoDir); + if (Strings.isNullOrEmpty(gitUrl)) { + return ""; + } + String repoName = Splitter.on("/") + .splitToStream(gitUrl).reduce((first, second) -> second).get(); + localDir.append("/"); + localDir.append(repoName); + localDir.append("/"); + localDir.append(version); + return localDir.toString(); + } + + +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/VersionControl.java b/application/src/main/java/com/dr/code/diff/vercontrol/VersionControl.java new file mode 100644 index 0000000000000000000000000000000000000000..b3c5f7e6e4b166712fd3517607f30337d21182f3 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/VersionControl.java @@ -0,0 +1,142 @@ +package com.dr.code.diff.vercontrol; + +import com.dr.code.diff.dto.ClassInfoResult; +import com.dr.code.diff.dto.DiffEntryDto; +import com.dr.code.diff.dto.MethodInfoResult; +import com.dr.code.diff.dto.VersionControlDto; +import com.dr.code.diff.enums.CodeManageTypeEnum; +import com.dr.code.diff.util.MethodParserUtils; +import lombok.Data; +import org.eclipse.jgit.diff.DiffEntry; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol + * @Description: 代码差异获取流程类定义 + * @Author: duanrui + * @CreateDate: 2021/4/5 9:56 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Data +public abstract class VersionControl { + + protected VersionControlDto versionControlDto; + + + @Resource(name = "asyncExecutor") + private Executor executor; + + + /** + * 执行handler + * @return + */ + public List handler(VersionControlDto versionControlDto) { + this.versionControlDto = versionControlDto; + getDiffCodeClasses(); + return getDiffCodeMethods(); + } + + public abstract String getBaseDir(); + + /** + * @date:2021/4/5 + * @className:VersionControl + * @author:Administrator + * @description: 获取差异类 + */ + public abstract void getDiffCodeClasses(); + + /** + * 获取操作类型 + */ + public abstract CodeManageTypeEnum getType(); + + /** + * @date:2021/4/5 + * @className:VersionControl + * @author:Administrator + * @description: 获取差异方法 + */ + public List getDiffCodeMethods() { + List> priceFuture = versionControlDto.getDiffClasses().stream() + .map(item -> getClassMethods(getClassFilePath(getBaseDir(), versionControlDto.getBaseVersion(), item.getNewPath()), getClassFilePath(getBaseDir(), versionControlDto.getNowVersion(), item.getNewPath()), item)) + .collect(Collectors.toList()); + return priceFuture.stream().map(CompletableFuture::join).filter(Objects::nonNull).collect(Collectors.toList()); + } + + /** + * @date:2021/4/5 + * @className:VersionControl + * @author:Administrator + * @description: 获取类本地地址 + * + */ + private String getClassFilePath(String baseDir, String version, String classPath) { + StringBuilder builder = new StringBuilder(baseDir); + builder.append(version); + builder.append("/"); + builder.append(classPath); + return builder.toString(); + + } + + /** + * 获取类的增量方法 + * + * @param oldClassFile 旧类的本地地址 + * @param mewClassFile 新类的本地地址 + * @param diffEntry 差异类 + * @return + */ + private CompletableFuture getClassMethods(String oldClassFile, String mewClassFile, DiffEntryDto diffEntry) { + //多线程获取差异方法,此处只要考虑增量代码太多的情况下,每个类都需要遍历所有方法,采用多线程方式加快速度 + return CompletableFuture.supplyAsync(() -> { + String className = diffEntry.getNewPath().split("\\.")[0].split("src/main/java/")[1]; + //新增类直接标记,不用计算方法 + if (DiffEntry.ChangeType.ADD.equals(diffEntry.getChangeType())) { + return ClassInfoResult.builder() + .classFile(className) + .type(DiffEntry.ChangeType.ADD.name()) + .build(); + } + List diffMethods; + //获取新类的所有方法 + List newMethodInfoResults = MethodParserUtils.parseMethods(mewClassFile); + //如果新类为空,没必要比较 + if (CollectionUtils.isEmpty(newMethodInfoResults)) { + return null; + } + //获取旧类的所有方法 + List oldMethodInfoResults = MethodParserUtils.parseMethods(oldClassFile); + //如果旧类为空,新类的方法所有为增量 + if (CollectionUtils.isEmpty(oldMethodInfoResults)) { + diffMethods = newMethodInfoResults; + } else { //否则,计算增量方法 + List md5s = oldMethodInfoResults.stream().map(MethodInfoResult::getMd5).collect(Collectors.toList()); + diffMethods = newMethodInfoResults.stream().filter(m -> !md5s.contains(m.getMd5())).collect(Collectors.toList()); + } + //没有增量方法,过滤掉 + if (CollectionUtils.isEmpty(diffMethods)) { + return null; + } + return ClassInfoResult.builder() + .classFile(className) + .methodInfos(diffMethods) + .type(DiffEntry.ChangeType.MODIFY.name()) + .build(); + }, executor); + } + + +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/VersionControlHandlerFactory.java b/application/src/main/java/com/dr/code/diff/vercontrol/VersionControlHandlerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..0f55264afca0c4271691ddc2eda2818ff26a0b43 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/VersionControlHandlerFactory.java @@ -0,0 +1,65 @@ +package com.dr.code.diff.vercontrol; + +import com.dr.code.diff.dto.ClassInfoResult; +import com.dr.code.diff.dto.VersionControlDto; +import com.dr.code.diff.enums.CodeManageTypeEnum; +import com.google.common.collect.Lists; +import org.springframework.beans.BeansException; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; + +/** + * @ProjectName: cmdb + * @Package: com.dr.cmdb.application.filedcheck + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/3/30 10:10 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Component +public class VersionControlHandlerFactory implements CommandLineRunner, ApplicationContextAware { + private volatile ApplicationContext applicationContext; + + + private static List handlers; + + + /** + * 拼接变种责任链 + * @param args + */ + @Override + public void run(String... args) { + Collection checkHandlers = this.applicationContext.getBeansOfType(VersionControl.class).values(); + handlers = Lists.newArrayList(checkHandlers); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + /** + * 执行方法校验 + * @param versionControlDto + */ + public static List processHandler(VersionControlDto versionControlDto) { + List result = null; + for (int i = 0; i < handlers.size(); i++) { + if(versionControlDto.getCodeManageTypeEnum().equals(handlers.get(i).getType())){ + result = handlers.get(i).handler(versionControlDto); + } + } + return result; + + } + + +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/git/GitVersionControl.java b/application/src/main/java/com/dr/code/diff/vercontrol/git/GitVersionControl.java new file mode 100644 index 0000000000000000000000000000000000000000..8a7fb535757e8f822dcd6c61c0f2dd69f4ab5e1f --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/git/GitVersionControl.java @@ -0,0 +1,82 @@ +package com.dr.code.diff.vercontrol.git; + +import com.dr.code.diff.config.CustomizeConfig; +import com.dr.code.diff.dto.DiffEntryDto; +import com.dr.code.diff.enums.CodeManageTypeEnum; +import com.dr.code.diff.util.GitRepoUtil; +import com.dr.code.diff.vercontrol.VersionControl; +import com.dr.common.utils.mapper.OrikaMapperUtils; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.diff.DiffEntry; +import org.eclipse.jgit.treewalk.AbstractTreeIterator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol + * @Description: 代码差异获取流程类定义 + * @Author: duanrui + * @CreateDate: 2021/4/5 9:56 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Component +public class GitVersionControl extends VersionControl { + + @Autowired + private CustomizeConfig customizeConfig; + + + /** + * 获取操作类型 + */ + @Override + public CodeManageTypeEnum getType() { + return CodeManageTypeEnum.GIT; + } + + @Override + public void getDiffCodeClasses() { + try { + String localBaseRepoDir = GitRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getGitLocalBaseRepoDir(), super.versionControlDto.getBaseVersion()); + String localNowRepoDir = GitRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getGitLocalBaseRepoDir(), super.versionControlDto.getNowVersion()); + //原有代码git对象 + Git baseGit = GitRepoUtil.cloneRepository(super.versionControlDto.getRepoUrl(), localBaseRepoDir, super.versionControlDto.getBaseVersion(), customizeConfig.getGitUserName(), customizeConfig.getGitPassWord()); + //现有代码git对象 + Git nowGit = GitRepoUtil.cloneRepository(super.versionControlDto.getRepoUrl(), localNowRepoDir, super.versionControlDto.getNowVersion(), customizeConfig.getGitUserName(), customizeConfig.getGitPassWord()); + AbstractTreeIterator baseTree = GitRepoUtil.prepareTreeParser(baseGit.getRepository(), super.versionControlDto.getBaseVersion()); + AbstractTreeIterator nowTree = GitRepoUtil.prepareTreeParser(nowGit.getRepository(), super.versionControlDto.getNowVersion()); + //获取两个版本之间的差异代码 + List diff = null; + diff = nowGit.diff().setOldTree(baseTree).setNewTree(nowTree).setShowNameAndStatusOnly(true).call(); + //过滤出有效的差异代码 + Collection validDiffList = diff.stream() + //只计算java文件 + .filter(e -> e.getNewPath().endsWith(".java")) + //排除测试文件 + .filter(e -> e.getNewPath().contains("src/main/java")) + //只计算新增和变更文件 + .filter(e -> DiffEntry.ChangeType.ADD.equals(e.getChangeType()) || DiffEntry.ChangeType.MODIFY.equals(e.getChangeType())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(validDiffList)) { + List diffEntrys = OrikaMapperUtils.mapList(validDiffList, DiffEntry.class, DiffEntryDto.class); + super.versionControlDto.setDiffClasses(diffEntrys); + } + } catch (GitAPIException e) { + e.printStackTrace(); + } + } + + @Override + public String getBaseDir() { + return GitRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getGitLocalBaseRepoDir(),""); + } +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNDiffStatusHandler.java b/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNDiffStatusHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..4a4e3270ecc470c32b6cb6e92a59e2b123d310f0 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNDiffStatusHandler.java @@ -0,0 +1,51 @@ +package com.dr.code.diff.vercontrol.svn; + +import com.dr.code.diff.dto.DiffEntryDto; +import org.eclipse.jgit.diff.DiffEntry; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.wc.ISVNDiffStatusHandler; +import org.tmatesoft.svn.core.wc.SVNDiffStatus; +import org.tmatesoft.svn.core.wc.SVNStatusType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 18:06 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +public class MySVNDiffStatusHandler implements ISVNDiffStatusHandler { + + public final static List list = Collections.synchronizedList(new ArrayList());; + + + @Override + public void handleDiffStatus(SVNDiffStatus svnDiffStatus) throws SVNException { + //首先过滤java文件 + if(!svnDiffStatus.getPath().endsWith(".java")){ + return; + } + //过滤测试文件 + if(!svnDiffStatus.getPath().contains("src/main/java")){ + return; + } + DiffEntryDto entry = new DiffEntryDto(); + //只计算变更和新增文件 + if(SVNStatusType.STATUS_MODIFIED.equals(svnDiffStatus.getModificationType())){ + entry.setChangeType(DiffEntry.ChangeType.MODIFY); + }else if(SVNStatusType.STATUS_ADDED.equals(svnDiffStatus.getModificationType())){ + entry.setChangeType(DiffEntry.ChangeType.ADD); + }else{ + return; + } + entry.setNewPath(svnDiffStatus.getPath()); + list.add(entry); + } +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNEditor.java b/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..42678a9deba29ff84642f09a636428b061f638d1 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/svn/MySVNEditor.java @@ -0,0 +1,111 @@ +package com.dr.code.diff.vercontrol.svn; + +import org.tmatesoft.svn.core.SVNCommitInfo; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNPropertyValue; +import org.tmatesoft.svn.core.io.ISVNEditor; +import org.tmatesoft.svn.core.io.diff.SVNDiffWindow; + +import java.io.OutputStream; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol.svn + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 19:06 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +public class MySVNEditor implements ISVNEditor { + @Override + public void targetRevision(long l) throws SVNException { + + } + + @Override + public void openRoot(long l) throws SVNException { + + } + + @Override + public void deleteEntry(String s, long l) throws SVNException { + + } + + @Override + public void absentDir(String s) throws SVNException { + + } + + @Override + public void absentFile(String s) throws SVNException { + + } + + @Override + public void addDir(String s, String s1, long l) throws SVNException { + + } + + @Override + public void openDir(String s, long l) throws SVNException { + + } + + @Override + public void changeDirProperty(String s, SVNPropertyValue svnPropertyValue) throws SVNException { + + } + + @Override + public void closeDir() throws SVNException { + + } + + @Override + public void addFile(String s, String s1, long l) throws SVNException { + + } + + @Override + public void openFile(String s, long l) throws SVNException { + + } + + @Override + public void changeFileProperty(String s, String s1, SVNPropertyValue svnPropertyValue) throws SVNException { + + } + + @Override + public void closeFile(String s, String s1) throws SVNException { + + } + + @Override + public SVNCommitInfo closeEdit() throws SVNException { + return null; + } + + @Override + public void abortEdit() throws SVNException { + + } + + @Override + public void applyTextDelta(String s, String s1) throws SVNException { + + } + + @Override + public OutputStream textDeltaChunk(String s, SVNDiffWindow svnDiffWindow) throws SVNException { + return null; + } + + @Override + public void textDeltaEnd(String s) throws SVNException { + + } +} diff --git a/application/src/main/java/com/dr/code/diff/vercontrol/svn/SvnVersionControl.java b/application/src/main/java/com/dr/code/diff/vercontrol/svn/SvnVersionControl.java new file mode 100644 index 0000000000000000000000000000000000000000..e7f5a2b3704aa76095695641b7c27b27bddccc87 --- /dev/null +++ b/application/src/main/java/com/dr/code/diff/vercontrol/svn/SvnVersionControl.java @@ -0,0 +1,61 @@ +package com.dr.code.diff.vercontrol.svn; + +import com.dr.code.diff.config.CustomizeConfig; +import com.dr.code.diff.enums.CodeManageTypeEnum; +import com.dr.code.diff.util.SvnRepoUtil; +import com.dr.code.diff.vercontrol.VersionControl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tmatesoft.svn.core.SVNDepth; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.wc.SVNDiffClient; +import org.tmatesoft.svn.core.wc.SVNRevision; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol + * @Description: svn差异代码获取 + * @Author: duanrui + * @CreateDate: 2021/4/5 9:56 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +@Component +public class SvnVersionControl extends VersionControl { + + @Autowired + private CustomizeConfig customizeConfig; + + + /** + * 获取操作类型 + */ + @Override + public CodeManageTypeEnum getType() { + return CodeManageTypeEnum.SVN; + } + + @Override + public void getDiffCodeClasses() { + try { + MySVNDiffStatusHandler.list.clear(); + String localBaseRepoDir = SvnRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getSvnLocalBaseRepoDir(), super.versionControlDto.getBaseVersion()); + String localNowRepoDir = SvnRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getSvnLocalBaseRepoDir(), super.versionControlDto.getNowVersion()); + SvnRepoUtil.cloneRepository(super.versionControlDto.getRepoUrl(), localBaseRepoDir, super.versionControlDto.getBaseVersion(), customizeConfig.getSvnUserName(), customizeConfig.getSvnPassWord()); + SvnRepoUtil.cloneRepository(super.versionControlDto.getRepoUrl(), localNowRepoDir, super.versionControlDto.getNowVersion(), customizeConfig.getSvnUserName(), customizeConfig.getSvnPassWord()); + SVNDiffClient svnDiffClient = SvnRepoUtil.getSVNDiffClient(customizeConfig.getSvnUserName(), customizeConfig.getSvnPassWord()); + svnDiffClient.doDiffStatus(SVNURL.parseURIEncoded(super.versionControlDto.getRepoUrl()), SVNRevision.create(Long.parseLong(super.versionControlDto.getBaseVersion())), SVNURL.parseURIEncoded(super.versionControlDto.getRepoUrl()), SVNRevision.create(Long.parseLong(super.versionControlDto.getNowVersion())), SVNDepth.INFINITY, true, new MySVNDiffStatusHandler()); + //将差异代码设置进集合 + super.versionControlDto.setDiffClasses(MySVNDiffStatusHandler.list); + } catch (SVNException e) { + e.printStackTrace(); + } + } + + @Override + public String getBaseDir() { + return SvnRepoUtil.getLocalDir(super.versionControlDto.getRepoUrl(), customizeConfig.getSvnLocalBaseRepoDir(),""); + } +} diff --git a/application/src/main/java/com/dr/code/diff/vo/param/CodeDiffParamVO.java b/application/src/main/java/com/dr/code/diff/vo/param/CodeDiffParamVO.java index 8cba2311dcd4ed694e25af2a892645f65b9a72d0..54e18cdab2a7263a60ce8b9b0e5738432a406c83 100644 --- a/application/src/main/java/com/dr/code/diff/vo/param/CodeDiffParamVO.java +++ b/application/src/main/java/com/dr/code/diff/vo/param/CodeDiffParamVO.java @@ -17,19 +17,19 @@ public class CodeDiffParamVO { /** * git 远程仓库地址 */ - @ApiModelProperty(name = "name", value = "git远程仓库地址", dataType = "String", example = "https://github.com/rayduan/code-diff.git") - private String gitUrl; + @ApiModelProperty(name = "name", value = "远程仓库地址", dataType = "String", example = "https://github.com/rayduan/code-diff.git") + private String repoUrl; /** * git原始分支或tag */ - @ApiModelProperty(name = "name", value = " git原始分支或tag", dataType = "String", example = "master") + @ApiModelProperty(name = "name", value = "原始分支或tag", dataType = "String", example = "master") private String baseVersion; /** * git现分支或tag */ - @ApiModelProperty(name = "name", value = " git现分支或tag", dataType = "String", example = "develop") + @ApiModelProperty(name = "name", value = "现分支或tag", dataType = "String", example = "develop") private String nowVersion; diff --git a/application/src/main/resources/application.yml b/application/src/main/resources/application.yml index 035a745c9b246b2b4a6fd5d24eb58dc79eb9ac6b..bf7006594769a5893759d3c8604b52262b424fe2 100644 --- a/application/src/main/resources/application.yml +++ b/application/src/main/resources/application.yml @@ -27,10 +27,16 @@ swagger: # sessionIdUrlRewritingEnabled: false git: userName: rayduan - password: FDsfret334 + password: 123456 local: base: - dir: D:\git-test\ + dir: D:\git-test +svn: + userName: admin + password: 123456 + local: + base: + dir: D:\svn-test server: port: 8085 servlet: diff --git a/application/src/test/java/com/dr/code/diff/config/GitConfigTest.java b/application/src/test/java/com/dr/code/diff/config/GitConfigTest.java index 56eeeb17f6fee73ecffe910870a3525d70bd4c68..a9d8f1b23b3033928f1e56bd012688a325ae8b07 100644 --- a/application/src/test/java/com/dr/code/diff/config/GitConfigTest.java +++ b/application/src/test/java/com/dr/code/diff/config/GitConfigTest.java @@ -17,28 +17,28 @@ import org.springframework.beans.factory.annotation.Autowired; */ class GitConfigTest extends CodeDiffApplicationTest { - @Autowired - private GitConfig gitConfig; +// @Autowired +// private GitConfig gitConfig; - @Test - void cloneRepository() { - String localRepo = "D:\\git-test\\base-service"; - String gitUrl = "http://192.168.75.128/rayduan/base-service.git"; - gitConfig.cloneRepository(gitUrl, localRepo, "2ea401406d775005245faa0a57d6e08db348433f"); - } - - @Test - void diffMethods() { +// @Test +// void cloneRepository() { +// String localRepo = "D:\\git-test\\base-service"; +// String gitUrl = "http://192.168.75.128/rayduan/base-service.git"; +// gitConfig.cloneRepository(gitUrl, localRepo, "2ea401406d775005245faa0a57d6e08db348433f"); +// } +// +// @Test +// void diffMethods() { +//// DiffMethodParams diff = DiffMethodParams.builder() +//// .baseVersion("dac68b2f3976509b4204a66df8f5e71dffe023b7") +//// .nowVersion("74c026849763f1f9f0dfc967949d0b581959c2ea") +//// .gitUrl("https://github.com/rayduan/devops-data.git") +//// .build(); // DiffMethodParams diff = DiffMethodParams.builder() -// .baseVersion("dac68b2f3976509b4204a66df8f5e71dffe023b7") -// .nowVersion("74c026849763f1f9f0dfc967949d0b581959c2ea") -// .gitUrl("https://github.com/rayduan/devops-data.git") +// .baseVersion("db84201eea9be107073fa07c24e30262ac91d384") +// .nowVersion("dca3a374ba9100c64b970081fad5db7335e99ff6") +// .gitUrl("https://github.com/rayduan/base-service.git") // .build(); - DiffMethodParams diff = DiffMethodParams.builder() - .baseVersion("db84201eea9be107073fa07c24e30262ac91d384") - .nowVersion("dca3a374ba9100c64b970081fad5db7335e99ff6") - .gitUrl("https://github.com/rayduan/base-service.git") - .build(); - gitConfig.diffMethods(diff); - } +// gitConfig.diffMethods(diff); +// } } \ No newline at end of file diff --git a/application/src/test/java/com/dr/code/diff/vercontrol/SvnVersionControlTest.java b/application/src/test/java/com/dr/code/diff/vercontrol/SvnVersionControlTest.java new file mode 100644 index 0000000000000000000000000000000000000000..fac10b22d3865937a0cf18bed517d12ea3887d3a --- /dev/null +++ b/application/src/test/java/com/dr/code/diff/vercontrol/SvnVersionControlTest.java @@ -0,0 +1,34 @@ +package com.dr.code.diff.vercontrol; + +import com.dr.code.diff.CodeDiffApplicationTest; +import com.dr.code.diff.dto.VersionControlDto; +import com.dr.code.diff.vercontrol.svn.SvnVersionControl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @ProjectName: code-diff-parent + * @Package: com.dr.code.diff.vercontrol + * @Description: java类作用描述 + * @Author: duanrui + * @CreateDate: 2021/4/5 14:03 + * @Version: 1.0 + *

+ * Copyright: Copyright (c) 2021 + */ +class SvnVersionControlTest extends CodeDiffApplicationTest { + + @Autowired + private SvnVersionControl svnVersionControl; + + @Test + void getDiffCodeClasses() { +// VersionControlDto build = VersionControlDto.builder() +// .repoUrl("svn://192.168.75.130/svn/code/code-diif") +// .baseVersion("3") +// .nowVersion("5") +// .build(); +// svnVersionControl.setVersionControlDto(build); +// svnVersionControl.getDiffCodeClasses(); + } +} \ No newline at end of file