亲测成功!!!
接上一篇文章,放在一起做个分类。
实现效果:主要针对项目业务中,对代码上传方式Git/SVN的更新操作。做到当SVN仓库中出现版本提交时,将差异文件保存到本地。
之前接触的都是手动idea进行差异文件对比,还真没有通过代码的方式来读取过,经过实践成功读取差异文件,分享出来,大家一起学习,欢迎提出建议问题!!!
一、依赖
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.10.9</version>
</dependency>
二、业务逻辑
1. 首先将代码克隆到本地/opt/code目录下(我这里放到的是/opt/code);
2. 获取两次版本的id;
3. 比较不同版本之间的差异文件;
三、整体代码
@Test
public void test() {
// 初始化数据
String localPath = "/opt/code"; //本地存放代码地址
String svnUrl = "https://127.0.0.1:9999/svn/code";//git远程地址
String username = "admin";//SVN远程地址账户
String password = "admin";//SVN远程地址密码
// 初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
// 相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded(svnUrl);
} catch (Exception e) {
}
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
// 实例化客户端管理类
SVNClientManager clientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, username, password);
// 1.首先将代码克隆到本地/opt/code目录下 (克隆位置自行选择)
File wcDir = new File(localPath);
SVNUtil.checkout(clientManager, repositoryURL, SVNRevision.HEAD, wcDir,
SVNDepth.INFINITY);
// 2.获取两次版本的id
//记录第一次拉取的版本
long oldVersion = getVersion(localPath);
//更新本地代码(SVN仓库最新的代码)
SVNUtil.update(clientManager, wcDir, SVNRevision.HEAD, SVNDepth.INFINITY);
//记录第二次拉取的版本
long newVersion = getVersion(localPath);
//3. 比较不同版本之间的差异文件
try {
SVNDiffClient diffClient = clientManager.getDiffClient();
SVNDiffStatusHandler diffStatusHandler = new SVNDiffStatusHandler();
diffClient.doDiffStatus(SVNURL.parseURIEncoded(svnUrl), SVNRevision.create(oldVersion),SVNURL.parseURIEncoded(svnUrl) , SVNRevision.create(newVersion), SVNDepth.INFINITY, false, diffStatusHandler);
List<String> diffFiles = diffStatusHandler.getPathList();
if (!diffFiles.isEmpty()) {
for (String diffFile : diffFiles) {
System.out.println("差异文件:" + diffFile);
//后续逻辑根据具体需求,自行添加
}
}
} catch (SVNException e) {
e.printStackTrace();
}
}
四、引用方法
/**
* 创建 SVNDiffStatusHandler
*/
private static class SVNDiffStatusHandler implements ISVNDiffStatusHandler {
List<String> pathList= new ArrayList<>();
@Override
public void handleDiffStatus(SVNDiffStatus diffStatus) throws SVNException {
if (diffStatus.getModificationType() != SVNStatusType.STATUS_NORMAL) {
pathList.add(diffStatus.getPath());
}
}
public List<String> getPathList(){
return pathList;
}
}
/**
* 获取代码的最新提交ID
*/
private static long getVersion(String srcPath){
SVNClientManager svnClientManager = SVNClientManager.newInstance(new DefaultSVNOptions());
SVNStatus svnStatus = null;
try {
svnStatus = svnClientManager.getStatusClient().doStatus(new File(srcPath), false);
} catch (SVNException e) {
e.printStackTrace();
}
return svnStatus.getRevision().getNumber();
}
希望大家一起交流,有问题或者有什么建议大家一起交流!!!