svn判断通过svnkit,获取最新的revision以及判断某个revsion是否存在

每日一贴,今天的内容关键字为svn判断

    在java下,已经有一个非常壮大的工具,svnkit,为我们封装了非常全面的svn操作类。但是,笔者在应用时,就碰到两个问题,还是略微琢磨了一阵子,才想到解决办法(我应用的是1.x版本的svnkit,不清楚2.x版本的,是否有更直接的方法)

    问题1:如何获得指定svn路径的最新revsion

    问题2:判断某svn路径下,某个revsion号是否存在

    讲这两个问题前,首先要理清Repository及revsion的概念。svn的核心是Repository(版本库),很多信息都是基于全部Repository来做记录的;revision则记录了每一次的commit操作,每当我们做一次commit操作,这个Repository的revsion就会增加1。所以revsion有时候也被称为svn版本号,因为通过这个revsion,可以指向具体某一次svn的变革。好吧,说了那么多,其实就是想说明图1的意思,

    假设你有一个Repository的svn路径是root/r,该Repository下有子路径root/r/r1,那么,如果你用svnkit来获得root/r/r1的最新revsion,它返回的是root/r的最新revsion,而不是root/r/r1的。你用其他工具,查看的历史变革记录,最新revsion明显是5,但svnkit返回给你的,却可能是7,就是这个原因。

    图1:对于r1目录,它是属于上一层的repository的,因此它的以后revision,也是7

    svn和判断

    问题1:

    基于图1,直接获得r1的revision,不能返回我们想要的值,而应该用getCommittedRevision()这个方法

    代码节选

rSVNURL epositoryBaseUrl = SVNURL.parseURIEncoded(svnPath);
SVNInfo info = client.doInfo(repositoryBaseUrl, SVNRevision.HEAD, SVNRevision.HEAD);
result = info.getCommittedRevision().getNumber();

    问题2:

    基于图1,用svnkit,指定svn路径为root/r/r1,revision为7,还是会有返回值,不会报错。这时候应该用另外一种思绪,如果7这个revision,是属于另外一个目录的变革,那么root/r/r1路径下,revsion为7的日记,就会是空的,这种情况,便可认为,7这个revisin,在root/r/r1下,是不存在的。

    代码节选

    类SimpleISVNLogEntryHandler,将svn log写入list这个变量

    每日一道理
站在历史的海岸漫溯那一道道历史沟渠:楚大夫沉吟泽畔,九死不悔;魏武帝扬鞭东指,壮心不已;陶渊明悠然南山,饮酒采菊……他们选择了永恒,纵然谄媚诬蔑视听,也不随其流扬其波,这是执著的选择;纵然马革裹尸,魂归狼烟,也要仰天长笑,这是豪壮的选择;纵然一身清苦,终日难饱,也愿怡然自乐,躬耕陇亩,这是高雅的选择。在一番选择中,帝王将相成其盖世伟业,贤士迁客成其千古文章。
public class SimpleISVNLogEntryHandler implements ISVNLogEntryHandler
{
     public List<SVNLogEntry> list = new ArrayList<SVNLogEntry>();


     @Override
     public void handleLogEntry(SVNLogEntry logEntry) throws SVNException
     {
          System.out.println(logEntry.getDate());
          list.add(logEntry);
     }

}

    判断变革日记是否为空

try
{
     SimpleISVNLogEntryHandler handler = new SimpleISVNLogEntryHandler();
     SVNRevision r = SVNRevision.create(revisionNum);
     repositoryBaseUrl = SVNURL.parseURIEncoded(svnPath);
     logClient.doLog(repositoryBaseUrl, new String[] {}, r, r, r, false, false, true, 1, new String[] {}, handler);
     if (null != handler.list && handler.list.size() > 0)
     {
          result = Constant.REVISION_EXIST;
     }
     else
     {
          result = Constant.REVISION_NOT_EXIST;
     }


}
catch (SVNException e)
{
     logger.error("SvnManageOperation.isFileExit error", e.getMessage());
     logger.error("error code:" + e.getErrorMessage().getErrorCode().getCode());
     if (e.getErrorMessage().getErrorCode().getCode() == 160006)
     {
          result = Constant.REVISION_NOT_EXIST;
     }
}

    说明1:revisionNum下,没有log,那么handler.list.size() == 0

    说明2:如果该revisionNum在全部Repository都不存在,是会抛SVNException的,对应的错误码160006表示revision不存在

文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World

--------------------------------- 原创文章 By
svn和判断
---------------------------------

posted @ 2013-05-27 20:09  坚固66  阅读(1016)  评论(0编辑  收藏  举报