我们最近在做 SVN 仓库 web 可视化平台,即在网页上创建项目、给用户授权等等。
该项目目前昨天已经上线了
回顾一下用到的一些技术
最近几节会着重说明一下svnkit的常见用法
svnkit是一个开源的操作svn的jar包,能帮助我们直接执行 svn 命令,无论是本地操作,还是远程操作,都是可以执行
一、svnkit的依赖
<!-- 引入svnkit包 -->
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.10.1</version>
</dependency>
二、复制文件命令代码
我们的业务需求是创建项目时,自动在项目仓库里创建基线库、开发库的文件夹模板,这2个文件夹里也有其他文件夹
解决方案时把这个模板直接放到项目仓库里,然后类似通过 svn copy 的操作来复制过去。
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNCopySource;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author liuyanzhao
* @date 2021/12/20 10:02
*/
@Slf4j
public class SVNUtilDemo
{
public static ISVNOptions isvnOptions;
// 初始化
static
{
//1.根据访问协议初始化工厂
DAVRepositoryFactory.setup();
//2.使用默认选项
isvnOptions = SVNWCUtil.createDefaultOptions(true);
}
/**
* 复制文件夹
* 注意:支持多层文件夹创建,支持目标文件夹已存在不报错,支持一次复制多个文件夹
*
* @param username
* @param password
* @param sourceUrlList
* @param targetUrl
* @param message
* @throws SVNException
*/
public static void doCopy(String username, String password, List<String> sourceUrlList, String targetUrl, String message) throws Exception
{
try
{
//3.初始化权限
ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username, password.toCharArray());
//4.创建SVNClientManager的实例
SVNClientManager svnClientManager = SVNClientManager.newInstance(isvnOptions, isvnAuthenticationManager);
// 5.进行copy
SVNCopySource[] sources = new SVNCopySource[sourceUrlList.size()];
for (int i = 0; i < sourceUrlList.size(); i++)
{
sources[i] = new SVNCopySource(SVNRevision.HEAD, SVNRevision.HEAD, SVNURL.parseURIEncoded(sourceUrlList.get(i)));
}
svnClientManager.getCopyClient().doCopy(sources, SVNURL.parseURIEncoded(targetUrl),
false, true, false, message, new SVNProperties());
} catch (Exception e)
{
log.error("复制文件夹失败,username:{}, password:{}, sourceUrlList:{}, targetUrl:{}, message:{}, e:{}",
username, password, JSON.toJSONString(sourceUrlList), targetUrl, message, e);
throw new Exception("复制文件夹失败");
}
}
/**
* 功能说明:
* 将项目仓库里的模板/新建项目下面的2个文件夹 复制到 新项目测试1 目录下
* 对应命令 svn copy http://127.0.0.1/svn/项目/模板/新建项目/开发库 http://127.0.0.1/svn/项目/新项目测试1
*/
public static void main(String[] args) throws Exception
{
String username = "admin"; // svn账号
String password = "123456"; // svn密码
List<String> sourceList = new ArrayList<>(); // 复制文件源路径
sourceList.add("http://127.0.0.1/svn/项目/模板/新建项目/开发库");
sourceList.add("http://127.0.0.1/svn/项目/模板/新建项目/基线库");
String targetUrl = "http://127.0.0.1/svn/项目/新项目测试1"; // 复制文件目标路径
String message = "创建项目复制模板"; // commit提交信息
doCopy(username, password, sourceList, targetUrl, message);
}
}
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏