zoukankan      html  css  js  c++  java
  • 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和判断
    ---------------------------------

  • 相关阅读:
    使用某些 DOCTYPE 时会导致 document.body.scrollTop 失效
    VB.NET 笔记1
    知识管理系统Data Solution研发日记之一 场景设计与需求列出
    知识管理系统Data Solution研发日记之五 网页下载,转换,导入
    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
    分享制作精良的知识管理系统 博客园博客备份程序 Site Rebuild
    知识管理系统Data Solution研发日记之四 片段式数据解决方案
    知识管理系统Data Solution研发日记之二 应用程序系列
    知识管理系统Data Solution研发日记之七 源代码与解决方案
    知识管理系统Data Solution研发日记之三 文档解决方案
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3102384.html
Copyright © 2011-2022 走看看