zoukankan      html  css  js  c++  java
  • svn判断通过svnkit,获取最新的revision以及判断某个revsion是否存在

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

        在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不存在

    文章结束给大家分享下程序员的一些笑话语录: 刹车失灵
    有一个物理学家,工程师和一个程序员驾驶着一辆汽车行驶在阿尔卑斯山脉 上,在下山的时候,忽然,汽车的刹车失灵了,汽车无法控制地向下冲去, 眼看前面就是一个悬崖峭壁,但是很幸运的是在这个悬崖的前面有一些小树 让他们的汽车停了下来, 而没有掉下山去。 三个惊魂未定地从车里爬了出来。
    物理学家说, “我觉得我们应该建立一个模型来模拟在下山过程中刹车片在高 温情况下失灵的情形”。
    工程师说, “我在车的后备厢来有个扳手, 要不我们把车拆开看看到底是什么 原因”。
    程序员说,“为什么我们不找个相同的车再来一次以重现这个问题呢?”

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

  • 相关阅读:
    【Maven】项目打包-war包-Jar包[IDEA将项目打成war包]
    intellij idea 配置web 项目
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    shell-运算符
    shell-流程控制
    shell-流程控制
    shell-变量,字符串,数组,注释,参数传递
    shell-变量,字符串,数组,注释,参数传递
    json解析
    json解析
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3100580.html
Copyright © 2011-2022 走看看