java工具箱-svnkit

495 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

svnkit简介

svnkit是一个发展很完善的java操作SVN的工具包,操作功能基本都支持。最新版是2022年8月发布的。

代码

Pom依赖

        <dependency>
            <groupId>org.tmatesoft.svnkit</groupId>
            <artifactId>svnkit</artifactId>
            <version>1.9.2</version>
        </dependency>
  1. 初始化仓库链接
    DAVRepositoryFactory.setup();
    SVNRepositoryFactoryImpl.setup();
    FSRepositoryFactory.setup();

    SVNRepository repository = SVNRepositoryFactory.
    create(SVNURL.parseURIEncoded("仓库路径"));

    ISVNAuthenticationManager authManager = SVNWCUtil.
    createDefaultAuthenticationManager("用户名","密码".toCharArray());

    repository.setAuthenticationManager(authManager);
  • DAVRepositoryFactory.setup:注册http协议链接至SVNRepositoryFactory
  • SVNRepositoryFactoryImpl.setup:注册svn协议链接至SVNRepositoryFactory
  • FSRepositoryFactory.setup:注册file协议链接至SVNRepositoryFactory

注册协议之后创建链接会依据不同协议创建不同的仓库处理类可通过查看SVNRepository子类找到,后面的就是正常的创建登陆认证并存储到仓库类中

  1. 获取目标日志
repository.log(new String[]{}, 0, -1, true, true,
        new ISVNLogEntryHandler() {
            public void handleLogEntry(SVNLogEntry svnlogentry)
                    throws SVNException {
                //过滤逻辑
                }
            }
        });

这里说明下api参数,从前往后分别是

  • targetPaths – 仅表示更改的那些修订的路径,通过路径过滤svn日志
  • startRevision – 开始的版本号,
  • endRevision – 结束于的版本号,-1表示取到最新版本
  • changedPath - 如果为真,则修订信息还将包括每个修订的所有更改路径,否则不
  • strictNode – 如果为true ,则不遍历复制历史记录(如果有)
  • ISVNLogEntryHandler.svnlogentry : 为具体的提交对象,包含备注,时间,创建人,版本,提交文件等信息

我这里的需求是期望获得关键任务之后是否有新提交的代码,在打包时产出提醒文件,并罗列对应提交记录的备注信息,所以多次查询检查提交记录,下面是具体代码仅供参考

Set<SVNLogEntry> logs = new LinkedHashSet<SVNLogEntry>();
repository.log(new String[]{}, 0, -1, true, true,
        new ISVNLogEntryHandler() {
            public void handleLogEntry(SVNLogEntry svnlogentry)
                    throws SVNException {
                String commitMsg = svnlogentry.getMessage();
                if ("通过提交备注过滤记录") {
                    logs.add(svnlogentry);
                }
            }
        });
for (SVNLogEntry log : logs) {
    final Date oldCommitDate = log.getDate();
    Set<String> keys = log.getChangedPaths().keySet();
    repository.log(keys.toArray(new String[keys.size()]), log.getRevision(), -1, true, true,
            new ISVNLogEntryHandler() {
                public void handleLogEntry(SVNLogEntry svnlogentry)
                        throws SVNException {
                    //处理逻辑
                }
            });
}

参考资料

svnkit.com/index.html

wiki.svnkit.com/